* [PATCH 25/25] x32: Remove unused getcpu implementation
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-12-01 14:49 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 23/25] sparc: refactor cpu_relax to C Adhemerval Zanella
` (24 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
Checked on x86_64-linux-gnu-x32.
* sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 2 ++
sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c | 32 -----------------------------
2 files changed, 2 insertions(+), 32 deletions(-)
delete mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c b/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
deleted file mode 100644
index cd26d2e..0000000
--- a/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
+++ /dev/null
@@ -1,32 +0,0 @@
-/* Copyright (C) 2012-2017 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/>. */
-
-#ifdef SHARED
-# include <dl-vdso.h>
-
-void *getcpu_ifunc (void) __asm__ ("__getcpu");
-
-void *
-inhibit_stack_protector
-getcpu_ifunc (void)
-{
- PREPARE_VERSION (linux26, "LINUX_2.6", 61765110);
-
- return _dl_vdso_vsym ("__vdso_getcpu", &linux26);
-}
-__asm (".type __getcpu, %gnu_indirect_function");
-#endif
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 25/25] x32: Remove unused getcpu implementation
2017-10-26 19:07 ` [PATCH 25/25] x32: Remove unused getcpu implementation Adhemerval Zanella
@ 2017-12-01 14:49 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-12-01 14:49 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> Checked on x86_64-linux-gnu-x32.
>
> * sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 2 ++
> sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c | 32 -----------------------------
> 2 files changed, 2 insertions(+), 32 deletions(-)
> delete mode 100644 sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c b/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
> deleted file mode 100644
> index cd26d2e..0000000
> --- a/sysdeps/unix/sysv/linux/x86_64/x32/getcpu.c
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -/* Copyright (C) 2012-2017 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/>. */
> -
> -#ifdef SHARED
> -# include <dl-vdso.h>
> -
> -void *getcpu_ifunc (void) __asm__ ("__getcpu");
> -
> -void *
> -inhibit_stack_protector
> -getcpu_ifunc (void)
> -{
> - PREPARE_VERSION (linux26, "LINUX_2.6", 61765110);
> -
> - return _dl_vdso_vsym ("__vdso_getcpu", &linux26);
> -}
> -__asm (".type __getcpu, %gnu_indirect_function");
> -#endif
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 23/25] sparc: refactor cpu_relax to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 25/25] x32: Remove unused getcpu implementation Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 24/25] sparc: Remove ununsed ifunc assembly macros Adhemerval Zanella
` (23 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
* sysdeps/sparc/sparc64/cpu_relax.c: New file.
* sysdeps/sparc/sparc32/sparcv9/cpu_relax.c: Likewise.
* sysdeps/sparc/sparc64/cpu_relax.S: Remove file.
* sysdeps/sparc/sparc32/sparcv9/cpu_relax.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 5 +++
sysdeps/sparc/sparc32/sparcv9/cpu_relax.S | 1 -
sysdeps/sparc/sparc32/sparcv9/cpu_relax.c | 1 +
sysdeps/sparc/sparc64/cpu_relax.S | 67 -------------------------------
sysdeps/sparc/sparc64/cpu_relax.c | 38 ++++++++++++++++++
5 files changed, 44 insertions(+), 68 deletions(-)
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
delete mode 100644 sysdeps/sparc/sparc64/cpu_relax.S
create mode 100644 sysdeps/sparc/sparc64/cpu_relax.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
deleted file mode 100644
index 41a5e72..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/sparc/sparc64/cpu_relax.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
new file mode 100644
index 0000000..1670cf6
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/cpu_relax.c>
diff --git a/sysdeps/sparc/sparc64/cpu_relax.S b/sysdeps/sparc/sparc64/cpu_relax.S
deleted file mode 100644
index 5271164..0000000
--- a/sysdeps/sparc/sparc64/cpu_relax.S
+++ /dev/null
@@ -1,67 +0,0 @@
-/* CPU strand yielding for busy loops.
- Copyright (C) 2012-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
- .text
-__cpu_relax_generic:
- rd %ccr, %g0
- rd %ccr, %g0
- rd %ccr, %g0
- retl
- nop
- .size __cpu_relax_generic,.-__cpu_relax_generic
-
-__cpu_relax_pause:
- wr %g0, 128, %asr27
- retl
- nop
- .size __cpu_relax_pause,.-__cpu_relax_pause
-
-ENTRY(__cpu_relax)
- .type __cpu_relax, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_PAUSE, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__cpu_relax_pause), %o1
- xor %o1, %gdop_lox10(__cpu_relax_pause), %o1
-# else
- set __cpu_relax_pause, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__cpu_relax_generic), %o1
- xor %o1, %gdop_lox10(__cpu_relax_generic), %o1
-# else
- set __cpu_relax_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__cpu_relax)
diff --git a/sysdeps/sparc/sparc64/cpu_relax.c b/sysdeps/sparc/sparc64/cpu_relax.c
new file mode 100644
index 0000000..388e76c
--- /dev/null
+++ b/sysdeps/sparc/sparc64/cpu_relax.c
@@ -0,0 +1,38 @@
+/* CPU strand yielding for busy loops. Linux/sparc64 version.
+ Copyright (C) 2017 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 <sparc-ifunc.h>
+
+static void
+__cpu_relax_generic (void)
+{
+ asm volatile ("rd %ccr, %g0;"
+ "rd %ccr, %g0;"
+ "rd %ccr, %g0");
+}
+
+static void
+__cpu_relax_pause (void)
+{
+ asm volatile ("wr %g0, 128, %asr27;");
+}
+
+sparc_libc_ifunc (__cpu_relax,
+ hwcap & HWCAP_SPARC_PAUSE
+ ? __cpu_relax_pause
+ : __cpu_relax_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 23/25] sparc: refactor cpu_relax to C
2017-10-26 19:07 ` [PATCH 23/25] sparc: refactor cpu_relax to C Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> * sysdeps/sparc/sparc64/cpu_relax.c: New file.
> * sysdeps/sparc/sparc32/sparcv9/cpu_relax.c: Likewise.
> * sysdeps/sparc/sparc64/cpu_relax.S: Remove file.
> * sysdeps/sparc/sparc32/sparcv9/cpu_relax.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 5 +++
> sysdeps/sparc/sparc32/sparcv9/cpu_relax.S | 1 -
> sysdeps/sparc/sparc32/sparcv9/cpu_relax.c | 1 +
> sysdeps/sparc/sparc64/cpu_relax.S | 67 -------------------------------
> sysdeps/sparc/sparc64/cpu_relax.c | 38 ++++++++++++++++++
> 5 files changed, 44 insertions(+), 68 deletions(-)
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
> delete mode 100644 sysdeps/sparc/sparc64/cpu_relax.S
> create mode 100644 sysdeps/sparc/sparc64/cpu_relax.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
> deleted file mode 100644
> index 41a5e72..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/sparc/sparc64/cpu_relax.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
> new file mode 100644
> index 0000000..1670cf6
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
> @@ -0,0 +1 @@
> +#include <sysdeps/sparc/sparc64/cpu_relax.c>
> diff --git a/sysdeps/sparc/sparc64/cpu_relax.S b/sysdeps/sparc/sparc64/cpu_relax.S
> deleted file mode 100644
> index 5271164..0000000
> --- a/sysdeps/sparc/sparc64/cpu_relax.S
> +++ /dev/null
> @@ -1,67 +0,0 @@
> -/* CPU strand yielding for busy loops.
> - Copyright (C) 2012-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> - .text
> -__cpu_relax_generic:
> - rd %ccr, %g0
> - rd %ccr, %g0
> - rd %ccr, %g0
> - retl
> - nop
> - .size __cpu_relax_generic,.-__cpu_relax_generic
> -
> -__cpu_relax_pause:
> - wr %g0, 128, %asr27
> - retl
> - nop
> - .size __cpu_relax_pause,.-__cpu_relax_pause
> -
> -ENTRY(__cpu_relax)
> - .type __cpu_relax, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_PAUSE, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__cpu_relax_pause), %o1
> - xor %o1, %gdop_lox10(__cpu_relax_pause), %o1
> -# else
> - set __cpu_relax_pause, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__cpu_relax_generic), %o1
> - xor %o1, %gdop_lox10(__cpu_relax_generic), %o1
> -# else
> - set __cpu_relax_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__cpu_relax)
> diff --git a/sysdeps/sparc/sparc64/cpu_relax.c b/sysdeps/sparc/sparc64/cpu_relax.c
> new file mode 100644
> index 0000000..388e76c
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/cpu_relax.c
> @@ -0,0 +1,38 @@
> +/* CPU strand yielding for busy loops. Linux/sparc64 version.
> + Copyright (C) 2017 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 <sparc-ifunc.h>
> +
> +static void
> +__cpu_relax_generic (void)
> +{
> + asm volatile ("rd %ccr, %g0;"
> + "rd %ccr, %g0;"
> + "rd %ccr, %g0");
> +}
> +
> +static void
> +__cpu_relax_pause (void)
> +{
> + asm volatile ("wr %g0, 128, %asr27;");
> +}
> +
> +sparc_libc_ifunc (__cpu_relax,
> + hwcap & HWCAP_SPARC_PAUSE
> + ? __cpu_relax_pause
> + : __cpu_relax_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 24/25] sparc: Remove ununsed ifunc assembly macros
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 25/25] x32: Remove unused getcpu implementation Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 23/25] sparc: refactor cpu_relax to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-12-01 14:49 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 17/25] sparc: refactor sparc64 __mpn_add_n selector to C Adhemerval Zanella
` (22 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
* sysdeps/sparc/sparc-ifunc.h (SPARC_ASM_IFUNC_DFLT,
SPARC_ASM_IFUNC1, SPARC_ASM_IFUNC2, SET, SPARC_ASM_VIS2_IFUNC,
SPARC_ASM_VIS3_IFUNC, SPARC_ASM_VIS3_VIS2_IFUNC): Remove macros.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 4 ++
sysdeps/sparc/sparc-ifunc.h | 154 ++++----------------------------------------
2 files changed, 15 insertions(+), 143 deletions(-)
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
index 4a68cf1..69951e7 100644
--- a/sysdeps/sparc/sparc-ifunc.h
+++ b/sysdeps/sparc/sparc-ifunc.h
@@ -17,157 +17,25 @@
#include <sysdep.h>
-#ifdef __ASSEMBLER__
+#define INIT_ARCH()
-# ifdef SHARED
-
-# define SPARC_ASM_IFUNC_DFLT(name, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- SETUP_PIC_REG_LEAF(o3, o5); \
- sethi %gdop_hix22(dflt), %o1; \
- xor %o1, %gdop_lox10(dflt), %o1; \
- add %o3, %o1, %o1; \
- retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# define SPARC_ASM_IFUNC1(name, m1, f1, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- SETUP_PIC_REG_LEAF(o3, o5); \
- set m1, %o1; \
- andcc %o0, %o1, %g0; \
- be 9f; \
- nop; \
- sethi %gdop_hix22(f1), %o1; \
- xor %o1, %gdop_lox10(f1), %o1; \
- ba 10f; \
- nop; \
-9: sethi %gdop_hix22(dflt), %o1; \
- xor %o1, %gdop_lox10(dflt), %o1; \
-10: add %o3, %o1, %o1; \
- retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# define SPARC_ASM_IFUNC2(name, m1, f1, m2, f2, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- SETUP_PIC_REG_LEAF(o3, o5); \
- set m1, %o1; \
- andcc %o0, %o1, %g0; \
- be 8f; \
- nop; \
- sethi %gdop_hix22(f1), %o1; \
- xor %o1, %gdop_lox10(f1), %o1; \
- ba 10f; \
- nop; \
-8: set m2, %o1; \
- andcc %o0, %o1, %g0; \
- be 9f; \
- nop; \
- sethi %gdop_hix22(f2), %o1; \
- xor %o1, %gdop_lox10(f2), %o1; \
- ba 10f; \
- nop; \
-9: sethi %gdop_hix22(dflt), %o1; \
- xor %o1, %gdop_lox10(dflt), %o1; \
-10: add %o3, %o1, %o1; \
- retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# else /* SHARED */
-
-# ifdef __arch64__
-# define SET(SYM, TMP, REG) setx SYM, TMP, REG
-# else
-# define SET(SYM, TMP, REG) set SYM, REG
-# endif
-
-# define SPARC_ASM_IFUNC_DFLT(name, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- SET(dflt, %g1, %o1); \
- retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# define SPARC_ASM_IFUNC1(name, m1, f1, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- set m1, %o1; \
- andcc %o0, %o1, %g0; \
- be 9f; \
- nop; \
- SET(f1, %g1, %o1); \
- ba 10f; \
- nop; \
-9: SET(dflt, %g1, %o1); \
-10: retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# define SPARC_ASM_IFUNC2(name, m1, f1, m2, f2, dflt) \
-ENTRY (__##name) \
- .type __##name, @gnu_indirect_function; \
- set m1, %o1; \
- andcc %o0, %o1, %g0; \
- be 8f; \
- nop; \
- SET(f1, %g1, %o1); \
- ba 10f; \
- nop; \
-8: set m2, %o1; \
- andcc %o0, %o1, %g0; \
- be 9f; \
- nop; \
- SET(f2, %g1, %o1); \
- ba 10f; \
- nop; \
-9: SET(dflt, %g1, %o1); \
-10: retl; \
- mov %o1, %o0; \
-END (__##name)
-
-# endif /* SHARED */
-
-#define SPARC_ASM_VIS2_IFUNC(name) \
- SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS2, \
- __##name##_vis2, __##name##_generic)
-
-#define SPARC_ASM_VIS3_IFUNC(name) \
- SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS3, \
- __##name##_vis3, __##name##_generic)
-
-#define SPARC_ASM_VIS3_VIS2_IFUNC(name) \
- SPARC_ASM_IFUNC2(name, HWCAP_SPARC_VIS3, \
- __##name##_vis3, \
- HWCAP_SPARC_VIS2, \
- __##name##_vis2, __##name##_generic)
-
-#else /* __ASSEMBLER__ */
-# define INIT_ARCH()
-
-# define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
+#define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
__ifunc (redirected_name, name, expr(hwcap), int hwcap, INIT_ARCH)
-# define sparc_libm_ifunc(name, expr) \
- __ifunc (name, name, expr, int hwcap, libm_ifunc_init)
+#define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
-# define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
+#define sparc_libm_ifunc(name, expr) \
+ __ifunc (name, name, expr, int hwcap, libm_ifunc_init)
-# define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
+#define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
__ifunc (redirected_name, name, expr, int hwcap, libm_ifunc_init)
/* It essentially does libc_hidden_builtin_def (name) and redirect
the internal redirected symbol to ifunc implementation. */
-# if defined SHARED
-# define sparc_ifunc_redirected_hidden_def(redirect_name, name) \
+#if defined SHARED
+# define sparc_ifunc_redirected_hidden_def(redirect_name, name) \
__hidden_ver1 (name, __GI_##name, redirect_name) \
__attribute__ ((visibility ("hidden")));
-# else
-# define sparc_ifunc_redirected_hidden_def(redirect_name, name)
-# endif
-#endif /* __ASSEMBLER__ */
+#else
+# define sparc_ifunc_redirected_hidden_def(redirect_name, name)
+#endif
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 24/25] sparc: Remove ununsed ifunc assembly macros
2017-10-26 19:07 ` [PATCH 24/25] sparc: Remove ununsed ifunc assembly macros Adhemerval Zanella
@ 2017-12-01 14:49 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-12-01 14:49 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> * sysdeps/sparc/sparc-ifunc.h (SPARC_ASM_IFUNC_DFLT,
> SPARC_ASM_IFUNC1, SPARC_ASM_IFUNC2, SET, SPARC_ASM_VIS2_IFUNC,
> SPARC_ASM_VIS3_IFUNC, SPARC_ASM_VIS3_VIS2_IFUNC): Remove macros.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 4 ++
> sysdeps/sparc/sparc-ifunc.h | 154 ++++----------------------------------------
> 2 files changed, 15 insertions(+), 143 deletions(-)
>
> diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
> index 4a68cf1..69951e7 100644
> --- a/sysdeps/sparc/sparc-ifunc.h
> +++ b/sysdeps/sparc/sparc-ifunc.h
> @@ -17,157 +17,25 @@
>
> #include <sysdep.h>
>
> -#ifdef __ASSEMBLER__
> +#define INIT_ARCH()
>
> -# ifdef SHARED
> -
> -# define SPARC_ASM_IFUNC_DFLT(name, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - SETUP_PIC_REG_LEAF(o3, o5); \
> - sethi %gdop_hix22(dflt), %o1; \
> - xor %o1, %gdop_lox10(dflt), %o1; \
> - add %o3, %o1, %o1; \
> - retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# define SPARC_ASM_IFUNC1(name, m1, f1, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - SETUP_PIC_REG_LEAF(o3, o5); \
> - set m1, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 9f; \
> - nop; \
> - sethi %gdop_hix22(f1), %o1; \
> - xor %o1, %gdop_lox10(f1), %o1; \
> - ba 10f; \
> - nop; \
> -9: sethi %gdop_hix22(dflt), %o1; \
> - xor %o1, %gdop_lox10(dflt), %o1; \
> -10: add %o3, %o1, %o1; \
> - retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# define SPARC_ASM_IFUNC2(name, m1, f1, m2, f2, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - SETUP_PIC_REG_LEAF(o3, o5); \
> - set m1, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 8f; \
> - nop; \
> - sethi %gdop_hix22(f1), %o1; \
> - xor %o1, %gdop_lox10(f1), %o1; \
> - ba 10f; \
> - nop; \
> -8: set m2, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 9f; \
> - nop; \
> - sethi %gdop_hix22(f2), %o1; \
> - xor %o1, %gdop_lox10(f2), %o1; \
> - ba 10f; \
> - nop; \
> -9: sethi %gdop_hix22(dflt), %o1; \
> - xor %o1, %gdop_lox10(dflt), %o1; \
> -10: add %o3, %o1, %o1; \
> - retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# else /* SHARED */
> -
> -# ifdef __arch64__
> -# define SET(SYM, TMP, REG) setx SYM, TMP, REG
> -# else
> -# define SET(SYM, TMP, REG) set SYM, REG
> -# endif
> -
> -# define SPARC_ASM_IFUNC_DFLT(name, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - SET(dflt, %g1, %o1); \
> - retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# define SPARC_ASM_IFUNC1(name, m1, f1, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - set m1, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 9f; \
> - nop; \
> - SET(f1, %g1, %o1); \
> - ba 10f; \
> - nop; \
> -9: SET(dflt, %g1, %o1); \
> -10: retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# define SPARC_ASM_IFUNC2(name, m1, f1, m2, f2, dflt) \
> -ENTRY (__##name) \
> - .type __##name, @gnu_indirect_function; \
> - set m1, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 8f; \
> - nop; \
> - SET(f1, %g1, %o1); \
> - ba 10f; \
> - nop; \
> -8: set m2, %o1; \
> - andcc %o0, %o1, %g0; \
> - be 9f; \
> - nop; \
> - SET(f2, %g1, %o1); \
> - ba 10f; \
> - nop; \
> -9: SET(dflt, %g1, %o1); \
> -10: retl; \
> - mov %o1, %o0; \
> -END (__##name)
> -
> -# endif /* SHARED */
> -
> -#define SPARC_ASM_VIS2_IFUNC(name) \
> - SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS2, \
> - __##name##_vis2, __##name##_generic)
> -
> -#define SPARC_ASM_VIS3_IFUNC(name) \
> - SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS3, \
> - __##name##_vis3, __##name##_generic)
> -
> -#define SPARC_ASM_VIS3_VIS2_IFUNC(name) \
> - SPARC_ASM_IFUNC2(name, HWCAP_SPARC_VIS3, \
> - __##name##_vis3, \
> - HWCAP_SPARC_VIS2, \
> - __##name##_vis2, __##name##_generic)
> -
> -#else /* __ASSEMBLER__ */
> -# define INIT_ARCH()
> -
> -# define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
> +#define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
> __ifunc (redirected_name, name, expr(hwcap), int hwcap, INIT_ARCH)
>
> -# define sparc_libm_ifunc(name, expr) \
> - __ifunc (name, name, expr, int hwcap, libm_ifunc_init)
> +#define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
>
> -# define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
> +#define sparc_libm_ifunc(name, expr) \
> + __ifunc (name, name, expr, int hwcap, libm_ifunc_init)
>
> -# define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
> +#define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
> __ifunc (redirected_name, name, expr, int hwcap, libm_ifunc_init)
>
> /* It essentially does libc_hidden_builtin_def (name) and redirect
> the internal redirected symbol to ifunc implementation. */
> -# if defined SHARED
> -# define sparc_ifunc_redirected_hidden_def(redirect_name, name) \
> +#if defined SHARED
> +# define sparc_ifunc_redirected_hidden_def(redirect_name, name) \
> __hidden_ver1 (name, __GI_##name, redirect_name) \
> __attribute__ ((visibility ("hidden")));
> -# else
> -# define sparc_ifunc_redirected_hidden_def(redirect_name, name)
> -# endif
> -#endif /* __ASSEMBLER__ */
> +#else
> +# define sparc_ifunc_redirected_hidden_def(redirect_name, name)
> +#endif
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 17/25] sparc: refactor sparc64 __mpn_add_n selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (2 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 24/25] sparc: Remove ununsed ifunc assembly macros Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 13:09 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 04/25] sparc: Implement memset/bzero ifunc selection in C Adhemerval Zanella
` (21 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
add_n-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
Add add_n-generic.
* sysdeps/sparc/sparc64/multiarch/add_n-generic.S: New file.
* sysdeps/sparc/sparc64/multiarch/add_n.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/add_n.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 6 +++
sysdeps/sparc/sparc64/multiarch/Makefile | 4 +-
sysdeps/sparc/sparc64/multiarch/add_n-generic.S | 2 +
sysdeps/sparc/sparc64/multiarch/add_n.S | 56 -------------------------
sysdeps/sparc/sparc64/multiarch/add_n.c | 28 +++++++++++++
5 files changed, 38 insertions(+), 58 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n-generic.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.c
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index d62a509..ba8ede1 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -14,8 +14,8 @@ endif
ifeq ($(subdir),stdlib)
sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
- submul_1-vis3 submul_1-generic add_n-vis3 sub_n-vis3 \
- sub_n-generic
+ submul_1-vis3 submul_1-generic add_n-vis3 add_n-generic \
+ sub_n-vis3 sub_n-generic
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/sparc/sparc64/multiarch/add_n-generic.S b/sysdeps/sparc/sparc64/multiarch/add_n-generic.S
new file mode 100644
index 0000000..a16e709
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/add_n-generic.S
@@ -0,0 +1,2 @@
+#define __mpn_add_n __mpn_add_n_generic
+#include <sysdeps/sparc/sparc64/add_n.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/add_n.S b/sysdeps/sparc/sparc64/multiarch/add_n.S
deleted file mode 100644
index 9ffaf78..0000000
--- a/sysdeps/sparc/sparc64/multiarch/add_n.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Multiple versions of add_n
-
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-ENTRY(__mpn_add_n)
- .type __mpn_add_n, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_VIS3, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_add_n_vis3), %o1
- xor %o1, %gdop_lox10(__mpn_add_n_vis3), %o1
-# else
- set __mpn_add_n_vis3, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_add_n_generic), %o1
- xor %o1, %gdop_lox10(__mpn_add_n_generic), %o1
-# else
- set __mpn_add_n_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mpn_add_n)
-
-#define __mpn_add_n __mpn_add_n_generic
-#include "../add_n.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/add_n.c b/sysdeps/sparc/sparc64/multiarch/add_n.c
new file mode 100644
index 0000000..6b509d1
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/add_n.c
@@ -0,0 +1,28 @@
+/* __mpn_add_n ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <gmp.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (mpn_add_n) __mpn_add_n_vis3 attribute_hidden;
+extern __typeof (mpn_add_n) __mpn_add_n_generic attribute_hidden;
+
+sparc_libm_ifunc (__mpn_add_n,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __mpn_add_n_vis3
+ : __mpn_add_n_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 17/25] sparc: refactor sparc64 __mpn_add_n selector to C
2017-10-26 19:07 ` [PATCH 17/25] sparc: refactor sparc64 __mpn_add_n selector to C Adhemerval Zanella
@ 2017-11-30 13:09 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 13:09 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> add_n-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
> Add add_n-generic.
> * sysdeps/sparc/sparc64/multiarch/add_n-generic.S: New file.
> * sysdeps/sparc/sparc64/multiarch/add_n.c: Likewise.
> * sysdeps/sparc/sparc64/multiarch/add_n.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 6 +++
> sysdeps/sparc/sparc64/multiarch/Makefile | 4 +-
> sysdeps/sparc/sparc64/multiarch/add_n-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/add_n.S | 56 -------------------------
> sysdeps/sparc/sparc64/multiarch/add_n.c | 28 +++++++++++++
> 5 files changed, 38 insertions(+), 58 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.c
>
> diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
> index d62a509..ba8ede1 100644
> --- a/sysdeps/sparc/sparc64/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/multiarch/Makefile
> @@ -14,8 +14,8 @@ endif
>
> ifeq ($(subdir),stdlib)
> sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
> - submul_1-vis3 submul_1-generic add_n-vis3 sub_n-vis3 \
> - sub_n-generic
> + submul_1-vis3 submul_1-generic add_n-vis3 add_n-generic \
> + sub_n-vis3 sub_n-generic
> endif
>
> ifeq ($(subdir),math)
> diff --git a/sysdeps/sparc/sparc64/multiarch/add_n-generic.S b/sysdeps/sparc/sparc64/multiarch/add_n-generic.S
> new file mode 100644
> index 0000000..a16e709
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/add_n-generic.S
> @@ -0,0 +1,2 @@
> +#define __mpn_add_n __mpn_add_n_generic
> +#include <sysdeps/sparc/sparc64/add_n.S>
> diff --git a/sysdeps/sparc/sparc64/multiarch/add_n.S b/sysdeps/sparc/sparc64/multiarch/add_n.S
> deleted file mode 100644
> index 9ffaf78..0000000
> --- a/sysdeps/sparc/sparc64/multiarch/add_n.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/* Multiple versions of add_n
> -
> - Copyright (C) 2013-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> -ENTRY(__mpn_add_n)
> - .type __mpn_add_n, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_VIS3, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_add_n_vis3), %o1
> - xor %o1, %gdop_lox10(__mpn_add_n_vis3), %o1
> -# else
> - set __mpn_add_n_vis3, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_add_n_generic), %o1
> - xor %o1, %gdop_lox10(__mpn_add_n_generic), %o1
> -# else
> - set __mpn_add_n_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__mpn_add_n)
> -
> -#define __mpn_add_n __mpn_add_n_generic
> -#include "../add_n.S"
> diff --git a/sysdeps/sparc/sparc64/multiarch/add_n.c b/sysdeps/sparc/sparc64/multiarch/add_n.c
> new file mode 100644
> index 0000000..6b509d1
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/add_n.c
> @@ -0,0 +1,28 @@
> +/* __mpn_add_n ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <gmp.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (mpn_add_n) __mpn_add_n_vis3 attribute_hidden;
> +extern __typeof (mpn_add_n) __mpn_add_n_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__mpn_add_n,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __mpn_add_n_vis3
> + : __mpn_add_n_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 04/25] sparc: Implement memset/bzero ifunc selection in C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (3 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 17/25] sparc: refactor sparc64 __mpn_add_n selector to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 13/25] sparc: refactor sparc64 __mpn_mul_1 selector to C Adhemerval Zanella
` (20 subsequent siblings)
25 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactor the SPARC64 ifunc selector to a C implementation.
No functional change is expected, including ifunc resolution rules.
Checked on sparc64-linux-gnu, sparcv9-linux-gnu and x86_64-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
[$(subdir) = string] (sysdep_routines): Add memset-ultra1.
* sysdeps/sparc/sparc64/multiarch/Makefile [$(subdir) = string]
(sysdep_routines): Add memset-ultra1.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/ifunc-memset.h: Likewise.
* sysdeps/sparc/sparc64/multiarch/memset-ultra1.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memset.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S: Remove file.
* sysdeps/sparc/sparc64/multiarch/memset.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 13 +++
sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile | 2 +-
.../sparc32/sparcv9/multiarch/memset-ultra1.S | 30 +++++
sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S | 4 -
sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c | 1 +
sysdeps/sparc/sparc64/multiarch/Makefile | 2 +-
sysdeps/sparc/sparc64/multiarch/ifunc-memset.h | 34 ++++++
sysdeps/sparc/sparc64/multiarch/memset-ultra1.S | 31 ++++++
sysdeps/sparc/sparc64/multiarch/memset.S | 124 ---------------------
sysdeps/sparc/sparc64/multiarch/memset.c | 42 +++++++
10 files changed, 153 insertions(+), 130 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
create mode 100644 sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/memset.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/memset.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
index ca44798..e12636b 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
@@ -9,5 +9,5 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
memset-niagara1 memcpy-niagara4 memset-niagara4 \
- memcpy-ultra1
+ memcpy-ultra1 memset-ultra1
endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
new file mode 100644
index 0000000..0cb71a9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
@@ -0,0 +1,30 @@
+/* Default SPARC64 memset implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+
+# define memset __memset_ultra1
+# define __bzero __bzero_ultra1
+#include <sysdeps/sparc/sparc32/sparcv9/memset.S>
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
deleted file mode 100644
index 8f82643..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ASI_PNF 0x82
-#define ASI_BLK_P 0xf0
-#define XCC icc
-#include <sparc64/multiarch/memset.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
new file mode 100644
index 0000000..a6c5734
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/memset.c>
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 4e52526..6e90cba 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -9,7 +9,7 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
memset-niagara1 memcpy-niagara4 memset-niagara4 \
- memcpy-ultra1
+ memcpy-ultra1 memset-ultra1
endif
ifeq ($(subdir),stdlib)
diff --git a/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h b/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
new file mode 100644
index 0000000..f3b9293
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
@@ -0,0 +1,34 @@
+/* Common definition for memset/bzero implementation.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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 <ifunc-init.h>
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara4) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara1) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra1) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_SPARC_CRYPTO)
+ return OPTIMIZE (niagara4);
+ if (hwcap & HWCAP_SPARC_BLKINIT)
+ return OPTIMIZE (niagara1);
+ return OPTIMIZE (ultra1);
+}
diff --git a/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
new file mode 100644
index 0000000..e85da41
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memset-ultra1.S
@@ -0,0 +1,31 @@
+/* Default SPARC64 memset implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+
+# define memset __memset_ultra1
+# define __bzero __bzero_ultra1
+
+#include <sysdeps/sparc/sparc64/memset.S>
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/memset.S b/sysdeps/sparc/sparc64/multiarch/memset.S
deleted file mode 100644
index 9469d5e..0000000
--- a/sysdeps/sparc/sparc64/multiarch/memset.S
+++ /dev/null
@@ -1,124 +0,0 @@
-/* Multiple versions of memset and bzero
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-#if IS_IN (libc)
- .text
-ENTRY(memset)
- .type memset, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memset_niagara4), %o1
- xor %o1, %gdop_lox10(__memset_niagara4), %o1
-# else
- set __memset_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__memset_niagara1), %o1
- xor %o1, %gdop_lox10(__memset_niagara1), %o1
-# else
- set __memset_niagara1, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__memset_ultra1), %o1
- xor %o1, %gdop_lox10(__memset_ultra1), %o1
-# else
- set __memset_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(memset)
-
-ENTRY(__bzero)
- .type bzero, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_niagara4), %o1
- xor %o1, %gdop_lox10(__bzero_niagara4), %o1
-# else
- set __bzero_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_niagara1), %o1
- xor %o1, %gdop_lox10(__bzero_niagara1), %o1
-# else
- set __bzero_niagara1, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__bzero_ultra1), %o1
- xor %o1, %gdop_lox10(__bzero_ultra1), %o1
-# else
- set __bzero_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__bzero)
-
-weak_alias (__bzero, bzero)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-libc_hidden_builtin_def (memset)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-
-#define memset __memset_ultra1
-#define __bzero __bzero_ultra1
-
-#endif
-
-#include "../memset.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/memset.c b/sysdeps/sparc/sparc64/multiarch/memset.c
new file mode 100644
index 0000000..c07d8e2
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memset.c
@@ -0,0 +1,42 @@
+/* Multiple versions of memset.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define memset __redirect_memset
+# define bzero __redirect_bzero
+# include <string.h>
+# undef memset
+# undef bzero
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME memset
+# include "ifunc-memset.h"
+
+sparc_libc_ifunc_redirected (__redirect_memset, memset, IFUNC_SELECTOR)
+sparc_ifunc_redirected_hidden_def (__redirect_memset, memset)
+
+# undef SYMBOL_NAME
+# define SYMBOL_NAME bzero
+# include "ifunc-memset.h"
+
+sparc_libc_ifunc_redirected (__redirect_bzero, __bzero, IFUNC_SELECTOR)
+weak_alias (__bzero, bzero)
+
+#endif
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 13/25] sparc: refactor sparc64 __mpn_mul_1 selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (4 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 04/25] sparc: Implement memset/bzero ifunc selection in C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 13:09 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 12/25] sparc: refactor sparc64 rint{f} " Adhemerval Zanella
` (19 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
mul_1-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
Add mul_1-generic.
* sysdeps/sparc/sparc64/multiarch/mul_1-generic.S: New file.
* sysdeps/sparc/sparc64/multiarch/mul_1.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/mul_1.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 6 +++
sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
sysdeps/sparc/sparc64/multiarch/mul_1-generic.S | 2 +
sysdeps/sparc/sparc64/multiarch/mul_1.S | 56 -------------------------
sysdeps/sparc/sparc64/multiarch/mul_1.c | 28 +++++++++++++
5 files changed, 38 insertions(+), 57 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.c
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 6e90cba..2338213 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -13,7 +13,8 @@ sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
endif
ifeq ($(subdir),stdlib)
-sysdep_routines += mul_1-vis3 addmul_1-vis3 submul_1-vis3 add_n-vis3 sub_n-vis3
+sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
+ add_n-vis3 sub_n-vis3
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
new file mode 100644
index 0000000..f1b7e60
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
@@ -0,0 +1,2 @@
+#define __mpn_mul_1 __mpn_mul_1_generic
+#include <sysdeps/sparc/sparc64/mul_1.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1.S b/sysdeps/sparc/sparc64/multiarch/mul_1.S
deleted file mode 100644
index 75fca93..0000000
--- a/sysdeps/sparc/sparc64/multiarch/mul_1.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Multiple versions of mul_1
-
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-ENTRY(__mpn_mul_1)
- .type __mpn_mul_1, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_VIS3, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_mul_1_vis3), %o1
- xor %o1, %gdop_lox10(__mpn_mul_1_vis3), %o1
-# else
- set __mpn_mul_1_vis3, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_mul_1_generic), %o1
- xor %o1, %gdop_lox10(__mpn_mul_1_generic), %o1
-# else
- set __mpn_mul_1_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mpn_mul_1)
-
-#define __mpn_mul_1 __mpn_mul_1_generic
-#include "../mul_1.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1.c b/sysdeps/sparc/sparc64/multiarch/mul_1.c
new file mode 100644
index 0000000..98f0ccc
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/mul_1.c
@@ -0,0 +1,28 @@
+/* __mpn_mul_1 ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <gmp.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (mpn_mul_1) __mpn_mul_1_vis3 attribute_hidden;
+extern __typeof (mpn_mul_1) __mpn_mul_1_generic attribute_hidden;
+
+sparc_libm_ifunc (__mpn_mul_1,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __mpn_mul_1_vis3
+ : __mpn_mul_1_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 13/25] sparc: refactor sparc64 __mpn_mul_1 selector to C
2017-10-26 19:07 ` [PATCH 13/25] sparc: refactor sparc64 __mpn_mul_1 selector to C Adhemerval Zanella
@ 2017-11-30 13:09 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 13:09 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> mul_1-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
> Add mul_1-generic.
> * sysdeps/sparc/sparc64/multiarch/mul_1-generic.S: New file.
> * sysdeps/sparc/sparc64/multiarch/mul_1.c: Likewise.
> * sysdeps/sparc/sparc64/multiarch/mul_1.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 6 +++
> sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
> sysdeps/sparc/sparc64/multiarch/mul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/mul_1.S | 56 -------------------------
> sysdeps/sparc/sparc64/multiarch/mul_1.c | 28 +++++++++++++
> 5 files changed, 38 insertions(+), 57 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.c
>
> diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
> index 6e90cba..2338213 100644
> --- a/sysdeps/sparc/sparc64/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/multiarch/Makefile
> @@ -13,7 +13,8 @@ sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
> endif
>
> ifeq ($(subdir),stdlib)
> -sysdep_routines += mul_1-vis3 addmul_1-vis3 submul_1-vis3 add_n-vis3 sub_n-vis3
> +sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
> + add_n-vis3 sub_n-vis3
> endif
>
> ifeq ($(subdir),math)
> diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
> new file mode 100644
> index 0000000..f1b7e60
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
> @@ -0,0 +1,2 @@
> +#define __mpn_mul_1 __mpn_mul_1_generic
> +#include <sysdeps/sparc/sparc64/mul_1.S>
> diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1.S b/sysdeps/sparc/sparc64/multiarch/mul_1.S
> deleted file mode 100644
> index 75fca93..0000000
> --- a/sysdeps/sparc/sparc64/multiarch/mul_1.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/* Multiple versions of mul_1
> -
> - Copyright (C) 2013-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> -ENTRY(__mpn_mul_1)
> - .type __mpn_mul_1, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_VIS3, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_mul_1_vis3), %o1
> - xor %o1, %gdop_lox10(__mpn_mul_1_vis3), %o1
> -# else
> - set __mpn_mul_1_vis3, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_mul_1_generic), %o1
> - xor %o1, %gdop_lox10(__mpn_mul_1_generic), %o1
> -# else
> - set __mpn_mul_1_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__mpn_mul_1)
> -
> -#define __mpn_mul_1 __mpn_mul_1_generic
> -#include "../mul_1.S"
> diff --git a/sysdeps/sparc/sparc64/multiarch/mul_1.c b/sysdeps/sparc/sparc64/multiarch/mul_1.c
> new file mode 100644
> index 0000000..98f0ccc
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/mul_1.c
> @@ -0,0 +1,28 @@
> +/* __mpn_mul_1 ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <gmp.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (mpn_mul_1) __mpn_mul_1_vis3 attribute_hidden;
> +extern __typeof (mpn_mul_1) __mpn_mul_1_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__mpn_mul_1,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __mpn_mul_1_vis3
> + : __mpn_mul_1_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 12/25] sparc: refactor sparc64 rint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (5 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 13/25] sparc: refactor sparc64 __mpn_mul_1 selector to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:41 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 09/25] sparc: refactor sparc64 finite{f} " Adhemerval Zanella
` (18 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_rint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_rintf-generic and s_rint-generic
objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 10 ++++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
.../sparc/sparc64/fpu/multiarch/s_rint-generic.S | 4 +++
sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S | 12 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c | 29 ++++++++++++++++++++++
.../sparc/sparc64/fpu/multiarch/s_rintf-generic.S | 4 +++
sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S | 12 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c | 29 ++++++++++++++++++++++
8 files changed, 77 insertions(+), 24 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index d0a87d1..3321e1d 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -11,6 +11,7 @@ sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
sysdep_routines += $(sysdep_calls)
libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_lrintf-generic \
s_lrint-generic s_rintf-vis3 s_rint-vis3 \
+ s_rintf-generic s_rint-generic \
s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
s_nearbyint-generic s_nearbyintf-generic \
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
new file mode 100644
index 0000000..d927434
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
@@ -0,0 +1,4 @@
+#define __rint __rint_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc64/fpu/s_rint.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
deleted file mode 100644
index cc980eb..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(rint)
-
-weak_alias (__rint, rint)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __rint __rint_generic
-
-#include "../s_rint.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
new file mode 100644
index 0000000..ca566c2
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
@@ -0,0 +1,29 @@
+/* rint ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (rint) __rint_vis3 attribute_hidden;
+extern __typeof (rint) __rint_generic attribute_hidden;
+
+sparc_libm_ifunc (__rint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __rint_vis3
+ : __rint_generic);
+weak_alias (__rint, rint)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
new file mode 100644
index 0000000..30da5f0
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
@@ -0,0 +1,4 @@
+#define __rintf __rintf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc64/fpu/s_rintf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
deleted file mode 100644
index 38fd936..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(rintf)
-
-weak_alias (__rintf, rintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __rintf __rintf_generic
-
-#include "../s_rintf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
new file mode 100644
index 0000000..67f166c
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
@@ -0,0 +1,29 @@
+/* rintf ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (rintf) __rintf_vis3 attribute_hidden;
+extern __typeof (rintf) __rintf_generic attribute_hidden;
+
+sparc_libm_ifunc (__rintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __rintf_vis3
+ : __rintf_generic);
+weak_alias (__rintf, rintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 12/25] sparc: refactor sparc64 rint{f} selector to C
2017-10-26 19:07 ` [PATCH 12/25] sparc: refactor sparc64 rint{f} " Adhemerval Zanella
@ 2017-11-29 13:41 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:41 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_rint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_rintf-generic and s_rint-generic
> objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 10 ++++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
> .../sparc/sparc64/fpu/multiarch/s_rint-generic.S | 4 +++
> sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S | 12 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c | 29 ++++++++++++++++++++++
> .../sparc/sparc64/fpu/multiarch/s_rintf-generic.S | 4 +++
> sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S | 12 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c | 29 ++++++++++++++++++++++
> 8 files changed, 77 insertions(+), 24 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index d0a87d1..3321e1d 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -11,6 +11,7 @@ sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> sysdep_routines += $(sysdep_calls)
> libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_lrintf-generic \
> s_lrint-generic s_rintf-vis3 s_rint-vis3 \
> + s_rintf-generic s_rint-generic \
> s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> s_nearbyint-generic s_nearbyintf-generic \
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
> new file mode 100644
> index 0000000..d927434
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
> @@ -0,0 +1,4 @@
> +#define __rint __rint_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc64/fpu/s_rint.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
> deleted file mode 100644
> index cc980eb..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(rint)
> -
> -weak_alias (__rint, rint)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __rint __rint_generic
> -
> -#include "../s_rint.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
> new file mode 100644
> index 0000000..ca566c2
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
> @@ -0,0 +1,29 @@
> +/* rint ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (rint) __rint_vis3 attribute_hidden;
> +extern __typeof (rint) __rint_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__rint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __rint_vis3
> + : __rint_generic);
> +weak_alias (__rint, rint)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
> new file mode 100644
> index 0000000..30da5f0
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
> @@ -0,0 +1,4 @@
> +#define __rintf __rintf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc64/fpu/s_rintf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
> deleted file mode 100644
> index 38fd936..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(rintf)
> -
> -weak_alias (__rintf, rintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __rintf __rintf_generic
> -
> -#include "../s_rintf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
> new file mode 100644
> index 0000000..67f166c
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
> @@ -0,0 +1,29 @@
> +/* rintf ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (rintf) __rintf_vis3 attribute_hidden;
> +extern __typeof (rintf) __rintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__rintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __rintf_vis3
> + : __rintf_generic);
> +weak_alias (__rintf, rintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 09/25] sparc: refactor sparc64 finite{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (6 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 12/25] sparc: refactor sparc64 rint{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:40 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 07/25] sparc: refactor sparc64 isnan{f} " Adhemerval Zanella
` (17 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_finite{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
Add s_finitef-generic and s_finite-generic objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 9 ++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
.../sparc/sparc64/fpu/multiarch/s_finite-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c | 37 ++++++++++++++++++++++
.../sparc64/fpu/multiarch/s_finitef-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c | 33 +++++++++++++++++++
8 files changed, 92 insertions(+), 30 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index f0c8fa3..d19a446 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -4,6 +4,7 @@ ifeq ($(subdir),math)
# prefixed with m_.
sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
s_signbit-generic s_finitef-vis3 s_finite-vis3 \
+ s_finitef-generic s_finite-generic \
s_isinff-vis3 s_isinf-vis3 s_isinff-generic s_isinf-generic \
s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
new file mode 100644
index 0000000..dfbf32f
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
@@ -0,0 +1,6 @@
+#define __finite __finite_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_finite.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
deleted file mode 100644
index 78406a6..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(finite)
-
-hidden_def (__finite)
-weak_alias (__finite, finite)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __finite __finite_generic
-
-#include "../s_finite.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
new file mode 100644
index 0000000..22e46c4
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
@@ -0,0 +1,37 @@
+/* finite ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __finite __redirect___finite
+#define __finitef __redirect___finitef
+#define __finitel __redirect___finitel
+#include <math.h>
+#undef __finite
+#undef __finitef
+#undef __finitel
+#include <sparc-ifunc.h>
+
+extern __typeof (finite) __finite_vis3 attribute_hidden;
+extern __typeof (finite) __finite_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___finite, __finite,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __finite_vis3
+ : __finite_generic);
+
+sparc_ifunc_redirected_hidden_def (__redirect___finite, __finite)
+weak_alias (__finite, finite)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
new file mode 100644
index 0000000..3888076
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
@@ -0,0 +1,6 @@
+#define __finitef __finitef_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_finitef.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
deleted file mode 100644
index cafd41f..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(finitef)
-
-hidden_def (__finitef)
-weak_alias (__finitef, finitef)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __finitef __finitef_generic
-
-#include "../s_finitef.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
new file mode 100644
index 0000000..695e8a0
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
@@ -0,0 +1,33 @@
+/* finitef ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __finitef __redirect___finitef
+#include <math.h>
+#undef __finitef
+#include <sparc-ifunc.h>
+
+extern __typeof (finitef) __finitef_vis3 attribute_hidden;
+extern __typeof (finitef) __finitef_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___finitef, __finitef,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __finitef_vis3
+ : __finitef_generic);
+
+sparc_ifunc_redirected_hidden_def (__redirect___finitef, __finitef)
+weak_alias (__finitef, finitef)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 09/25] sparc: refactor sparc64 finite{f} selector to C
2017-10-26 19:07 ` [PATCH 09/25] sparc: refactor sparc64 finite{f} " Adhemerval Zanella
@ 2017-11-29 13:40 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:40 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_finite{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
> Add s_finitef-generic and s_finite-generic objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 9 ++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
> .../sparc/sparc64/fpu/multiarch/s_finite-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c | 37 ++++++++++++++++++++++
> .../sparc64/fpu/multiarch/s_finitef-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c | 33 +++++++++++++++++++
> 8 files changed, 92 insertions(+), 30 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index f0c8fa3..d19a446 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -4,6 +4,7 @@ ifeq ($(subdir),math)
> # prefixed with m_.
> sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> s_signbit-generic s_finitef-vis3 s_finite-vis3 \
> + s_finitef-generic s_finite-generic \
> s_isinff-vis3 s_isinf-vis3 s_isinff-generic s_isinf-generic \
> s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
> new file mode 100644
> index 0000000..dfbf32f
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
> @@ -0,0 +1,6 @@
> +#define __finite __finite_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_finite.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
> deleted file mode 100644
> index 78406a6..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(finite)
> -
> -hidden_def (__finite)
> -weak_alias (__finite, finite)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __finite __finite_generic
> -
> -#include "../s_finite.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
> new file mode 100644
> index 0000000..22e46c4
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
> @@ -0,0 +1,37 @@
> +/* finite ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __finite __redirect___finite
> +#define __finitef __redirect___finitef
> +#define __finitel __redirect___finitel
> +#include <math.h>
> +#undef __finite
> +#undef __finitef
> +#undef __finitel
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (finite) __finite_vis3 attribute_hidden;
> +extern __typeof (finite) __finite_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___finite, __finite,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __finite_vis3
> + : __finite_generic);
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___finite, __finite)
> +weak_alias (__finite, finite)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
> new file mode 100644
> index 0000000..3888076
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
> @@ -0,0 +1,6 @@
> +#define __finitef __finitef_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_finitef.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
> deleted file mode 100644
> index cafd41f..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(finitef)
> -
> -hidden_def (__finitef)
> -weak_alias (__finitef, finitef)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __finitef __finitef_generic
> -
> -#include "../s_finitef.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
> new file mode 100644
> index 0000000..695e8a0
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
> @@ -0,0 +1,33 @@
> +/* finitef ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __finitef __redirect___finitef
> +#include <math.h>
> +#undef __finitef
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (finitef) __finitef_vis3 attribute_hidden;
> +extern __typeof (finitef) __finitef_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___finitef, __finitef,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __finitef_vis3
> + : __finitef_generic);
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___finitef, __finitef)
> +weak_alias (__finitef, finitef)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 07/25] sparc: refactor sparc64 isnan{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (7 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 09/25] sparc: refactor sparc64 finite{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:40 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 20/25] sparc: refactor sparc32 llrint{f} " Adhemerval Zanella
` (16 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
(s_isnan-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
Add s_isnanf-generic and s_isnan-generic objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 9 ++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 2 +-
.../sparc/sparc64/fpu/multiarch/s_isnan-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c | 37 ++++++++++++++++++++++
.../sparc/sparc64/fpu/multiarch/s_isnanf-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c | 33 +++++++++++++++++++
8 files changed, 92 insertions(+), 31 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index 702452c..a46773b 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -5,7 +5,7 @@ ifeq ($(subdir),math)
sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
s_signbit-generic s_finitef-vis3 \
s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
- s_isnanf-vis3 s_isnan-vis3
+ s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
sysdep_routines += $(sysdep_calls)
libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
new file mode 100644
index 0000000..64d4430
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
@@ -0,0 +1,6 @@
+#define __isnan __isnan_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_isnan.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
deleted file mode 100644
index 40e985a..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(isnan)
-
-hidden_def (__isnan)
-weak_alias (__isnan, isnan)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __isnan __isnan_generic
-
-#include "../s_isnan.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
new file mode 100644
index 0000000..3b3d700
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
@@ -0,0 +1,37 @@
+/* isnan ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __isnan __redirect___isnan
+#define __isnanf __redirect___isnanf
+#define __isnanl __redirect___isnanl
+#include <math.h>
+#undef __isnan
+#undef __isnanf
+#undef __isnanl
+#include <sparc-ifunc.h>
+
+extern __typeof (isnan) __isnan_vis3 attribute_hidden;
+extern __typeof (isnan) __isnan_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___isnan, __isnan,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __isnan_vis3
+ : __isnan_generic);
+
+sparc_ifunc_redirected_hidden_def (__redirect___isnan, __isnan)
+weak_alias (__isnan, isnan)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
new file mode 100644
index 0000000..5c82f7d
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
@@ -0,0 +1,6 @@
+#define __isnanf __isnanf_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_isnanf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
deleted file mode 100644
index 6b53b69..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(isnanf)
-
-hidden_def (__isnanf)
-weak_alias (__isnanf, isnanf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __isnanf __isnanf_generic
-
-#include "../s_isnanf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
new file mode 100644
index 0000000..f6a6380
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
@@ -0,0 +1,33 @@
+/* isnanf ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __isnanf __redirect___isnanf
+#include <math.h>
+#undef __isnanf
+#include <sparc-ifunc.h>
+
+extern __typeof (isnanf) __isnanf_vis3 attribute_hidden;
+extern __typeof (isnanf) __isnanf_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___isnanf, __isnanf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __isnanf_vis3
+ : __isnanf_generic);
+
+sparc_ifunc_redirected_hidden_def (__redirect___isnanf,__isnanf)
+weak_alias (__isnanf, isnanf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 07/25] sparc: refactor sparc64 isnan{f} selector to C
2017-10-26 19:07 ` [PATCH 07/25] sparc: refactor sparc64 isnan{f} " Adhemerval Zanella
@ 2017-11-29 13:40 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:40 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> (s_isnan-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
> Add s_isnanf-generic and s_isnan-generic objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 9 ++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 2 +-
> .../sparc/sparc64/fpu/multiarch/s_isnan-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c | 37 ++++++++++++++++++++++
> .../sparc/sparc64/fpu/multiarch/s_isnanf-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c | 33 +++++++++++++++++++
> 8 files changed, 92 insertions(+), 31 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index 702452c..a46773b 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -5,7 +5,7 @@ ifeq ($(subdir),math)
> sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> s_signbit-generic s_finitef-vis3 \
> s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
> - s_isnanf-vis3 s_isnan-vis3
> + s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
>
> sysdep_routines += $(sysdep_calls)
> libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
> new file mode 100644
> index 0000000..64d4430
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
> @@ -0,0 +1,6 @@
> +#define __isnan __isnan_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_isnan.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
> deleted file mode 100644
> index 40e985a..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(isnan)
> -
> -hidden_def (__isnan)
> -weak_alias (__isnan, isnan)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __isnan __isnan_generic
> -
> -#include "../s_isnan.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
> new file mode 100644
> index 0000000..3b3d700
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
> @@ -0,0 +1,37 @@
> +/* isnan ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __isnan __redirect___isnan
> +#define __isnanf __redirect___isnanf
> +#define __isnanl __redirect___isnanl
> +#include <math.h>
> +#undef __isnan
> +#undef __isnanf
> +#undef __isnanl
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (isnan) __isnan_vis3 attribute_hidden;
> +extern __typeof (isnan) __isnan_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___isnan, __isnan,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __isnan_vis3
> + : __isnan_generic);
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___isnan, __isnan)
> +weak_alias (__isnan, isnan)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
> new file mode 100644
> index 0000000..5c82f7d
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
> @@ -0,0 +1,6 @@
> +#define __isnanf __isnanf_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_isnanf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
> deleted file mode 100644
> index 6b53b69..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(isnanf)
> -
> -hidden_def (__isnanf)
> -weak_alias (__isnanf, isnanf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __isnanf __isnanf_generic
> -
> -#include "../s_isnanf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
> new file mode 100644
> index 0000000..f6a6380
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
> @@ -0,0 +1,33 @@
> +/* isnanf ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __isnanf __redirect___isnanf
> +#include <math.h>
> +#undef __isnanf
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (isnanf) __isnanf_vis3 attribute_hidden;
> +extern __typeof (isnanf) __isnanf_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___isnanf, __isnanf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __isnanf_vis3
> + : __isnanf_generic);
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___isnanf,__isnanf)
> +weak_alias (__isnanf, isnanf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 20/25] sparc: refactor sparc32 llrint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (8 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 07/25] sparc: refactor sparc64 isnan{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 05/25] sparc: Assume VIS3 support Adhemerval Zanella
` (15 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc32 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_llrint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_llrintf-generic and s_llrint-generic.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_llrint-generic.S: New
file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrint.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S:
Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrint.S: Remove file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 11 +++++++
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 1 +
.../sparcv9/fpu/multiarch/s_llrint-generic.S | 8 +++++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S | 24 ---------------
.../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c | 36 ++++++++++++++++++++++
.../sparcv9/fpu/multiarch/s_llrintf-generic.S | 4 +++
.../sparc32/sparcv9/fpu/multiarch/s_llrintf.S | 17 ----------
.../sparc32/sparcv9/fpu/multiarch/s_llrintf.c | 29 +++++++++++++++++
8 files changed, 89 insertions(+), 41 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index bd8e341..5b6e2a6 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -9,6 +9,7 @@ sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
sysdep_routines += $(sysdep_calls)
libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
+ s_llrintf-generic s_llrint-generic \
s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
new file mode 100644
index 0000000..ceb5d14
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
@@ -0,0 +1,8 @@
+#include <math_ldbl_opt.h>
+
+#define __llrint __llrint_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#undef compat_symbol
+#define compat_symbol(a, b, c, d)
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_llrint.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
deleted file mode 100644
index fd23041..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <sparc-ifunc.h>
-#include <math_ldbl_opt.h>
-
-SPARC_ASM_VIS3_IFUNC(llrint)
-
-weak_alias (__llrint, llrint)
-
-strong_alias (__llrint, __lllrint)
-weak_alias (__lllrint, lllrint)
-
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __llrint, llrintl, GLIBC_2_1)
-#endif
-
-# 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 __llrint __llrint_generic
-
-#include "../s_llrint.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
new file mode 100644
index 0000000..b10cad4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
@@ -0,0 +1,36 @@
+/* llrint ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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/>. */
+
+#define __llrint __redirect_llrint
+#include <math.h>
+#undef __llrint
+#include <math_ldbl_opt.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_llrint) __llrint_vis3 attribute_hidden;
+extern __typeof (__redirect_llrint) __llrint_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_llrint, __llrint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __llrint_vis3
+ : __llrint_generic);
+weak_alias (__llrint, llrint)
+
+#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
+compat_symbol (libm, __llrint, llrintl, GLIBC_2_1);
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
new file mode 100644
index 0000000..83c462c
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
@@ -0,0 +1,4 @@
+#define __llrintf __llrintf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_llrintf.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
deleted file mode 100644
index 8af5244..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(llrintf)
-
-weak_alias (__llrintf, llrintf)
-
-strong_alias (__llrintf, __lllrintf)
-weak_alias (__lllrintf, lllrintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef strong_alias
-# define strong_alias(a, b)
-
-#define __llrintf __llrintf_generic
-
-#include "../s_llrintf.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
new file mode 100644
index 0000000..0594a16
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
@@ -0,0 +1,29 @@
+/* llrintf ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (llrintf) __llrintf_vis3 attribute_hidden;
+extern __typeof (llrintf) __llrintf_generic attribute_hidden;
+
+sparc_libm_ifunc (__llrintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __llrintf_vis3
+ : __llrintf_generic);
+weak_alias (__llrintf, llrintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 20/25] sparc: refactor sparc32 llrint{f} selector to C
2017-10-26 19:07 ` [PATCH 20/25] sparc: refactor sparc32 llrint{f} " Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly. I had to adjust to use
Joseph recent changes to use libc_alias_{float,double}.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc32 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_llrint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_llrintf-generic and s_llrint-generic.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_llrint-generic.S: New
> file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrint.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S:
> Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrint.S: Remove file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_llrintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 11 +++++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 1 +
> .../sparcv9/fpu/multiarch/s_llrint-generic.S | 8 +++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S | 24 ---------------
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c | 36 ++++++++++++++++++++++
> .../sparcv9/fpu/multiarch/s_llrintf-generic.S | 4 +++
> .../sparc32/sparcv9/fpu/multiarch/s_llrintf.S | 17 ----------
> .../sparc32/sparcv9/fpu/multiarch/s_llrintf.c | 29 +++++++++++++++++
> 8 files changed, 89 insertions(+), 41 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index bd8e341..5b6e2a6 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -9,6 +9,7 @@ sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
> sysdep_routines += $(sysdep_calls)
> libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
> s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
> + s_llrintf-generic s_llrint-generic \
> s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
> new file mode 100644
> index 0000000..ceb5d14
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
> @@ -0,0 +1,8 @@
> +#include <math_ldbl_opt.h>
> +
> +#define __llrint __llrint_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#undef compat_symbol
> +#define compat_symbol(a, b, c, d)
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_llrint.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
> deleted file mode 100644
> index fd23041..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -#include <sparc-ifunc.h>
> -#include <math_ldbl_opt.h>
> -
> -SPARC_ASM_VIS3_IFUNC(llrint)
> -
> -weak_alias (__llrint, llrint)
> -
> -strong_alias (__llrint, __lllrint)
> -weak_alias (__lllrint, lllrint)
> -
> -#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
> -compat_symbol (libm, __llrint, llrintl, GLIBC_2_1)
> -#endif
> -
> -# 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 __llrint __llrint_generic
> -
> -#include "../s_llrint.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
> new file mode 100644
> index 0000000..b10cad4
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
> @@ -0,0 +1,36 @@
> +/* llrint ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __llrint __redirect_llrint
> +#include <math.h>
> +#undef __llrint
> +#include <math_ldbl_opt.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_llrint) __llrint_vis3 attribute_hidden;
> +extern __typeof (__redirect_llrint) __llrint_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_llrint, __llrint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __llrint_vis3
> + : __llrint_generic);
> +weak_alias (__llrint, llrint)
> +
> +#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
> +compat_symbol (libm, __llrint, llrintl, GLIBC_2_1);
> +#endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
> new file mode 100644
> index 0000000..83c462c
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
> @@ -0,0 +1,4 @@
> +#define __llrintf __llrintf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_llrintf.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
> deleted file mode 100644
> index 8af5244..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(llrintf)
> -
> -weak_alias (__llrintf, llrintf)
> -
> -strong_alias (__llrintf, __lllrintf)
> -weak_alias (__lllrintf, lllrintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef strong_alias
> -# define strong_alias(a, b)
> -
> -#define __llrintf __llrintf_generic
> -
> -#include "../s_llrintf.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
> new file mode 100644
> index 0000000..0594a16
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
> @@ -0,0 +1,29 @@
> +/* llrintf ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (llrintf) __llrintf_vis3 attribute_hidden;
> +extern __typeof (llrintf) __llrintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__llrintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __llrintf_vis3
> + : __llrintf_generic);
> +weak_alias (__llrintf, llrintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 05/25] sparc: Assume VIS3 support
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (9 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 20/25] sparc: refactor sparc32 llrint{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-28 17:51 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 02/25] arm: Implement memchr ifunc selection in C Adhemerval Zanella
` (14 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch assumes VIS3 support by binutils, which is support since
binutils 2.22. This leads to soem code simplification, mostly on
multiarch build where there is no more 2 variant possible (whether
binutils supports VIS3 instructions or not).
For multiarch files whether HAVE_AS_VIS3_SUPPORT was checked and
the default implementation was built with a different name, a new
file with (implementation with -generic appended) is added.
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* config.h.in (HAVE_AS_VIS3_SUPPORT): Remove check for VIS3 support.
* sysdeps/sparc/configure.ac (HAVE_AS_VIS3_SUPPORT): Likewise.
* sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c: Likewise.
* sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c: Likewise.
* sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c: Likewise.
* sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c: Likewise.
* sysdeps/sparc/sparc-ifunc.h [!HAVE_AS_VIS3_SUPPORT]
(SPARC_ASM_VIS3_IFUNC, SPARC_ASM_VIS3_VIS2_IFUNC): Remove macros.
* sysdeps/sparc/sparc32/sparcv9/Makefile [$(have-as-vis3) != yes]
(ASFLAGS.o, ASFLAGS-.os, ASFLAGS-.op, ASFLAGS-.oS): Remove rules.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
($(have-as-vis3) == yes): Remove conditional.
* sysdeps/sparc/sparc64/Makefile (($(have-as-vis3) == yes)):
Likewise.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c: New
file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c: New
file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c: New
file.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c: New
file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c: New file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 51 ++++++++++++++++++++++
config.h.in | 3 --
sysdeps/sparc/configure | 42 ------------------
sysdeps/sparc/configure.ac | 29 ------------
sysdeps/sparc/sparc-ifunc.h | 13 ------
sysdeps/sparc/sparc32/sparcv9/Makefile | 7 ---
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 8 ++--
.../sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c | 4 ++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c | 17 +++-----
.../sparcv9/fpu/multiarch/s_fdimf-generic.c | 3 ++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c | 12 +----
.../sparc32/sparcv9/fpu/multiarch/s_fma-generic.c | 2 +
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c | 12 ++---
.../sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c | 2 +
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c | 10 +----
sysdeps/sparc/sparc64/Makefile | 2 -
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 10 ++---
.../sparc/sparc64/fpu/multiarch/s_ceil-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_ceilf-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_floor-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_floorf-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_fma-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_fmaf-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_trunc-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c | 19 ++++----
.../sparc/sparc64/fpu/multiarch/s_truncf-generic.c | 2 +
sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c | 19 ++++----
33 files changed, 163 insertions(+), 232 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
diff --git a/config.h.in b/config.h.in
index c140ff3..8d76dad 100644
--- a/config.h.in
+++ b/config.h.in
@@ -50,9 +50,6 @@
/* Defined on SPARC if GCC emits GOTDATA relocations. */
#undef HAVE_GCC_GOTDATA
-/* Define on SPARC if AS supports VIS3 instructions. */
-#undef HAVE_AS_VIS3_SUPPORT
-
/* Define if the linker supports the -z combreloc option. */
#undef HAVE_Z_COMBRELOC
diff --git a/sysdeps/sparc/configure b/sysdeps/sparc/configure
index 90a86f6..bc6ac14 100644
--- a/sysdeps/sparc/configure
+++ b/sysdeps/sparc/configure
@@ -1,48 +1,6 @@
# This file is generated from configure.ac by Autoconf. DO NOT EDIT!
# Local configure fragment for sysdeps/sparc.
-# Check for support of VIS3 et al. instructions in the assembler.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sparc assembler VIS3 support" >&5
-$as_echo_n "checking for sparc assembler VIS3 support... " >&6; }
-if ${libc_cv_sparc_as_vis3+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat > conftest.S <<\EOF
- .text
-foo: fmadds %f1, %f2, %f3, %f5
- fmaddd %f2, %f4, %f8, %f10
- fhadds %f2, %f3, %f5
- fhaddd %f4, %f8, %f10
- pdistn %f2, %f4, %g1
- movdtox %f10, %o0
- movstouw %f9, %o1
- movstosw %f7, %o2
- movxtod %o3, %f18
- movwtos %o4, %f15
- flcmps %fcc0, %f3, %f5
- flcmpd %fcc1, %f4, %f6
-EOF
-if { ac_try='${CC-cc} -c $CFLAGS -Wa,-Av9d conftest.S'
- { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- libc_cv_sparc_as_vis3=yes
-else
- libc_cv_sparc_as_vis3=no
-fi
-rm -f conftest*
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sparc_as_vis3" >&5
-$as_echo "$libc_cv_sparc_as_vis3" >&6; }
-if test $libc_cv_sparc_as_vis3 = yes; then
- $as_echo "#define HAVE_AS_VIS3_SUPPORT 1" >>confdefs.h
-
-fi
-config_vars="$config_vars
-have-as-vis3 = $libc_cv_sparc_as_vis3"
-
# Check for a GCC emitting GOTDATA relocations.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sparc gcc GOTDATA reloc support" >&5
$as_echo_n "checking for sparc gcc GOTDATA reloc support... " >&6; }
diff --git a/sysdeps/sparc/configure.ac b/sysdeps/sparc/configure.ac
index 982077c..43ad541 100644
--- a/sysdeps/sparc/configure.ac
+++ b/sysdeps/sparc/configure.ac
@@ -1,35 +1,6 @@
GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
# Local configure fragment for sysdeps/sparc.
-# Check for support of VIS3 et al. instructions in the assembler.
-AC_CACHE_CHECK(for sparc assembler VIS3 support, libc_cv_sparc_as_vis3, [dnl
-cat > conftest.S <<\EOF
- .text
-foo: fmadds %f1, %f2, %f3, %f5
- fmaddd %f2, %f4, %f8, %f10
- fhadds %f2, %f3, %f5
- fhaddd %f4, %f8, %f10
- pdistn %f2, %f4, %g1
- movdtox %f10, %o0
- movstouw %f9, %o1
- movstosw %f7, %o2
- movxtod %o3, %f18
- movwtos %o4, %f15
- flcmps %fcc0, %f3, %f5
- flcmpd %fcc1, %f4, %f6
-EOF
-dnl
-if AC_TRY_COMMAND([${CC-cc} -c $CFLAGS -Wa,-Av9d conftest.S]); then
- libc_cv_sparc_as_vis3=yes
-else
- libc_cv_sparc_as_vis3=no
-fi
-rm -f conftest*])
-if test $libc_cv_sparc_as_vis3 = yes; then
- AC_DEFINE(HAVE_AS_VIS3_SUPPORT)
-fi
-LIBC_CONFIG_VAR([have-as-vis3], [$libc_cv_sparc_as_vis3])
-
# Check for a GCC emitting GOTDATA relocations.
AC_CACHE_CHECK(for sparc gcc GOTDATA reloc support, libc_cv_sparc_gcc_gotdata, [dnl
changequote(,)dnl
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
index 044fe36..54420d8 100644
--- a/sysdeps/sparc/sparc-ifunc.h
+++ b/sysdeps/sparc/sparc-ifunc.h
@@ -137,8 +137,6 @@ END (__##name)
SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS2, \
__##name##_vis2, __##name##_generic)
-# ifdef HAVE_AS_VIS3_SUPPORT
-
#define SPARC_ASM_VIS3_IFUNC(name) \
SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS3, \
__##name##_vis3, __##name##_generic)
@@ -149,17 +147,6 @@ END (__##name)
HWCAP_SPARC_VIS2, \
__##name##_vis2, __##name##_generic)
-# else /* HAVE_AS_VIS3_SUPPORT */
-
-#define SPARC_ASM_VIS3_IFUNC(name) \
- SPARC_ASM_IFUNC_DFLT(name, __##name##_generic)
-
-#define SPARC_ASM_VIS3_VIS2_IFUNC(name) \
- SPARC_ASM_VIS2_IFUNC(name)
-
-# endif /* HAVE_AS_VIS3_SUPPORT */
-
-
#else /* __ASSEMBLER__ */
# define INIT_ARCH()
diff --git a/sysdeps/sparc/sparc32/sparcv9/Makefile b/sysdeps/sparc/sparc32/sparcv9/Makefile
index 526673e..45507ea 100644
--- a/sysdeps/sparc/sparc32/sparcv9/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/Makefile
@@ -1,16 +1,9 @@
sysdep-CFLAGS += -mcpu=ultrasparc -Wa,-Av9a -mvis
-ifeq ($(have-as-vis3),yes)
ASFLAGS-.o += -Wa,-Av9d
ASFLAGS-.os += -Wa,-Av9d
ASFLAGS-.op += -Wa,-Av9d
ASFLAGS-.oS += -Wa,-Av9d
-else
-ASFLAGS-.o += -Wa,-Av9a
-ASFLAGS-.os += -Wa,-Av9a
-ASFLAGS-.op += -Wa,-Av9a
-ASFLAGS-.oS += -Wa,-Av9a
-endif
# nscd uses atomic_spin_nop which in turn requires cpu_relax
ifeq ($(subdir),nscd)
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index 2a2d374..62bf6f1 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -1,13 +1,13 @@
ifeq ($(subdir),math)
-ifeq ($(have-as-vis3),yes)
libm-sysdep_routines += m_copysignf-vis3 m_copysign-vis3 s_fabs-vis3 \
s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
s_rintf-vis3 s_rint-vis3 \
- s_fmaf-vis3 s_fma-vis3 s_nearbyint-vis3 \
- s_nearbyintf-vis3 s_fdimf-vis3 s_fdim-vis3
+ s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
+ s_nearbyint-vis3 s_nearbyintf-vis3 \
+ s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
+ s_fdimf-generic
sysdep_routines += s_copysignf-vis3 s_copysign-vis3
CFLAGS-s_fdimf-vis3.c += -Wa,-Av9d -mvis3
CFLAGS-s_fdim-vis3.c += -Wa,-Av9d -mvis3
endif
-endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
new file mode 100644
index 0000000..30ee54b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
@@ -0,0 +1,4 @@
+#define __fdim __fdim_generic
+#define declare_mgen_alias(t, f)
+
+#include <math/s_fdim.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
index ff3acd4..fe483f6 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
@@ -16,23 +16,16 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <math_ldbl_opt.h>
-# include <first-versions.h>
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <math_ldbl_opt.h>
+#include <first-versions.h>
+#include <sparc-ifunc.h>
+#include <math.h>
extern double __fdim_vis3 (double, double);
extern double __fdim_generic (double, double);
sparc_libm_ifunc(__fdim, hwcap & HWCAP_SPARC_VIS3 ? __fdim_vis3 : __fdim_generic);
weak_alias (__fdim, fdim)
-# if LONG_DOUBLE_COMPAT (libm, FIRST_VERSION_libm_fdiml)
+#if LONG_DOUBLE_COMPAT (libm, FIRST_VERSION_libm_fdiml)
compat_symbol (libm, __fdim, fdiml, FIRST_VERSION_libm_fdiml);
-# endif
-
-# define __fdim __fdim_generic
-# define declare_mgen_alias(t, f)
#endif
-
-#include <math/s_fdim.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
new file mode 100644
index 0000000..17090b5
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
@@ -0,0 +1,3 @@
+#define __fdimf __fdimf_generic
+#define declare_mgen_alias(t, f)
+#include <math/s_fdimf.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
index cf1dc9e..ced4593 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
@@ -16,19 +16,11 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
extern float __fdimf_vis3 (float, float);
extern float __fdimf_generic (float, float);
sparc_libm_ifunc(__fdimf, hwcap & HWCAP_SPARC_VIS3 ? __fdimf_vis3 : __fdimf_generic);
weak_alias (__fdimf, fdimf)
-
-# define __fdimf __fdimf_generic
-# define declare_mgen_alias(t, f)
-
-#endif
-
-#include <math/s_fdimf.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
new file mode 100644
index 0000000..e40816f
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
@@ -0,0 +1,2 @@
+#define __fma __fma_generic
+#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
index 05113c3..3d0c165 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
@@ -1,7 +1,6 @@
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
-# include <math_ldbl_opt.h>
+#include <sparc-ifunc.h>
+#include <math.h>
+#include <math_ldbl_opt.h>
extern double __fma_vis3 (double, double, double);
extern double __fma_generic (double, double, double);
@@ -11,8 +10,3 @@ weak_alias (__fma, fma)
#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
compat_symbol (libm, __fma, fmal, GLIBC_2_1);
#endif
-
-# define __fma __fma_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
new file mode 100644
index 0000000..218eeb3
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
@@ -0,0 +1,2 @@
+#define __fmaf __fmaf_generic
+#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
index 7a273a3..5357b47 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
@@ -1,14 +1,8 @@
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
extern float __fmaf_vis3 (float, float, float);
extern float __fmaf_generic (float, float, float);
sparc_libm_ifunc(__fmaf, hwcap & HWCAP_SPARC_FMAF ? __fmaf_vis3 : __fmaf_generic);
weak_alias (__fmaf, fmaf)
-
-# define __fmaf __fmaf_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
diff --git a/sysdeps/sparc/sparc64/Makefile b/sysdeps/sparc/sparc64/Makefile
index a5e4036..0963a55 100644
--- a/sysdeps/sparc/sparc64/Makefile
+++ b/sysdeps/sparc/sparc64/Makefile
@@ -4,12 +4,10 @@ ifeq ($(subdir),string)
sysdep_routines += align-cpy
endif
-ifeq ($(have-as-vis3),yes)
ASFLAGS-.o += -Wa,-Av9d
ASFLAGS-.os += -Wa,-Av9d
ASFLAGS-.op += -Wa,-Av9d
ASFLAGS-.oS += -Wa,-Av9d
-endif
# nscd uses atomic_spin_nop which in turn requires cpu_relax
ifeq ($(subdir),nscd)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index 03a271d..2ac4496 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -1,13 +1,14 @@
ifeq ($(subdir),math)
-ifeq ($(have-as-vis3),yes)
libm-sysdep_routines += m_signbitf-vis3 m_signbit-vis3 m_finitef-vis3 \
m_finite-vis3 m_isinff-vis3 m_isinf-vis3 \
m_isnanf-vis3 m_isnan-vis3 s_lrintf-vis3 \
s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
- s_fmaf-vis3 s_fma-vis3 \
+ s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
- s_ceilf-vis3 s_ceil-vis3 s_floorf-vis3 \
- s_floor-vis3 s_truncf-vis3 s_trunc-vis3
+ s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
+ s_ceil-generic s_floorf-vis3 s_floor-vis3 \
+ s_floorf-generic s_floor-generic s_truncf-vis3 \
+ s_trunc-vis3 s_truncf-generic s_trunc-generic
sysdep_routines += s_signbitf-vis3 s_signbit-vis3 s_finitef-vis3 \
s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
s_isnanf-vis3 s_isnan-vis3
@@ -19,4 +20,3 @@ CFLAGS-s_floor-vis3.c += -Wa,-Av9d -mvis3
CFLAGS-s_truncf-vis3.c += -Wa,-Av9d -mvis3
CFLAGS-s_trunc-vis3.c += -Wa,-Av9d -mvis3
endif
-endif
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
new file mode 100644
index 0000000..febea74
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
@@ -0,0 +1,2 @@
+#define __ceil __ceil_generic
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
index efa05e9..cfd5396 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern double __ceil_vis3 (double);
-extern double __ceil_generic (double);
+extern __typeof (ceil) __ceil_vis3 attribute_hidden;
+extern __typeof (ceil) __ceil_generic attribute_hidden;
-sparc_libm_ifunc(__ceil, hwcap & HWCAP_SPARC_VIS3 ? __ceil_vis3 : __ceil_generic);
+sparc_libm_ifunc (__ceil,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __ceil_vis3
+ : __ceil_generic)
weak_alias (__ceil, ceil)
-
-# define __ceil __ceil_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
new file mode 100644
index 0000000..ce75035
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
@@ -0,0 +1,2 @@
+#define __ceilf __ceilf_generic
+#include <sysdeps/ieee754/flt-32/s_ceilf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
index 62ada7f..81897b5 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern float __ceilf_vis3 (float);
-extern float __ceilf_generic (float);
+extern __typeof (ceilf) __ceilf_vis3 attribute_hidden;
+extern __typeof (ceilf) __ceilf_generic attribute_hidden;
-sparc_libm_ifunc(__ceilf, hwcap & HWCAP_SPARC_VIS3 ? __ceilf_vis3 : __ceilf_generic);
+sparc_libm_ifunc (__ceilf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __ceilf_vis3
+ : __ceilf_generic);
weak_alias (__ceilf, ceilf)
-
-# define __ceilf __ceilf_generic
-#endif
-
-#include <sysdeps/ieee754/flt-32/s_ceilf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
new file mode 100644
index 0000000..0f3361a
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
@@ -0,0 +1,2 @@
+#define __floor __floor_generic
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
index d097f68..9d71158 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern double __floor_vis3 (double);
-extern double __floor_generic (double);
+extern __typeof (floor) __floor_vis3 attribute_hidden;
+extern __typeof (floor) __floor_generic attribute_hidden;
-sparc_libm_ifunc(__floor, hwcap & HWCAP_SPARC_VIS3 ? __floor_vis3 : __floor_generic);
+sparc_libm_ifunc (__floor,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __floor_vis3
+ : __floor_generic);
weak_alias (__floor, floor)
-
-# define __floor __floor_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
new file mode 100644
index 0000000..28c377b
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
@@ -0,0 +1,2 @@
+#define __floorf __floorf_generic
+#include <sysdeps/ieee754/flt-32/s_floorf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
index 2a6c710..09d0a45 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern float __floorf_vis3 (float);
-extern float __floorf_generic (float);
+extern __typeof (floorf) __floorf_vis3 attribute_hidden;
+extern __typeof (floorf) __floorf_generic attribute_hidden;
-sparc_libm_ifunc(__floorf, hwcap & HWCAP_SPARC_VIS3 ? __floorf_vis3 : __floorf_generic);
+sparc_libm_ifunc (__floorf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __floorf_vis3
+ : __floorf_generic);
weak_alias (__floorf, floorf)
-
-# define __floorf __floorf_generic
-#endif
-
-#include <sysdeps/ieee754/flt-32/s_floorf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
new file mode 100644
index 0000000..e40816f
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
@@ -0,0 +1,2 @@
+#define __fma __fma_generic
+#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
index 3f2f162..1b2701c 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
@@ -1,14 +1,11 @@
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern double __fma_vis3 (double, double, double);
-extern double __fma_generic (double, double, double);
+extern __typeof (fma) __fma_vis3 attribute_hidden;
+extern __typeof (fma) __fma_generic attribute_hidden;
-sparc_libm_ifunc(__fma, hwcap & HWCAP_SPARC_FMAF ? __fma_vis3 : __fma_generic);
+sparc_libm_ifunc (__fma,
+ hwcap & HWCAP_SPARC_FMAF
+ ? __fma_vis3
+ : __fma_generic);
weak_alias (__fma, fma)
-
-# define __fma __fma_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
new file mode 100644
index 0000000..218eeb3
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
@@ -0,0 +1,2 @@
+#define __fmaf __fmaf_generic
+#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
index 7a273a3..dbed10e 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
@@ -1,14 +1,11 @@
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern float __fmaf_vis3 (float, float, float);
-extern float __fmaf_generic (float, float, float);
+extern __typeof (fmaf) __fmaf_vis3 attribute_hidden;
+extern __typeof (fmaf) __fmaf_generic attribute_hidden;
-sparc_libm_ifunc(__fmaf, hwcap & HWCAP_SPARC_FMAF ? __fmaf_vis3 : __fmaf_generic);
+sparc_libm_ifunc (__fmaf,
+ hwcap & HWCAP_SPARC_FMAF
+ ? __fmaf_vis3
+ : __fmaf_generic)
weak_alias (__fmaf, fmaf)
-
-# define __fmaf __fmaf_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
new file mode 100644
index 0000000..00abd2a
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
@@ -0,0 +1,2 @@
+#define __trunc __trunc_generic
+#include <sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
index dc67f42..3fd9cc0 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern double __trunc_vis3 (double);
-extern double __trunc_generic (double);
+extern __typeof (trunc) __trunc_vis3 attribute_hidden;
+extern __typeof (trunc) __trunc_generic attribute_hidden;
-sparc_libm_ifunc(__trunc, hwcap & HWCAP_SPARC_VIS3 ? __trunc_vis3 : __trunc_generic);
+sparc_libm_ifunc (__trunc,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __trunc_vis3
+ : __trunc_generic);
weak_alias (__trunc, trunc)
-
-# define __trunc __trunc_generic
-#endif
-
-#include <sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
new file mode 100644
index 0000000..7e5d91e
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
@@ -0,0 +1,2 @@
+#define __truncf __truncf_generic
+#include <sysdeps/ieee754/flt-32/s_truncf.c>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
index 980a313..3c1fa36 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
@@ -16,17 +16,14 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#ifdef HAVE_AS_VIS3_SUPPORT
-# include <sparc-ifunc.h>
-# include <math.h>
+#include <sparc-ifunc.h>
+#include <math.h>
-extern float __truncf_vis3 (float);
-extern float __truncf_generic (float);
+extern __typeof (truncf) __truncf_vis3 attribute_hidden;
+extern __typeof (truncf) __truncf_generic attribute_hidden;
-sparc_libm_ifunc(__truncf, hwcap & HWCAP_SPARC_VIS3 ? __truncf_vis3 : __truncf_generic);
+sparc_libm_ifunc (__truncf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __truncf_vis3
+ : __truncf_generic)
weak_alias (__truncf, truncf)
-
-# define __truncf __truncf_generic
-#endif
-
-#include <sysdeps/ieee754/flt-32/s_truncf.c>
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 05/25] sparc: Assume VIS3 support
2017-10-26 19:07 ` [PATCH 05/25] sparc: Assume VIS3 support Adhemerval Zanella
@ 2017-11-28 17:51 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-28 17:51 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch assumes VIS3 support by binutils, which is support since
> binutils 2.22. This leads to soem code simplification, mostly on
> multiarch build where there is no more 2 variant possible (whether
> binutils supports VIS3 instructions or not).
>
> For multiarch files whether HAVE_AS_VIS3_SUPPORT was checked and
> the default implementation was built with a different name, a new
> file with (implementation with -generic appended) is added.
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * config.h.in (HAVE_AS_VIS3_SUPPORT): Remove check for VIS3 support.
> * sysdeps/sparc/configure.ac (HAVE_AS_VIS3_SUPPORT): Likewise.
> * sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c: Likewise.
> * sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c: Likewise.
> * sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c: Likewise.
> * sysdeps//sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c: Likewise.
> * sysdeps/sparc/sparc-ifunc.h [!HAVE_AS_VIS3_SUPPORT]
> (SPARC_ASM_VIS3_IFUNC, SPARC_ASM_VIS3_VIS2_IFUNC): Remove macros.
> * sysdeps/sparc/sparc32/sparcv9/Makefile [$(have-as-vis3) != yes]
> (ASFLAGS.o, ASFLAGS-.os, ASFLAGS-.op, ASFLAGS-.oS): Remove rules.
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> ($(have-as-vis3) == yes): Remove conditional.
> * sysdeps/sparc/sparc64/Makefile (($(have-as-vis3) == yes)):
> Likewise.
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c: New
> file.
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c: New
> file.
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c: New
> file.
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c: New
> file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c: New file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 51 ++++++++++++++++++++++
> config.h.in | 3 --
> sysdeps/sparc/configure | 42 ------------------
> sysdeps/sparc/configure.ac | 29 ------------
> sysdeps/sparc/sparc-ifunc.h | 13 ------
> sysdeps/sparc/sparc32/sparcv9/Makefile | 7 ---
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 8 ++--
> .../sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c | 4 ++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c | 17 +++-----
> .../sparcv9/fpu/multiarch/s_fdimf-generic.c | 3 ++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c | 12 +----
> .../sparc32/sparcv9/fpu/multiarch/s_fma-generic.c | 2 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c | 12 ++---
> .../sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c | 2 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c | 10 +----
> sysdeps/sparc/sparc64/Makefile | 2 -
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 10 ++---
> .../sparc/sparc64/fpu/multiarch/s_ceil-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_ceilf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_floor-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_floorf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_fma-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_fmaf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_trunc-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c | 19 ++++----
> .../sparc/sparc64/fpu/multiarch/s_truncf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c | 19 ++++----
> 33 files changed, 163 insertions(+), 232 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
>
> diff --git a/config.h.in b/config.h.in
> index c140ff3..8d76dad 100644
> --- a/config.h.in
> +++ b/config.h.in
> @@ -50,9 +50,6 @@
> /* Defined on SPARC if GCC emits GOTDATA relocations. */
> #undef HAVE_GCC_GOTDATA
>
> -/* Define on SPARC if AS supports VIS3 instructions. */
> -#undef HAVE_AS_VIS3_SUPPORT
> -
> /* Define if the linker supports the -z combreloc option. */
> #undef HAVE_Z_COMBRELOC
>
> diff --git a/sysdeps/sparc/configure b/sysdeps/sparc/configure
> index 90a86f6..bc6ac14 100644
> --- a/sysdeps/sparc/configure
> +++ b/sysdeps/sparc/configure
> @@ -1,48 +1,6 @@
> # This file is generated from configure.ac by Autoconf. DO NOT EDIT!
> # Local configure fragment for sysdeps/sparc.
>
> -# Check for support of VIS3 et al. instructions in the assembler.
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sparc assembler VIS3 support" >&5
> -$as_echo_n "checking for sparc assembler VIS3 support... " >&6; }
> -if ${libc_cv_sparc_as_vis3+:} false; then :
> - $as_echo_n "(cached) " >&6
> -else
> - cat > conftest.S <<\EOF
> - .text
> -foo: fmadds %f1, %f2, %f3, %f5
> - fmaddd %f2, %f4, %f8, %f10
> - fhadds %f2, %f3, %f5
> - fhaddd %f4, %f8, %f10
> - pdistn %f2, %f4, %g1
> - movdtox %f10, %o0
> - movstouw %f9, %o1
> - movstosw %f7, %o2
> - movxtod %o3, %f18
> - movwtos %o4, %f15
> - flcmps %fcc0, %f3, %f5
> - flcmpd %fcc1, %f4, %f6
> -EOF
> -if { ac_try='${CC-cc} -c $CFLAGS -Wa,-Av9d conftest.S'
> - { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> - (eval $ac_try) 2>&5
> - ac_status=$?
> - $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> - test $ac_status = 0; }; }; then
> - libc_cv_sparc_as_vis3=yes
> -else
> - libc_cv_sparc_as_vis3=no
> -fi
> -rm -f conftest*
> -fi
> -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_sparc_as_vis3" >&5
> -$as_echo "$libc_cv_sparc_as_vis3" >&6; }
> -if test $libc_cv_sparc_as_vis3 = yes; then
> - $as_echo "#define HAVE_AS_VIS3_SUPPORT 1" >>confdefs.h
> -
> -fi
> -config_vars="$config_vars
> -have-as-vis3 = $libc_cv_sparc_as_vis3"
> -
> # Check for a GCC emitting GOTDATA relocations.
> { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sparc gcc GOTDATA reloc support" >&5
> $as_echo_n "checking for sparc gcc GOTDATA reloc support... " >&6; }
> diff --git a/sysdeps/sparc/configure.ac b/sysdeps/sparc/configure.ac
> index 982077c..43ad541 100644
> --- a/sysdeps/sparc/configure.ac
> +++ b/sysdeps/sparc/configure.ac
> @@ -1,35 +1,6 @@
> GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
> # Local configure fragment for sysdeps/sparc.
>
> -# Check for support of VIS3 et al. instructions in the assembler.
> -AC_CACHE_CHECK(for sparc assembler VIS3 support, libc_cv_sparc_as_vis3, [dnl
> -cat > conftest.S <<\EOF
> - .text
> -foo: fmadds %f1, %f2, %f3, %f5
> - fmaddd %f2, %f4, %f8, %f10
> - fhadds %f2, %f3, %f5
> - fhaddd %f4, %f8, %f10
> - pdistn %f2, %f4, %g1
> - movdtox %f10, %o0
> - movstouw %f9, %o1
> - movstosw %f7, %o2
> - movxtod %o3, %f18
> - movwtos %o4, %f15
> - flcmps %fcc0, %f3, %f5
> - flcmpd %fcc1, %f4, %f6
> -EOF
> -dnl
> -if AC_TRY_COMMAND([${CC-cc} -c $CFLAGS -Wa,-Av9d conftest.S]); then
> - libc_cv_sparc_as_vis3=yes
> -else
> - libc_cv_sparc_as_vis3=no
> -fi
> -rm -f conftest*])
> -if test $libc_cv_sparc_as_vis3 = yes; then
> - AC_DEFINE(HAVE_AS_VIS3_SUPPORT)
> -fi
> -LIBC_CONFIG_VAR([have-as-vis3], [$libc_cv_sparc_as_vis3])
> -
> # Check for a GCC emitting GOTDATA relocations.
> AC_CACHE_CHECK(for sparc gcc GOTDATA reloc support, libc_cv_sparc_gcc_gotdata, [dnl
> changequote(,)dnl
> diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
> index 044fe36..54420d8 100644
> --- a/sysdeps/sparc/sparc-ifunc.h
> +++ b/sysdeps/sparc/sparc-ifunc.h
> @@ -137,8 +137,6 @@ END (__##name)
> SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS2, \
> __##name##_vis2, __##name##_generic)
>
> -# ifdef HAVE_AS_VIS3_SUPPORT
> -
> #define SPARC_ASM_VIS3_IFUNC(name) \
> SPARC_ASM_IFUNC1(name, HWCAP_SPARC_VIS3, \
> __##name##_vis3, __##name##_generic)
> @@ -149,17 +147,6 @@ END (__##name)
> HWCAP_SPARC_VIS2, \
> __##name##_vis2, __##name##_generic)
>
> -# else /* HAVE_AS_VIS3_SUPPORT */
> -
> -#define SPARC_ASM_VIS3_IFUNC(name) \
> - SPARC_ASM_IFUNC_DFLT(name, __##name##_generic)
> -
> -#define SPARC_ASM_VIS3_VIS2_IFUNC(name) \
> - SPARC_ASM_VIS2_IFUNC(name)
> -
> -# endif /* HAVE_AS_VIS3_SUPPORT */
> -
> -
> #else /* __ASSEMBLER__ */
> # define INIT_ARCH()
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/Makefile b/sysdeps/sparc/sparc32/sparcv9/Makefile
> index 526673e..45507ea 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/Makefile
> @@ -1,16 +1,9 @@
> sysdep-CFLAGS += -mcpu=ultrasparc -Wa,-Av9a -mvis
>
> -ifeq ($(have-as-vis3),yes)
> ASFLAGS-.o += -Wa,-Av9d
> ASFLAGS-.os += -Wa,-Av9d
> ASFLAGS-.op += -Wa,-Av9d
> ASFLAGS-.oS += -Wa,-Av9d
> -else
> -ASFLAGS-.o += -Wa,-Av9a
> -ASFLAGS-.os += -Wa,-Av9a
> -ASFLAGS-.op += -Wa,-Av9a
> -ASFLAGS-.oS += -Wa,-Av9a
> -endif
>
> # nscd uses atomic_spin_nop which in turn requires cpu_relax
> ifeq ($(subdir),nscd)
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index 2a2d374..62bf6f1 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -1,13 +1,13 @@
> ifeq ($(subdir),math)
> -ifeq ($(have-as-vis3),yes)
> libm-sysdep_routines += m_copysignf-vis3 m_copysign-vis3 s_fabs-vis3 \
> s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
> s_rintf-vis3 s_rint-vis3 \
> - s_fmaf-vis3 s_fma-vis3 s_nearbyint-vis3 \
> - s_nearbyintf-vis3 s_fdimf-vis3 s_fdim-vis3
> + s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> + s_nearbyint-vis3 s_nearbyintf-vis3 \
> + s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
> + s_fdimf-generic
> sysdep_routines += s_copysignf-vis3 s_copysign-vis3
>
> CFLAGS-s_fdimf-vis3.c += -Wa,-Av9d -mvis3
> CFLAGS-s_fdim-vis3.c += -Wa,-Av9d -mvis3
> endif
> -endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
> new file mode 100644
> index 0000000..30ee54b
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
> @@ -0,0 +1,4 @@
> +#define __fdim __fdim_generic
> +#define declare_mgen_alias(t, f)
> +
> +#include <math/s_fdim.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
> index ff3acd4..fe483f6 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c
> @@ -16,23 +16,16 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <math_ldbl_opt.h>
> -# include <first-versions.h>
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <math_ldbl_opt.h>
> +#include <first-versions.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> extern double __fdim_vis3 (double, double);
> extern double __fdim_generic (double, double);
>
> sparc_libm_ifunc(__fdim, hwcap & HWCAP_SPARC_VIS3 ? __fdim_vis3 : __fdim_generic);
> weak_alias (__fdim, fdim)
> -# if LONG_DOUBLE_COMPAT (libm, FIRST_VERSION_libm_fdiml)
> +#if LONG_DOUBLE_COMPAT (libm, FIRST_VERSION_libm_fdiml)
> compat_symbol (libm, __fdim, fdiml, FIRST_VERSION_libm_fdiml);
> -# endif
> -
> -# define __fdim __fdim_generic
> -# define declare_mgen_alias(t, f)
> #endif
> -
> -#include <math/s_fdim.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
> new file mode 100644
> index 0000000..17090b5
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
> @@ -0,0 +1,3 @@
> +#define __fdimf __fdimf_generic
> +#define declare_mgen_alias(t, f)
> +#include <math/s_fdimf.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
> index cf1dc9e..ced4593 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c
> @@ -16,19 +16,11 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> extern float __fdimf_vis3 (float, float);
> extern float __fdimf_generic (float, float);
>
> sparc_libm_ifunc(__fdimf, hwcap & HWCAP_SPARC_VIS3 ? __fdimf_vis3 : __fdimf_generic);
> weak_alias (__fdimf, fdimf)
> -
> -# define __fdimf __fdimf_generic
> -# define declare_mgen_alias(t, f)
> -
> -#endif
> -
> -#include <math/s_fdimf.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
> new file mode 100644
> index 0000000..e40816f
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
> @@ -0,0 +1,2 @@
> +#define __fma __fma_generic
> +#include <sysdeps/ieee754/dbl-64/s_fma.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
> index 05113c3..3d0c165 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c
> @@ -1,7 +1,6 @@
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> -# include <math_ldbl_opt.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
> +#include <math_ldbl_opt.h>
>
> extern double __fma_vis3 (double, double, double);
> extern double __fma_generic (double, double, double);
> @@ -11,8 +10,3 @@ weak_alias (__fma, fma)
> #if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
> compat_symbol (libm, __fma, fmal, GLIBC_2_1);
> #endif
> -
> -# define __fma __fma_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/s_fma.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
> new file mode 100644
> index 0000000..218eeb3
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
> @@ -0,0 +1,2 @@
> +#define __fmaf __fmaf_generic
> +#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
> index 7a273a3..5357b47 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c
> @@ -1,14 +1,8 @@
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> extern float __fmaf_vis3 (float, float, float);
> extern float __fmaf_generic (float, float, float);
>
> sparc_libm_ifunc(__fmaf, hwcap & HWCAP_SPARC_FMAF ? __fmaf_vis3 : __fmaf_generic);
> weak_alias (__fmaf, fmaf)
> -
> -# define __fmaf __fmaf_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
> diff --git a/sysdeps/sparc/sparc64/Makefile b/sysdeps/sparc/sparc64/Makefile
> index a5e4036..0963a55 100644
> --- a/sysdeps/sparc/sparc64/Makefile
> +++ b/sysdeps/sparc/sparc64/Makefile
> @@ -4,12 +4,10 @@ ifeq ($(subdir),string)
> sysdep_routines += align-cpy
> endif
>
> -ifeq ($(have-as-vis3),yes)
> ASFLAGS-.o += -Wa,-Av9d
> ASFLAGS-.os += -Wa,-Av9d
> ASFLAGS-.op += -Wa,-Av9d
> ASFLAGS-.oS += -Wa,-Av9d
> -endif
>
> # nscd uses atomic_spin_nop which in turn requires cpu_relax
> ifeq ($(subdir),nscd)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index 03a271d..2ac4496 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -1,13 +1,14 @@
> ifeq ($(subdir),math)
> -ifeq ($(have-as-vis3),yes)
> libm-sysdep_routines += m_signbitf-vis3 m_signbit-vis3 m_finitef-vis3 \
> m_finite-vis3 m_isinff-vis3 m_isinf-vis3 \
> m_isnanf-vis3 m_isnan-vis3 s_lrintf-vis3 \
> s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> - s_fmaf-vis3 s_fma-vis3 \
> + s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> - s_ceilf-vis3 s_ceil-vis3 s_floorf-vis3 \
> - s_floor-vis3 s_truncf-vis3 s_trunc-vis3
> + s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
> + s_ceil-generic s_floorf-vis3 s_floor-vis3 \
> + s_floorf-generic s_floor-generic s_truncf-vis3 \
> + s_trunc-vis3 s_truncf-generic s_trunc-generic
> sysdep_routines += s_signbitf-vis3 s_signbit-vis3 s_finitef-vis3 \
> s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
> s_isnanf-vis3 s_isnan-vis3
> @@ -19,4 +20,3 @@ CFLAGS-s_floor-vis3.c += -Wa,-Av9d -mvis3
> CFLAGS-s_truncf-vis3.c += -Wa,-Av9d -mvis3
> CFLAGS-s_trunc-vis3.c += -Wa,-Av9d -mvis3
> endif
> -endif
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
> new file mode 100644
> index 0000000..febea74
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
> @@ -0,0 +1,2 @@
> +#define __ceil __ceil_generic
> +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
> index efa05e9..cfd5396 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern double __ceil_vis3 (double);
> -extern double __ceil_generic (double);
> +extern __typeof (ceil) __ceil_vis3 attribute_hidden;
> +extern __typeof (ceil) __ceil_generic attribute_hidden;
>
> -sparc_libm_ifunc(__ceil, hwcap & HWCAP_SPARC_VIS3 ? __ceil_vis3 : __ceil_generic);
> +sparc_libm_ifunc (__ceil,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __ceil_vis3
> + : __ceil_generic)
> weak_alias (__ceil, ceil)
> -
> -# define __ceil __ceil_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/wordsize-64/s_ceil.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
> new file mode 100644
> index 0000000..ce75035
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
> @@ -0,0 +1,2 @@
> +#define __ceilf __ceilf_generic
> +#include <sysdeps/ieee754/flt-32/s_ceilf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
> index 62ada7f..81897b5 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern float __ceilf_vis3 (float);
> -extern float __ceilf_generic (float);
> +extern __typeof (ceilf) __ceilf_vis3 attribute_hidden;
> +extern __typeof (ceilf) __ceilf_generic attribute_hidden;
>
> -sparc_libm_ifunc(__ceilf, hwcap & HWCAP_SPARC_VIS3 ? __ceilf_vis3 : __ceilf_generic);
> +sparc_libm_ifunc (__ceilf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __ceilf_vis3
> + : __ceilf_generic);
> weak_alias (__ceilf, ceilf)
> -
> -# define __ceilf __ceilf_generic
> -#endif
> -
> -#include <sysdeps/ieee754/flt-32/s_ceilf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
> new file mode 100644
> index 0000000..0f3361a
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
> @@ -0,0 +1,2 @@
> +#define __floor __floor_generic
> +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
> index d097f68..9d71158 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern double __floor_vis3 (double);
> -extern double __floor_generic (double);
> +extern __typeof (floor) __floor_vis3 attribute_hidden;
> +extern __typeof (floor) __floor_generic attribute_hidden;
>
> -sparc_libm_ifunc(__floor, hwcap & HWCAP_SPARC_VIS3 ? __floor_vis3 : __floor_generic);
> +sparc_libm_ifunc (__floor,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __floor_vis3
> + : __floor_generic);
> weak_alias (__floor, floor)
> -
> -# define __floor __floor_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/wordsize-64/s_floor.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
> new file mode 100644
> index 0000000..28c377b
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
> @@ -0,0 +1,2 @@
> +#define __floorf __floorf_generic
> +#include <sysdeps/ieee754/flt-32/s_floorf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
> index 2a6c710..09d0a45 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern float __floorf_vis3 (float);
> -extern float __floorf_generic (float);
> +extern __typeof (floorf) __floorf_vis3 attribute_hidden;
> +extern __typeof (floorf) __floorf_generic attribute_hidden;
>
> -sparc_libm_ifunc(__floorf, hwcap & HWCAP_SPARC_VIS3 ? __floorf_vis3 : __floorf_generic);
> +sparc_libm_ifunc (__floorf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __floorf_vis3
> + : __floorf_generic);
> weak_alias (__floorf, floorf)
> -
> -# define __floorf __floorf_generic
> -#endif
> -
> -#include <sysdeps/ieee754/flt-32/s_floorf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
> new file mode 100644
> index 0000000..e40816f
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
> @@ -0,0 +1,2 @@
> +#define __fma __fma_generic
> +#include <sysdeps/ieee754/dbl-64/s_fma.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
> index 3f2f162..1b2701c 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c
> @@ -1,14 +1,11 @@
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern double __fma_vis3 (double, double, double);
> -extern double __fma_generic (double, double, double);
> +extern __typeof (fma) __fma_vis3 attribute_hidden;
> +extern __typeof (fma) __fma_generic attribute_hidden;
>
> -sparc_libm_ifunc(__fma, hwcap & HWCAP_SPARC_FMAF ? __fma_vis3 : __fma_generic);
> +sparc_libm_ifunc (__fma,
> + hwcap & HWCAP_SPARC_FMAF
> + ? __fma_vis3
> + : __fma_generic);
> weak_alias (__fma, fma)
> -
> -# define __fma __fma_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/s_fma.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
> new file mode 100644
> index 0000000..218eeb3
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
> @@ -0,0 +1,2 @@
> +#define __fmaf __fmaf_generic
> +#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
> index 7a273a3..dbed10e 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c
> @@ -1,14 +1,11 @@
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern float __fmaf_vis3 (float, float, float);
> -extern float __fmaf_generic (float, float, float);
> +extern __typeof (fmaf) __fmaf_vis3 attribute_hidden;
> +extern __typeof (fmaf) __fmaf_generic attribute_hidden;
>
> -sparc_libm_ifunc(__fmaf, hwcap & HWCAP_SPARC_FMAF ? __fmaf_vis3 : __fmaf_generic);
> +sparc_libm_ifunc (__fmaf,
> + hwcap & HWCAP_SPARC_FMAF
> + ? __fmaf_vis3
> + : __fmaf_generic)
> weak_alias (__fmaf, fmaf)
> -
> -# define __fmaf __fmaf_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/s_fmaf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
> new file mode 100644
> index 0000000..00abd2a
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
> @@ -0,0 +1,2 @@
> +#define __trunc __trunc_generic
> +#include <sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
> index dc67f42..3fd9cc0 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern double __trunc_vis3 (double);
> -extern double __trunc_generic (double);
> +extern __typeof (trunc) __trunc_vis3 attribute_hidden;
> +extern __typeof (trunc) __trunc_generic attribute_hidden;
>
> -sparc_libm_ifunc(__trunc, hwcap & HWCAP_SPARC_VIS3 ? __trunc_vis3 : __trunc_generic);
> +sparc_libm_ifunc (__trunc,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __trunc_vis3
> + : __trunc_generic);
> weak_alias (__trunc, trunc)
> -
> -# define __trunc __trunc_generic
> -#endif
> -
> -#include <sysdeps/ieee754/dbl-64/wordsize-64/s_trunc.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
> new file mode 100644
> index 0000000..7e5d91e
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
> @@ -0,0 +1,2 @@
> +#define __truncf __truncf_generic
> +#include <sysdeps/ieee754/flt-32/s_truncf.c>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
> index 980a313..3c1fa36 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c
> @@ -16,17 +16,14 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> -#ifdef HAVE_AS_VIS3_SUPPORT
> -# include <sparc-ifunc.h>
> -# include <math.h>
> +#include <sparc-ifunc.h>
> +#include <math.h>
>
> -extern float __truncf_vis3 (float);
> -extern float __truncf_generic (float);
> +extern __typeof (truncf) __truncf_vis3 attribute_hidden;
> +extern __typeof (truncf) __truncf_generic attribute_hidden;
>
> -sparc_libm_ifunc(__truncf, hwcap & HWCAP_SPARC_VIS3 ? __truncf_vis3 : __truncf_generic);
> +sparc_libm_ifunc (__truncf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __truncf_vis3
> + : __truncf_generic)
> weak_alias (__truncf, truncf)
> -
> -# define __truncf __truncf_generic
> -#endif
> -
> -#include <sysdeps/ieee754/flt-32/s_truncf.c>
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 02/25] arm: Implement memchr ifunc selection in C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (10 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 05/25] sparc: Assume VIS3 support Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-10-31 18:18 ` Joseph Myers
2017-10-26 19:07 ` [PATCH 08/25] sparc: refactor sparc64 isinf{f} selector to C Adhemerval Zanella
` (13 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactor ARM memchr ifunc selector to a C implementation.
No functional change is expected, including ifunc resolution rules.
It also reorganize the ifunc options code:
1. The memchr_impl.S is renamed to memchr_neon.S and multiple
compilation options (which route to armv6t2/memchr one) is
removed. The code to build if __ARM_NEON__ is defined is
also simplified.
2. A memchr_noneon is added (which as build along previous ifunc
resolution) and includes the armv6t2 direct.
3. Same as 2. for loader object.
Alongside the aforementioned changes, it also some cleanus:
- Internal memchr definition (__GI_memcpy) is now a hidden
symbol.
- No need to create hidden definition for the ifunc variants.
Checked on armv7-linux-gnueabihf and with a build for arm-linux-gnueabi,
arm-linux-gnueabihf with and without multiarch support and with both
GCC 7.1 and GCC mainline.
* sysdeps/arm/armv7/multiarch/Makefile [$(subdir) = string]
(sysdeps_routines): Add memchr_noneon.
* sysdeps/arm/armv7/multiarch/ifunc-memchr.h: New file.
* sysdeps/arm/armv7/multiarch/memchr_noneon.S: Likewise.
* sysdeps/arm/armv7/multiarch/rtld-memchr.S: Likewise.
* sysdeps/arm/armv7/multiarch/memchr.S: Remove file.
* sysdeps/arm/armv7/multiarch/memchr.c: New file.
* sysdeps/arm/armv7/multiarch/memchr_impl.S: Move to ...
* sysdeps/arm/armv7/multiarch/memchr_neon.S: ... here.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 10 ++
sysdeps/arm/armv7/multiarch/Makefile | 3 +-
sysdeps/arm/armv7/multiarch/ifunc-memchr.h | 28 ++++
sysdeps/arm/armv7/multiarch/memchr.S | 59 --------
sysdeps/arm/armv7/multiarch/memchr.c | 35 +++++
sysdeps/arm/armv7/multiarch/memchr_impl.S | 219 ---------------------------
sysdeps/arm/armv7/multiarch/memchr_neon.S | 221 +++++++++++++++++++++++++++-
sysdeps/arm/armv7/multiarch/memchr_noneon.S | 5 +
sysdeps/arm/armv7/multiarch/rtld-memchr.S | 1 +
9 files changed, 296 insertions(+), 285 deletions(-)
create mode 100644 sysdeps/arm/armv7/multiarch/ifunc-memchr.h
delete mode 100644 sysdeps/arm/armv7/multiarch/memchr.S
create mode 100644 sysdeps/arm/armv7/multiarch/memchr.c
delete mode 100644 sysdeps/arm/armv7/multiarch/memchr_impl.S
create mode 100644 sysdeps/arm/armv7/multiarch/memchr_noneon.S
create mode 100644 sysdeps/arm/armv7/multiarch/rtld-memchr.S
diff --git a/sysdeps/arm/armv7/multiarch/Makefile b/sysdeps/arm/armv7/multiarch/Makefile
index 1e62ef9..6e5851f 100644
--- a/sysdeps/arm/armv7/multiarch/Makefile
+++ b/sysdeps/arm/armv7/multiarch/Makefile
@@ -1,3 +1,4 @@
ifeq ($(subdir),string)
-sysdep_routines += memcpy_neon memcpy_vfp memchr_neon memcpy_arm
+sysdep_routines += memcpy_neon memcpy_vfp memchr_neon memcpy_arm \
+ memchr_noneon
endif
diff --git a/sysdeps/arm/armv7/multiarch/ifunc-memchr.h b/sysdeps/arm/armv7/multiarch/ifunc-memchr.h
new file mode 100644
index 0000000..42f89fa
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/ifunc-memchr.h
@@ -0,0 +1,28 @@
+/* Common definition for memchr resolver.
+ Copyright (C) 2017 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/>. */
+
+__typeof (REDIRECT_NAME) OPTIMIZE (neon) attribute_hidden;
+__typeof (REDIRECT_NAME) OPTIMIZE (noneon) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_ARM_NEON)
+ return OPTIMIZE (neon);
+ return OPTIMIZE (noneon);
+}
diff --git a/sysdeps/arm/armv7/multiarch/memchr.S b/sysdeps/arm/armv7/multiarch/memchr.S
deleted file mode 100644
index 8e8097a..0000000
--- a/sysdeps/arm/armv7/multiarch/memchr.S
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Multiple versions of memchr
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2013-2017 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 <rtld-global-offsets.h>
-
-#if IS_IN (libc)
-/* Under __ARM_NEON__, memchr_neon.S defines the name memchr. */
-# ifndef __ARM_NEON__
- .text
- .arm
-ENTRY(memchr)
- .type memchr, %gnu_indirect_function
- ldr r1, .Lmemchr_noneon
- tst r0, #HWCAP_ARM_NEON
- ldrne r1, .Lmemchr_neon
-1:
- add r0, r1, pc
- DO_RET(lr)
-
-.Lmemchr_noneon:
- .long C_SYMBOL_NAME(__memchr_noneon) - 1b - 8
-.Lmemchr_neon:
- .long C_SYMBOL_NAME(__memchr_neon) - 1b - 8
-
-END(memchr)
-
-libc_hidden_builtin_def (memchr)
-# endif /* Not __ARM_NEON__. */
-libc_hidden_def (__memchr_noneon)
-
-# undef libc_hidden_builtin_def
-# define libc_hidden_builtin_def(name)
-# undef weak_alias
-# define weak_alias(x, y)
-# undef libc_hidden_def
-# define libc_hidden_def(name)
-
-# define memchr __memchr_noneon
-
-#endif
-
-#include "memchr_impl.S"
diff --git a/sysdeps/arm/armv7/multiarch/memchr.c b/sysdeps/arm/armv7/multiarch/memchr.c
new file mode 100644
index 0000000..906bcd5
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/memchr.c
@@ -0,0 +1,35 @@
+/* Multiple versions of memchr.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+/* For __ARM_NEON__ memchr_neon.S defines memchr directly and ifunc
+ is not used. */
+#if IS_IN (libc) && !defined (__ARM_NEON__)
+# define memchr __redirect_memchr
+# include <string.h>
+# undef memchr
+
+# include <arm-ifunc.h>
+
+# define SYMBOL_NAME memchr
+# include "ifunc-memchr.h"
+
+arm_libc_ifunc_redirected (__redirect_memchr, memchr, IFUNC_SELECTOR);
+
+arm_libc_ifunc_hidden_def (__redirect_memchr, memchr);
+#endif
diff --git a/sysdeps/arm/armv7/multiarch/memchr_impl.S b/sysdeps/arm/armv7/multiarch/memchr_impl.S
deleted file mode 100644
index e8cbb97..0000000
--- a/sysdeps/arm/armv7/multiarch/memchr_impl.S
+++ /dev/null
@@ -1,219 +0,0 @@
-/* memchr implemented using NEON.
- Copyright (C) 2011-2017 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/>. */
-
-#ifdef MEMCHR_NEON
-
-#include <sysdep.h>
-
- .arch armv7-a
- .fpu neon
-
-
-/* Arguments */
-#define srcin r0
-#define chrin r1
-#define cntin r2
-
-/* Retval */
-#define result r0 /* Live range does not overlap with srcin */
-
-/* Working registers */
-#define src r1 /* Live range does not overlap with chrin */
-#define tmp r3
-#define synd r0 /* No overlap with srcin or result */
-#define soff r12
-
-/* Working NEON registers */
-#define vrepchr q0
-#define vdata0 q1
-#define vdata0_0 d2 /* Lower half of vdata0 */
-#define vdata0_1 d3 /* Upper half of vdata0 */
-#define vdata1 q2
-#define vdata1_0 d4 /* Lower half of vhas_chr0 */
-#define vdata1_1 d5 /* Upper half of vhas_chr0 */
-#define vrepmask q3
-#define vrepmask0 d6
-#define vrepmask1 d7
-#define vend q4
-#define vend0 d8
-#define vend1 d9
-
-/*
- * Core algorithm:
- *
- * For each 32-byte chunk we calculate a 32-bit syndrome value, with one bit per
- * byte. Each bit is set if the relevant byte matched the requested character
- * and cleared otherwise. Since the bits in the syndrome reflect exactly the
- * order in which things occur in the original string, counting trailing zeros
- * allows to identify exactly which byte has matched.
- */
-
-#ifndef NO_THUMB
- .thumb_func
-#else
- .arm
-#endif
- .p2align 4,,15
-
-ENTRY(memchr)
- /* Use a simple loop if there are less than 8 bytes to search. */
- cmp cntin, #7
- bhi .Llargestr
- and chrin, chrin, #0xff
-
-.Lsmallstr:
- subs cntin, cntin, #1
- blo .Lnotfound /* Return not found if reached end. */
- ldrb tmp, [srcin], #1
- cmp tmp, chrin
- bne .Lsmallstr /* Loop again if not found. */
- /* Otherwise fixup address and return. */
- sub result, srcin, #1
- bx lr
-
-
-.Llargestr:
- vdup.8 vrepchr, chrin /* Duplicate char across all lanes. */
- /*
- * Magic constant 0x8040201008040201 allows us to identify which lane
- * matches the requested byte.
- */
- movw tmp, #0x0201
- movt tmp, #0x0804
- lsl soff, tmp, #4
- vmov vrepmask0, tmp, soff
- vmov vrepmask1, tmp, soff
- /* Work with aligned 32-byte chunks */
- bic src, srcin, #31
- ands soff, srcin, #31
- beq .Lloopintro /* Go straight to main loop if it's aligned. */
-
- /*
- * Input string is not 32-byte aligned. We calculate the syndrome
- * value for the aligned 32 bytes block containing the first bytes
- * and mask the irrelevant part.
- */
- vld1.8 {vdata0, vdata1}, [src:256]!
- sub tmp, soff, #32
- adds cntin, cntin, tmp
- vceq.i8 vdata0, vdata0, vrepchr
- vceq.i8 vdata1, vdata1, vrepchr
- vand vdata0, vdata0, vrepmask
- vand vdata1, vdata1, vrepmask
- vpadd.i8 vdata0_0, vdata0_0, vdata0_1
- vpadd.i8 vdata1_0, vdata1_0, vdata1_1
- vpadd.i8 vdata0_0, vdata0_0, vdata1_0
- vpadd.i8 vdata0_0, vdata0_0, vdata0_0
- vmov synd, vdata0_0[0]
-
- /* Clear the soff lower bits */
- lsr synd, synd, soff
- lsl synd, synd, soff
- /* The first block can also be the last */
- bls .Lmasklast
- /* Have we found something already? */
-#ifndef NO_THUMB
- cbnz synd, .Ltail
-#else
- cmp synd, #0
- bne .Ltail
-#endif
-
-
-.Lloopintro:
- vpush {vend}
- /* 264/265 correspond to d8/d9 for q4 */
- cfi_adjust_cfa_offset (16)
- cfi_rel_offset (264, 0)
- cfi_rel_offset (265, 8)
- .p2align 3,,7
-.Lloop:
- vld1.8 {vdata0, vdata1}, [src:256]!
- subs cntin, cntin, #32
- vceq.i8 vdata0, vdata0, vrepchr
- vceq.i8 vdata1, vdata1, vrepchr
- /* If we're out of data we finish regardless of the result. */
- bls .Lend
- /* Use a fast check for the termination condition. */
- vorr vend, vdata0, vdata1
- vorr vend0, vend0, vend1
- vmov synd, tmp, vend0
- orrs synd, synd, tmp
- /* We're not out of data, loop if we haven't found the character. */
- beq .Lloop
-
-.Lend:
- vpop {vend}
- cfi_adjust_cfa_offset (-16)
- cfi_restore (264)
- cfi_restore (265)
-
- /* Termination condition found, let's calculate the syndrome value. */
- vand vdata0, vdata0, vrepmask
- vand vdata1, vdata1, vrepmask
- vpadd.i8 vdata0_0, vdata0_0, vdata0_1
- vpadd.i8 vdata1_0, vdata1_0, vdata1_1
- vpadd.i8 vdata0_0, vdata0_0, vdata1_0
- vpadd.i8 vdata0_0, vdata0_0, vdata0_0
- vmov synd, vdata0_0[0]
-#ifndef NO_THUMB
- cbz synd, .Lnotfound
- bhi .Ltail /* Uses the condition code from
- subs cntin, cntin, #32 above. */
-#else
- cmp synd, #0
- beq .Lnotfound
- cmp cntin, #0
- bhi .Ltail
-#endif
-
-
-.Lmasklast:
- /* Clear the (-cntin) upper bits to avoid out-of-bounds matches. */
- neg cntin, cntin
- lsl synd, synd, cntin
- lsrs synd, synd, cntin
- it eq
- moveq src, #0 /* If no match, set src to 0 so the retval is 0. */
-
-
-.Ltail:
- /* Count the trailing zeros using bit reversing */
- rbit synd, synd
- /* Compensate the last post-increment */
- sub src, src, #32
- /* Count the leading zeros */
- clz synd, synd
- /* Compute the potential result and return */
- add result, src, synd
- bx lr
-
-
-.Lnotfound:
- /* Set result to NULL if not found and return */
- mov result, #0
- bx lr
-
-END(memchr)
-libc_hidden_builtin_def (memchr)
-
-#else
-
-#include "../../armv6t2/memchr.S"
-
-#endif
diff --git a/sysdeps/arm/armv7/multiarch/memchr_neon.S b/sysdeps/arm/armv7/multiarch/memchr_neon.S
index ee21818..a400033 100644
--- a/sysdeps/arm/armv7/multiarch/memchr_neon.S
+++ b/sysdeps/arm/armv7/multiarch/memchr_neon.S
@@ -1,9 +1,218 @@
-#ifdef __ARM_NEON__
-/* Under __ARM_NEON__, this file defines memchr directly. */
-libc_hidden_builtin_def (memchr)
-#else
+/* memchr implemented using NEON.
+ Copyright (C) 2011-2017 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>
+
+/* For __ARM_NEON__ this file defines memchr. */
+#ifndef __ARM_NEON__
# define memchr __memchr_neon
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(a)
+#endif
+
+ .arch armv7-a
+ .fpu neon
+
+
+/* Arguments */
+#define srcin r0
+#define chrin r1
+#define cntin r2
+
+/* Retval */
+#define result r0 /* Live range does not overlap with srcin */
+
+/* Working registers */
+#define src r1 /* Live range does not overlap with chrin */
+#define tmp r3
+#define synd r0 /* No overlap with srcin or result */
+#define soff r12
+
+/* Working NEON registers */
+#define vrepchr q0
+#define vdata0 q1
+#define vdata0_0 d2 /* Lower half of vdata0 */
+#define vdata0_1 d3 /* Upper half of vdata0 */
+#define vdata1 q2
+#define vdata1_0 d4 /* Lower half of vhas_chr0 */
+#define vdata1_1 d5 /* Upper half of vhas_chr0 */
+#define vrepmask q3
+#define vrepmask0 d6
+#define vrepmask1 d7
+#define vend q4
+#define vend0 d8
+#define vend1 d9
+
+/*
+ * Core algorithm:
+ *
+ * For each 32-byte chunk we calculate a 32-bit syndrome value, with one bit per
+ * byte. Each bit is set if the relevant byte matched the requested character
+ * and cleared otherwise. Since the bits in the syndrome reflect exactly the
+ * order in which things occur in the original string, counting trailing zeros
+ * allows to identify exactly which byte has matched.
+ */
+
+#ifndef NO_THUMB
+ .thumb_func
+#else
+ .arm
+#endif
+ .p2align 4,,15
+
+ENTRY(memchr)
+ /* Use a simple loop if there are less than 8 bytes to search. */
+ cmp cntin, #7
+ bhi .Llargestr
+ and chrin, chrin, #0xff
+
+.Lsmallstr:
+ subs cntin, cntin, #1
+ blo .Lnotfound /* Return not found if reached end. */
+ ldrb tmp, [srcin], #1
+ cmp tmp, chrin
+ bne .Lsmallstr /* Loop again if not found. */
+ /* Otherwise fixup address and return. */
+ sub result, srcin, #1
+ bx lr
+
+
+.Llargestr:
+ vdup.8 vrepchr, chrin /* Duplicate char across all lanes. */
+ /*
+ * Magic constant 0x8040201008040201 allows us to identify which lane
+ * matches the requested byte.
+ */
+ movw tmp, #0x0201
+ movt tmp, #0x0804
+ lsl soff, tmp, #4
+ vmov vrepmask0, tmp, soff
+ vmov vrepmask1, tmp, soff
+ /* Work with aligned 32-byte chunks */
+ bic src, srcin, #31
+ ands soff, srcin, #31
+ beq .Lloopintro /* Go straight to main loop if it's aligned. */
+
+ /*
+ * Input string is not 32-byte aligned. We calculate the syndrome
+ * value for the aligned 32 bytes block containing the first bytes
+ * and mask the irrelevant part.
+ */
+ vld1.8 {vdata0, vdata1}, [src:256]!
+ sub tmp, soff, #32
+ adds cntin, cntin, tmp
+ vceq.i8 vdata0, vdata0, vrepchr
+ vceq.i8 vdata1, vdata1, vrepchr
+ vand vdata0, vdata0, vrepmask
+ vand vdata1, vdata1, vrepmask
+ vpadd.i8 vdata0_0, vdata0_0, vdata0_1
+ vpadd.i8 vdata1_0, vdata1_0, vdata1_1
+ vpadd.i8 vdata0_0, vdata0_0, vdata1_0
+ vpadd.i8 vdata0_0, vdata0_0, vdata0_0
+ vmov synd, vdata0_0[0]
+
+ /* Clear the soff lower bits */
+ lsr synd, synd, soff
+ lsl synd, synd, soff
+ /* The first block can also be the last */
+ bls .Lmasklast
+ /* Have we found something already? */
+#ifndef NO_THUMB
+ cbnz synd, .Ltail
+#else
+ cmp synd, #0
+ bne .Ltail
#endif
-#define MEMCHR_NEON
-#include "memchr_impl.S"
+
+.Lloopintro:
+ vpush {vend}
+ /* 264/265 correspond to d8/d9 for q4 */
+ cfi_adjust_cfa_offset (16)
+ cfi_rel_offset (264, 0)
+ cfi_rel_offset (265, 8)
+ .p2align 3,,7
+.Lloop:
+ vld1.8 {vdata0, vdata1}, [src:256]!
+ subs cntin, cntin, #32
+ vceq.i8 vdata0, vdata0, vrepchr
+ vceq.i8 vdata1, vdata1, vrepchr
+ /* If we're out of data we finish regardless of the result. */
+ bls .Lend
+ /* Use a fast check for the termination condition. */
+ vorr vend, vdata0, vdata1
+ vorr vend0, vend0, vend1
+ vmov synd, tmp, vend0
+ orrs synd, synd, tmp
+ /* We're not out of data, loop if we haven't found the character. */
+ beq .Lloop
+
+.Lend:
+ vpop {vend}
+ cfi_adjust_cfa_offset (-16)
+ cfi_restore (264)
+ cfi_restore (265)
+
+ /* Termination condition found, let's calculate the syndrome value. */
+ vand vdata0, vdata0, vrepmask
+ vand vdata1, vdata1, vrepmask
+ vpadd.i8 vdata0_0, vdata0_0, vdata0_1
+ vpadd.i8 vdata1_0, vdata1_0, vdata1_1
+ vpadd.i8 vdata0_0, vdata0_0, vdata1_0
+ vpadd.i8 vdata0_0, vdata0_0, vdata0_0
+ vmov synd, vdata0_0[0]
+#ifndef NO_THUMB
+ cbz synd, .Lnotfound
+ bhi .Ltail /* Uses the condition code from
+ subs cntin, cntin, #32 above. */
+#else
+ cmp synd, #0
+ beq .Lnotfound
+ cmp cntin, #0
+ bhi .Ltail
+#endif
+
+
+.Lmasklast:
+ /* Clear the (-cntin) upper bits to avoid out-of-bounds matches. */
+ neg cntin, cntin
+ lsl synd, synd, cntin
+ lsrs synd, synd, cntin
+ it eq
+ moveq src, #0 /* If no match, set src to 0 so the retval is 0. */
+
+
+.Ltail:
+ /* Count the trailing zeros using bit reversing */
+ rbit synd, synd
+ /* Compensate the last post-increment */
+ sub src, src, #32
+ /* Count the leading zeros */
+ clz synd, synd
+ /* Compute the potential result and return */
+ add result, src, synd
+ bx lr
+
+
+.Lnotfound:
+ /* Set result to NULL if not found and return */
+ mov result, #0
+ bx lr
+
+END(memchr)
+libc_hidden_builtin_def (memchr)
diff --git a/sysdeps/arm/armv7/multiarch/memchr_noneon.S b/sysdeps/arm/armv7/multiarch/memchr_noneon.S
new file mode 100644
index 0000000..b1fb540
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/memchr_noneon.S
@@ -0,0 +1,5 @@
+#define memchr __memchr_noneon
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+
+#include <sysdeps/arm/armv6t2/memchr.S>
diff --git a/sysdeps/arm/armv7/multiarch/rtld-memchr.S b/sysdeps/arm/armv7/multiarch/rtld-memchr.S
new file mode 100644
index 0000000..ae8e5f0
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/rtld-memchr.S
@@ -0,0 +1 @@
+#include <sysdeps/arm/armv6t2/memchr.S>
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 02/25] arm: Implement memchr ifunc selection in C
2017-10-26 19:07 ` [PATCH 02/25] arm: Implement memchr ifunc selection in C Adhemerval Zanella
@ 2017-10-31 18:18 ` Joseph Myers
0 siblings, 0 replies; 52+ messages in thread
From: Joseph Myers @ 2017-10-31 18:18 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha
On Thu, 26 Oct 2017, Adhemerval Zanella wrote:
> This patch refactor ARM memchr ifunc selector to a C implementation.
> No functional change is expected, including ifunc resolution rules.
>
> It also reorganize the ifunc options code:
>
> 1. The memchr_impl.S is renamed to memchr_neon.S and multiple
> compilation options (which route to armv6t2/memchr one) is
> removed. The code to build if __ARM_NEON__ is defined is
> also simplified.
>
> 2. A memchr_noneon is added (which as build along previous ifunc
> resolution) and includes the armv6t2 direct.
>
> 3. Same as 2. for loader object.
>
> Alongside the aforementioned changes, it also some cleanus:
>
> - Internal memchr definition (__GI_memcpy) is now a hidden
> symbol.
> - No need to create hidden definition for the ifunc variants.
>
> Checked on armv7-linux-gnueabihf and with a build for arm-linux-gnueabi,
> arm-linux-gnueabihf with and without multiarch support and with both
> GCC 7.1 and GCC mainline.
OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 08/25] sparc: refactor sparc64 isinf{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (11 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 02/25] arm: Implement memchr ifunc selection in C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:40 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 14/25] sparc: refactor sparc64 __mpn_sub_n " Adhemerval Zanella
` (12 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_isinf{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
Add isinff-generic and s_isinf-generic objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 9 ++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 4 +--
.../sparc/sparc64/fpu/multiarch/s_isinf-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c | 37 ++++++++++++++++++++++
.../sparc/sparc64/fpu/multiarch/s_isinff-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S | 15 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c | 33 +++++++++++++++++++
8 files changed, 93 insertions(+), 32 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index a46773b..f0c8fa3 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -3,8 +3,8 @@ ifeq ($(subdir),math)
# by printf. While the libc objects have the prefix s_, the libm ones are
# prefixed with m_.
sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
- s_signbit-generic s_finitef-vis3 \
- s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
+ s_signbit-generic s_finitef-vis3 s_finite-vis3 \
+ s_isinff-vis3 s_isinf-vis3 s_isinff-generic s_isinf-generic \
s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
sysdep_routines += $(sysdep_calls)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
new file mode 100644
index 0000000..ebaf054
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
@@ -0,0 +1,6 @@
+#define __isinf __isinf_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <./sysdeps/sparc/sparc64/fpu/s_isinf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
deleted file mode 100644
index ed9b626..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(isinf)
-
-hidden_def (__isinf)
-weak_alias (__isinf, isinf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __isinf __isinf_generic
-
-#include "../s_isinf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
new file mode 100644
index 0000000..d7fec22
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
@@ -0,0 +1,37 @@
+/* isinf ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __isinf __redirect___isinf
+#define __isinff __redirect___isinff
+#define __isinfl __redirect___isinfl
+#include <math.h>
+#undef __isinf
+#undef __isinff
+#undef __isinfl
+#include <sparc-ifunc.h>
+
+extern __typeof (isinf) __isinf_vis3 attribute_hidden;
+extern __typeof (isinf) __isinf_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___isinf, __isinf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __isinf_vis3
+ : __isinf_generic)
+
+sparc_ifunc_redirected_hidden_def (__redirect___isinf, __isinf)
+weak_alias (__isinf, isinf)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
new file mode 100644
index 0000000..d37243f
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
@@ -0,0 +1,6 @@
+#define __isinff __isinff_generic
+#undef hidden_def
+#define hidden_def(a)
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_isinff.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
deleted file mode 100644
index 0451739..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(isinff)
-
-hidden_def (__isinff)
-weak_alias (__isinff, isinff)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __isinff __isinff_generic
-
-#include "../s_isinff.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
new file mode 100644
index 0000000..31c67f3
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
@@ -0,0 +1,33 @@
+/* isinff ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __isinff __redirect___isinff
+#include <math.h>
+#undef __isinff
+#include <sparc-ifunc.h>
+
+extern __typeof (isinff) __isinff_vis3 attribute_hidden;
+extern __typeof (isinff) __isinff_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect___isinff, __isinff,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __isinff_vis3
+ : __isinff_generic);
+
+sparc_ifunc_redirected_hidden_def (__redirect___isinff, __isinff)
+weak_alias (__isinff, isinff)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 08/25] sparc: refactor sparc64 isinf{f} selector to C
2017-10-26 19:07 ` [PATCH 08/25] sparc: refactor sparc64 isinf{f} selector to C Adhemerval Zanella
@ 2017-11-29 13:40 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:40 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_isinf{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdeps_calls):
> Add isinff-generic and s_isinf-generic objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 9 ++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 4 +--
> .../sparc/sparc64/fpu/multiarch/s_isinf-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c | 37 ++++++++++++++++++++++
> .../sparc/sparc64/fpu/multiarch/s_isinff-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S | 15 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c | 33 +++++++++++++++++++
> 8 files changed, 93 insertions(+), 32 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index a46773b..f0c8fa3 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -3,8 +3,8 @@ ifeq ($(subdir),math)
> # by printf. While the libc objects have the prefix s_, the libm ones are
> # prefixed with m_.
> sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> - s_signbit-generic s_finitef-vis3 \
> - s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
> + s_signbit-generic s_finitef-vis3 s_finite-vis3 \
> + s_isinff-vis3 s_isinf-vis3 s_isinff-generic s_isinf-generic \
> s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
>
> sysdep_routines += $(sysdep_calls)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
> new file mode 100644
> index 0000000..ebaf054
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
> @@ -0,0 +1,6 @@
> +#define __isinf __isinf_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <./sysdeps/sparc/sparc64/fpu/s_isinf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
> deleted file mode 100644
> index ed9b626..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(isinf)
> -
> -hidden_def (__isinf)
> -weak_alias (__isinf, isinf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __isinf __isinf_generic
> -
> -#include "../s_isinf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
> new file mode 100644
> index 0000000..d7fec22
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
> @@ -0,0 +1,37 @@
> +/* isinf ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __isinf __redirect___isinf
> +#define __isinff __redirect___isinff
> +#define __isinfl __redirect___isinfl
> +#include <math.h>
> +#undef __isinf
> +#undef __isinff
> +#undef __isinfl
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (isinf) __isinf_vis3 attribute_hidden;
> +extern __typeof (isinf) __isinf_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___isinf, __isinf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __isinf_vis3
> + : __isinf_generic)
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___isinf, __isinf)
> +weak_alias (__isinf, isinf)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
> new file mode 100644
> index 0000000..d37243f
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
> @@ -0,0 +1,6 @@
> +#define __isinff __isinff_generic
> +#undef hidden_def
> +#define hidden_def(a)
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_isinff.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
> deleted file mode 100644
> index 0451739..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(isinff)
> -
> -hidden_def (__isinff)
> -weak_alias (__isinff, isinff)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __isinff __isinff_generic
> -
> -#include "../s_isinff.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
> new file mode 100644
> index 0000000..31c67f3
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
> @@ -0,0 +1,33 @@
> +/* isinff ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __isinff __redirect___isinff
> +#include <math.h>
> +#undef __isinff
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (isinff) __isinff_vis3 attribute_hidden;
> +extern __typeof (isinff) __isinff_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect___isinff, __isinff,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __isinff_vis3
> + : __isinff_generic);
> +
> +sparc_ifunc_redirected_hidden_def (__redirect___isinff, __isinff)
> +weak_alias (__isinff, isinff)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 14/25] sparc: refactor sparc64 __mpn_sub_n selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (12 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 08/25] sparc: refactor sparc64 isinf{f} selector to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 13:09 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 21/25] sparc: refactor sparc32 rint{f} " Adhemerval Zanella
` (11 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
sub_n-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
Add sub_n-generic.
* sysdeps/sparc/sparc64/multiarch/sub_n-generic.S: New file.
* sysdeps/sparc/sparc64/multiarch/sub_n.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/sub_n.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 6 +++
sysdeps/sparc/sparc64/multiarch/Makefile | 2 +-
sysdeps/sparc/sparc64/multiarch/sub_n-generic.S | 2 +
sysdeps/sparc/sparc64/multiarch/sub_n.S | 56 -------------------------
sysdeps/sparc/sparc64/multiarch/sub_n.c | 28 +++++++++++++
5 files changed, 37 insertions(+), 57 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.c
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 2338213..10fe54f 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -14,7 +14,7 @@ endif
ifeq ($(subdir),stdlib)
sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
- add_n-vis3 sub_n-vis3
+ add_n-vis3 sub_n-vis3 sub_n-generic
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S b/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
new file mode 100644
index 0000000..7cece93
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
@@ -0,0 +1,2 @@
+#define __mpn_sub_n __mpn_sub_n_generic
+#include <sysdeps/sparc/sparc64/sub_n.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n.S b/sysdeps/sparc/sparc64/multiarch/sub_n.S
deleted file mode 100644
index d20a286..0000000
--- a/sysdeps/sparc/sparc64/multiarch/sub_n.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Multiple versions of sub_n
-
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-ENTRY(__mpn_sub_n)
- .type __mpn_sub_n, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_VIS3, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_sub_n_vis3), %o1
- xor %o1, %gdop_lox10(__mpn_sub_n_vis3), %o1
-# else
- set __mpn_sub_n_vis3, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_sub_n_generic), %o1
- xor %o1, %gdop_lox10(__mpn_sub_n_generic), %o1
-# else
- set __mpn_sub_n_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mpn_sub_n)
-
-#define __mpn_sub_n __mpn_sub_n_generic
-#include "../sub_n.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n.c b/sysdeps/sparc/sparc64/multiarch/sub_n.c
new file mode 100644
index 0000000..838d901
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/sub_n.c
@@ -0,0 +1,28 @@
+/* __mpn_sub_n ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <gmp.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (mpn_sub_n) __mpn_sub_n_vis3 attribute_hidden;
+extern __typeof (mpn_sub_n) __mpn_sub_n_generic attribute_hidden;
+
+sparc_libm_ifunc (__mpn_sub_n,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __mpn_sub_n_vis3
+ : __mpn_sub_n_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 14/25] sparc: refactor sparc64 __mpn_sub_n selector to C
2017-10-26 19:07 ` [PATCH 14/25] sparc: refactor sparc64 __mpn_sub_n " Adhemerval Zanella
@ 2017-11-30 13:09 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 13:09 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> sub_n-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
> Add sub_n-generic.
> * sysdeps/sparc/sparc64/multiarch/sub_n-generic.S: New file.
> * sysdeps/sparc/sparc64/multiarch/sub_n.c: Likewise.
> * sysdeps/sparc/sparc64/multiarch/sub_n.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 6 +++
> sysdeps/sparc/sparc64/multiarch/Makefile | 2 +-
> sysdeps/sparc/sparc64/multiarch/sub_n-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/sub_n.S | 56 -------------------------
> sysdeps/sparc/sparc64/multiarch/sub_n.c | 28 +++++++++++++
> 5 files changed, 37 insertions(+), 57 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.c
>
> diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
> index 2338213..10fe54f 100644
> --- a/sysdeps/sparc/sparc64/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/multiarch/Makefile
> @@ -14,7 +14,7 @@ endif
>
> ifeq ($(subdir),stdlib)
> sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
> - add_n-vis3 sub_n-vis3
> + add_n-vis3 sub_n-vis3 sub_n-generic
> endif
>
> ifeq ($(subdir),math)
> diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S b/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
> new file mode 100644
> index 0000000..7cece93
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
> @@ -0,0 +1,2 @@
> +#define __mpn_sub_n __mpn_sub_n_generic
> +#include <sysdeps/sparc/sparc64/sub_n.S>
> diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n.S b/sysdeps/sparc/sparc64/multiarch/sub_n.S
> deleted file mode 100644
> index d20a286..0000000
> --- a/sysdeps/sparc/sparc64/multiarch/sub_n.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/* Multiple versions of sub_n
> -
> - Copyright (C) 2013-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> -ENTRY(__mpn_sub_n)
> - .type __mpn_sub_n, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_VIS3, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_sub_n_vis3), %o1
> - xor %o1, %gdop_lox10(__mpn_sub_n_vis3), %o1
> -# else
> - set __mpn_sub_n_vis3, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_sub_n_generic), %o1
> - xor %o1, %gdop_lox10(__mpn_sub_n_generic), %o1
> -# else
> - set __mpn_sub_n_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__mpn_sub_n)
> -
> -#define __mpn_sub_n __mpn_sub_n_generic
> -#include "../sub_n.S"
> diff --git a/sysdeps/sparc/sparc64/multiarch/sub_n.c b/sysdeps/sparc/sparc64/multiarch/sub_n.c
> new file mode 100644
> index 0000000..838d901
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/sub_n.c
> @@ -0,0 +1,28 @@
> +/* __mpn_sub_n ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <gmp.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (mpn_sub_n) __mpn_sub_n_vis3 attribute_hidden;
> +extern __typeof (mpn_sub_n) __mpn_sub_n_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__mpn_sub_n,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __mpn_sub_n_vis3
> + : __mpn_sub_n_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 21/25] sparc: refactor sparc32 rint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (13 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 14/25] sparc: refactor sparc64 __mpn_sub_n " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 16/25] sparc: refactor sparc64 __mpn_submul_1 " Adhemerval Zanella
` (10 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc32 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_rint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_rintf-generic and s_rint-generic.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_rint-generic.S: New
file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_rint.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S:
Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_rint.S: Remove file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 11 +++++++
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 3 +-
.../sparc32/sparcv9/fpu/multiarch/s_rint-generic.S | 8 +++++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S | 19 ------------
.../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c | 35 ++++++++++++++++++++++
.../sparcv9/fpu/multiarch/s_rintf-generic.S | 4 +++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S | 12 --------
.../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c | 29 ++++++++++++++++++
8 files changed, 89 insertions(+), 32 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index 5b6e2a6..459c0e5 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -10,7 +10,8 @@ sysdep_routines += $(sysdep_calls)
libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
s_llrintf-generic s_llrint-generic \
- s_rintf-vis3 s_rint-vis3 \
+ s_rintf-vis3 s_rint-vis3 s_rintf-generic \
+ s_rint-generic \
s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
new file mode 100644
index 0000000..9709b1e
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
@@ -0,0 +1,8 @@
+#include <math_ldbl_opt.h>
+
+#define __rint __rint_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#undef compat_symbol
+#define compat_symbol(a, b, c, d)
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_rint.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
deleted file mode 100644
index de893fa..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <sparc-ifunc.h>
-#include <math_ldbl_opt.h>
-
-SPARC_ASM_VIS3_IFUNC(rint)
-
-weak_alias (__rint, rint)
-
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
-compat_symbol (libm, __rint, rintl, GLIBC_2_0)
-#endif
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-
-#define __rint __rint_generic
-
-#include "../s_rint.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
new file mode 100644
index 0000000..b6714e6
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
@@ -0,0 +1,35 @@
+/* rint ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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/>. */
+
+#define __rint __redirect_rint
+#include <math.h>
+#undef __rint
+#include <math_ldbl_opt.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_rint) __rint_vis3 attribute_hidden;
+extern __typeof (__redirect_rint) __rint_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_rint, __rint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __rint_vis3
+ : __rint_generic);
+weak_alias (__rint, rint)
+#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
+compat_symbol (libm, __rint, rintl, GLIBC_2_0);
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
new file mode 100644
index 0000000..185ba6b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
@@ -0,0 +1,4 @@
+#define __rintf __rintf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_rintf.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
deleted file mode 100644
index 38fd936..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(rintf)
-
-weak_alias (__rintf, rintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __rintf __rintf_generic
-
-#include "../s_rintf.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
new file mode 100644
index 0000000..bfe35d5
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
@@ -0,0 +1,29 @@
+/* rintf ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (rintf) __rintf_vis3 attribute_hidden;
+extern __typeof (rintf) __rintf_generic attribute_hidden;
+
+sparc_libm_ifunc (__rintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __rintf_vis3
+ : __rintf_generic);
+weak_alias (__rintf, rintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 21/25] sparc: refactor sparc32 rint{f} selector to C
2017-10-26 19:07 ` [PATCH 21/25] sparc: refactor sparc32 rint{f} " Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly. I had to adjust to use
Joseph recent changes to use libc_alias_{float,double}.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc32 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_rint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_rintf-generic and s_rint-generic.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_rint-generic.S: New
> file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_rint.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S:
> Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_rint.S: Remove file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_rintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 11 +++++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 3 +-
> .../sparc32/sparcv9/fpu/multiarch/s_rint-generic.S | 8 +++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S | 19 ------------
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c | 35 ++++++++++++++++++++++
> .../sparcv9/fpu/multiarch/s_rintf-generic.S | 4 +++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S | 12 --------
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c | 29 ++++++++++++++++++
> 8 files changed, 89 insertions(+), 32 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index 5b6e2a6..459c0e5 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -10,7 +10,8 @@ sysdep_routines += $(sysdep_calls)
> libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
> s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
> s_llrintf-generic s_llrint-generic \
> - s_rintf-vis3 s_rint-vis3 \
> + s_rintf-vis3 s_rint-vis3 s_rintf-generic \
> + s_rint-generic \
> s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
> new file mode 100644
> index 0000000..9709b1e
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
> @@ -0,0 +1,8 @@
> +#include <math_ldbl_opt.h>
> +
> +#define __rint __rint_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#undef compat_symbol
> +#define compat_symbol(a, b, c, d)
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_rint.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
> deleted file mode 100644
> index de893fa..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
> +++ /dev/null
> @@ -1,19 +0,0 @@
> -#include <sparc-ifunc.h>
> -#include <math_ldbl_opt.h>
> -
> -SPARC_ASM_VIS3_IFUNC(rint)
> -
> -weak_alias (__rint, rint)
> -
> -#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_0)
> -compat_symbol (libm, __rint, rintl, GLIBC_2_0)
> -#endif
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef compat_symbol
> -# define compat_symbol(a, b, c, d)
> -
> -#define __rint __rint_generic
> -
> -#include "../s_rint.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
> new file mode 100644
> index 0000000..b6714e6
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
> @@ -0,0 +1,35 @@
> +/* rint ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __rint __redirect_rint
> +#include <math.h>
> +#undef __rint
> +#include <math_ldbl_opt.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_rint) __rint_vis3 attribute_hidden;
> +extern __typeof (__redirect_rint) __rint_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_rint, __rint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __rint_vis3
> + : __rint_generic);
> +weak_alias (__rint, rint)
> +#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
> +compat_symbol (libm, __rint, rintl, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
> new file mode 100644
> index 0000000..185ba6b
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
> @@ -0,0 +1,4 @@
> +#define __rintf __rintf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_rintf.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
> deleted file mode 100644
> index 38fd936..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(rintf)
> -
> -weak_alias (__rintf, rintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __rintf __rintf_generic
> -
> -#include "../s_rintf.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
> new file mode 100644
> index 0000000..bfe35d5
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
> @@ -0,0 +1,29 @@
> +/* rintf ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (rintf) __rintf_vis3 attribute_hidden;
> +extern __typeof (rintf) __rintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__rintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __rintf_vis3
> + : __rintf_generic);
> +weak_alias (__rintf, rintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 16/25] sparc: refactor sparc64 __mpn_submul_1 selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (14 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 21/25] sparc: refactor sparc32 rint{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 13:09 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 06/25] sparc: refactor sparc64 signbit{f} " Adhemerval Zanella
` (9 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
submul_1-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
Add submul_1-generic.
* sysdeps/sparc/sparc64/multiarch/submul_1-generic.S: New file.
* sysdeps/sparc/sparc64/multiarch/submul_1.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/submul_1.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 6 +++
sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
sysdeps/sparc/sparc64/multiarch/submul_1-generic.S | 2 +
sysdeps/sparc/sparc64/multiarch/submul_1.S | 56 ----------------------
sysdeps/sparc/sparc64/multiarch/submul_1.c | 28 +++++++++++
5 files changed, 38 insertions(+), 57 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.c
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index fbd7e22..d62a509 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -14,7 +14,8 @@ endif
ifeq ($(subdir),stdlib)
sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
- submul_1-vis3 add_n-vis3 sub_n-vis3 sub_n-generic
+ submul_1-vis3 submul_1-generic add_n-vis3 sub_n-vis3 \
+ sub_n-generic
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
new file mode 100644
index 0000000..4c15360
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
@@ -0,0 +1,2 @@
+#define __mpn_submul_1 __mpn_submul_1_generic
+#include <sysdeps/sparc/sparc64/submul_1.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1.S b/sysdeps/sparc/sparc64/multiarch/submul_1.S
deleted file mode 100644
index 3c297d9..0000000
--- a/sysdeps/sparc/sparc64/multiarch/submul_1.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Multiple versions of submul_1
-
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-ENTRY(__mpn_submul_1)
- .type __mpn_submul_1, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_VIS3, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_submul_1_vis3), %o1
- xor %o1, %gdop_lox10(__mpn_submul_1_vis3), %o1
-# else
- set __mpn_submul_1_vis3, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_submul_1_generic), %o1
- xor %o1, %gdop_lox10(__mpn_submul_1_generic), %o1
-# else
- set __mpn_submul_1_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mpn_submul_1)
-
-#define __mpn_submul_1 __mpn_submul_1_generic
-#include "../submul_1.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1.c b/sysdeps/sparc/sparc64/multiarch/submul_1.c
new file mode 100644
index 0000000..ab9433f
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/submul_1.c
@@ -0,0 +1,28 @@
+/* __mpn_submul_1 ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <gmp.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (mpn_submul_1) __mpn_submul_1_vis3 attribute_hidden;
+extern __typeof (mpn_submul_1) __mpn_submul_1_generic attribute_hidden;
+
+sparc_libm_ifunc (__mpn_submul_1,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __mpn_submul_1_vis3
+ : __mpn_submul_1_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 16/25] sparc: refactor sparc64 __mpn_submul_1 selector to C
2017-10-26 19:07 ` [PATCH 16/25] sparc: refactor sparc64 __mpn_submul_1 " Adhemerval Zanella
@ 2017-11-30 13:09 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 13:09 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> submul_1-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
> Add submul_1-generic.
> * sysdeps/sparc/sparc64/multiarch/submul_1-generic.S: New file.
> * sysdeps/sparc/sparc64/multiarch/submul_1.c: Likewise.
> * sysdeps/sparc/sparc64/multiarch/submul_1.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 6 +++
> sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
> sysdeps/sparc/sparc64/multiarch/submul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/submul_1.S | 56 ----------------------
> sysdeps/sparc/sparc64/multiarch/submul_1.c | 28 +++++++++++
> 5 files changed, 38 insertions(+), 57 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.c
>
> diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
> index fbd7e22..d62a509 100644
> --- a/sysdeps/sparc/sparc64/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/multiarch/Makefile
> @@ -14,7 +14,8 @@ endif
>
> ifeq ($(subdir),stdlib)
> sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
> - submul_1-vis3 add_n-vis3 sub_n-vis3 sub_n-generic
> + submul_1-vis3 submul_1-generic add_n-vis3 sub_n-vis3 \
> + sub_n-generic
> endif
>
> ifeq ($(subdir),math)
> diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
> new file mode 100644
> index 0000000..4c15360
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
> @@ -0,0 +1,2 @@
> +#define __mpn_submul_1 __mpn_submul_1_generic
> +#include <sysdeps/sparc/sparc64/submul_1.S>
> diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1.S b/sysdeps/sparc/sparc64/multiarch/submul_1.S
> deleted file mode 100644
> index 3c297d9..0000000
> --- a/sysdeps/sparc/sparc64/multiarch/submul_1.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/* Multiple versions of submul_1
> -
> - Copyright (C) 2013-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> -ENTRY(__mpn_submul_1)
> - .type __mpn_submul_1, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_VIS3, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_submul_1_vis3), %o1
> - xor %o1, %gdop_lox10(__mpn_submul_1_vis3), %o1
> -# else
> - set __mpn_submul_1_vis3, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_submul_1_generic), %o1
> - xor %o1, %gdop_lox10(__mpn_submul_1_generic), %o1
> -# else
> - set __mpn_submul_1_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__mpn_submul_1)
> -
> -#define __mpn_submul_1 __mpn_submul_1_generic
> -#include "../submul_1.S"
> diff --git a/sysdeps/sparc/sparc64/multiarch/submul_1.c b/sysdeps/sparc/sparc64/multiarch/submul_1.c
> new file mode 100644
> index 0000000..ab9433f
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/submul_1.c
> @@ -0,0 +1,28 @@
> +/* __mpn_submul_1 ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <gmp.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (mpn_submul_1) __mpn_submul_1_vis3 attribute_hidden;
> +extern __typeof (mpn_submul_1) __mpn_submul_1_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__mpn_submul_1,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __mpn_submul_1_vis3
> + : __mpn_submul_1_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 06/25] sparc: refactor sparc64 signbit{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (15 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 16/25] sparc: refactor sparc64 __mpn_submul_1 " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:40 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 15/25] sparc: refactor sparc64 __mpn_addmul_1 " Adhemerval Zanella
` (8 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
(s_signbit-generic.S).
The patch simplifies the Makefile by moving the common objects from
libm-sysdeps_routines and sysdeps_routines to sysdeps_call rule and
including it where required with the correct prefix.
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc-ifunc.h (sparc_libm_ifunc_redirected): New
macro.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdep_calls): New
rule.
(sysdep_routines): Use sysdep_calls as base.
(libm-sysdep_routines): Add generic rule for symbols shared with
libc. Add s_signbit-generic and s_signbitf-generic objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 14 ++++++++
sysdeps/sparc/sparc-ifunc.h | 3 ++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 20 +++++++-----
.../sparc64/fpu/multiarch/s_signbit-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S | 20 ------------
sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c | 37 ++++++++++++++++++++++
.../sparc64/fpu/multiarch/s_signbitf-generic.S | 2 ++
sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S | 10 ------
sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c | 28 ++++++++++++++++
9 files changed, 102 insertions(+), 38 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
index 54420d8..4a68cf1 100644
--- a/sysdeps/sparc/sparc-ifunc.h
+++ b/sysdeps/sparc/sparc-ifunc.h
@@ -158,6 +158,9 @@ END (__##name)
# define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
+# define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
+ __ifunc (redirected_name, name, expr, int hwcap, libm_ifunc_init)
+
/* It essentially does libc_hidden_builtin_def (name) and redirect
the internal redirected symbol to ifunc implementation. */
# if defined SHARED
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index 2ac4496..702452c 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -1,17 +1,21 @@
ifeq ($(subdir),math)
-libm-sysdep_routines += m_signbitf-vis3 m_signbit-vis3 m_finitef-vis3 \
- m_finite-vis3 m_isinff-vis3 m_isinf-vis3 \
- m_isnanf-vis3 m_isnan-vis3 s_lrintf-vis3 \
- s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
+# These functions are built both for libc and libm because they're required
+# by printf. While the libc objects have the prefix s_, the libm ones are
+# prefixed with m_.
+sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
+ s_signbit-generic s_finitef-vis3 \
+ s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
+ s_isnanf-vis3 s_isnan-vis3
+
+sysdep_routines += $(sysdep_calls)
+libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
s_ceil-generic s_floorf-vis3 s_floor-vis3 \
s_floorf-generic s_floor-generic s_truncf-vis3 \
- s_trunc-vis3 s_truncf-generic s_trunc-generic
-sysdep_routines += s_signbitf-vis3 s_signbit-vis3 s_finitef-vis3 \
- s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
- s_isnanf-vis3 s_isnan-vis3
+ s_trunc-vis3 s_truncf-generic s_trunc-generic \
+ $(sysdep_calls:s_%=m_%)
CFLAGS-s_ceilf-vis3.c += -Wa,-Av9d -mvis3
CFLAGS-s_ceil-vis3.c += -Wa,-Av9d -mvis3
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
new file mode 100644
index 0000000..dfa40ac
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
@@ -0,0 +1,6 @@
+#define __signbit __signbit_generic
+#undef strong_alias
+#define strong_alias(a, b)
+#undef hidden_def
+#define hidden_def(a)
+#include <sysdeps/sparc/sparc64/fpu/s_signbit.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
deleted file mode 100644
index b8ff64a..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
+++ /dev/null
@@ -1,20 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(signbit)
-
-/* On 64-bit the double version will also always work for
- long-double-precision since in both cases the word with the
- sign bit in it is passed always in register %f0. */
-strong_alias (__signbit, __signbitl)
-hidden_def (__signbitl)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef strong_alias
-# define strong_alias(a, b)
-# undef hidden_def
-# define hidden_def(a)
-
-#define __signbit __signbit_generic
-
-#include "../s_signbit.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
new file mode 100644
index 0000000..33e69f8
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
@@ -0,0 +1,37 @@
+/* signbit ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define __signbit __redirect_signbit
+#include <math.h>
+#undef __signbit
+
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_signbit) __signbit_vis3 attribute_hidden;
+extern __typeof (__redirect_signbit) __signbit_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_signbit, __signbit,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __signbit_vis3
+ : __signbit_generic);
+
+/* On 64-bit the double version will also always work for
+ long-double-precision since in both cases the word with the
+ sign bit in it is passed always in register %f0. */
+strong_alias (__signbit, __signbitl)
+sparc_ifunc_redirected_hidden_def (__redirect_signbit, __signbitl)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
new file mode 100644
index 0000000..851ff35
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
@@ -0,0 +1,2 @@
+#define __signbitf __signbitf_generic
+#include <sysdeps/sparc/sparc64/fpu/s_signbitf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
deleted file mode 100644
index d57e999..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
+++ /dev/null
@@ -1,10 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(signbitf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __signbitf __signbitf_generic
-
-#include "../s_signbitf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
new file mode 100644
index 0000000..7e817f0
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
@@ -0,0 +1,28 @@
+/* signbit ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern int __signbitf_vis3 (float) attribute_hidden;
+extern int __signbitf_generic (float) attribute_hidden;
+
+sparc_libm_ifunc(__signbitf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __signbitf_vis3
+ : __signbitf_generic);
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 06/25] sparc: refactor sparc64 signbit{f} selector to C
2017-10-26 19:07 ` [PATCH 06/25] sparc: refactor sparc64 signbit{f} " Adhemerval Zanella
@ 2017-11-29 13:40 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:40 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> (s_signbit-generic.S).
>
> The patch simplifies the Makefile by moving the common objects from
> libm-sysdeps_routines and sysdeps_routines to sysdeps_call rule and
> including it where required with the correct prefix.
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc-ifunc.h (sparc_libm_ifunc_redirected): New
> macro.
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile (sysdep_calls): New
> rule.
> (sysdep_routines): Use sysdep_calls as base.
> (libm-sysdep_routines): Add generic rule for symbols shared with
> libc. Add s_signbit-generic and s_signbitf-generic objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 14 ++++++++
> sysdeps/sparc/sparc-ifunc.h | 3 ++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 20 +++++++-----
> .../sparc64/fpu/multiarch/s_signbit-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S | 20 ------------
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c | 37 ++++++++++++++++++++++
> .../sparc64/fpu/multiarch/s_signbitf-generic.S | 2 ++
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S | 10 ------
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c | 28 ++++++++++++++++
> 9 files changed, 102 insertions(+), 38 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
>
> diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
> index 54420d8..4a68cf1 100644
> --- a/sysdeps/sparc/sparc-ifunc.h
> +++ b/sysdeps/sparc/sparc-ifunc.h
> @@ -158,6 +158,9 @@ END (__##name)
>
> # define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
>
> +# define sparc_libm_ifunc_redirected(redirected_name, name, expr) \
> + __ifunc (redirected_name, name, expr, int hwcap, libm_ifunc_init)
> +
> /* It essentially does libc_hidden_builtin_def (name) and redirect
> the internal redirected symbol to ifunc implementation. */
> # if defined SHARED
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index 2ac4496..702452c 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -1,17 +1,21 @@
> ifeq ($(subdir),math)
> -libm-sysdep_routines += m_signbitf-vis3 m_signbit-vis3 m_finitef-vis3 \
> - m_finite-vis3 m_isinff-vis3 m_isinf-vis3 \
> - m_isnanf-vis3 m_isnan-vis3 s_lrintf-vis3 \
> - s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> +# These functions are built both for libc and libm because they're required
> +# by printf. While the libc objects have the prefix s_, the libm ones are
> +# prefixed with m_.
> +sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> + s_signbit-generic s_finitef-vis3 \
> + s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
> + s_isnanf-vis3 s_isnan-vis3
> +
> +sysdep_routines += $(sysdep_calls)
> +libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
> s_ceil-generic s_floorf-vis3 s_floor-vis3 \
> s_floorf-generic s_floor-generic s_truncf-vis3 \
> - s_trunc-vis3 s_truncf-generic s_trunc-generic
> -sysdep_routines += s_signbitf-vis3 s_signbit-vis3 s_finitef-vis3 \
> - s_finite-vis3 s_isinff-vis3 s_isinf-vis3 \
> - s_isnanf-vis3 s_isnan-vis3
> + s_trunc-vis3 s_truncf-generic s_trunc-generic \
> + $(sysdep_calls:s_%=m_%)
>
> CFLAGS-s_ceilf-vis3.c += -Wa,-Av9d -mvis3
> CFLAGS-s_ceil-vis3.c += -Wa,-Av9d -mvis3
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
> new file mode 100644
> index 0000000..dfa40ac
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
> @@ -0,0 +1,6 @@
> +#define __signbit __signbit_generic
> +#undef strong_alias
> +#define strong_alias(a, b)
> +#undef hidden_def
> +#define hidden_def(a)
> +#include <sysdeps/sparc/sparc64/fpu/s_signbit.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
> deleted file mode 100644
> index b8ff64a..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(signbit)
> -
> -/* On 64-bit the double version will also always work for
> - long-double-precision since in both cases the word with the
> - sign bit in it is passed always in register %f0. */
> -strong_alias (__signbit, __signbitl)
> -hidden_def (__signbitl)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef strong_alias
> -# define strong_alias(a, b)
> -# undef hidden_def
> -# define hidden_def(a)
> -
> -#define __signbit __signbit_generic
> -
> -#include "../s_signbit.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
> new file mode 100644
> index 0000000..33e69f8
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
> @@ -0,0 +1,37 @@
> +/* signbit ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __signbit __redirect_signbit
> +#include <math.h>
> +#undef __signbit
> +
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_signbit) __signbit_vis3 attribute_hidden;
> +extern __typeof (__redirect_signbit) __signbit_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_signbit, __signbit,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __signbit_vis3
> + : __signbit_generic);
> +
> +/* On 64-bit the double version will also always work for
> + long-double-precision since in both cases the word with the
> + sign bit in it is passed always in register %f0. */
> +strong_alias (__signbit, __signbitl)
> +sparc_ifunc_redirected_hidden_def (__redirect_signbit, __signbitl)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
> new file mode 100644
> index 0000000..851ff35
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
> @@ -0,0 +1,2 @@
> +#define __signbitf __signbitf_generic
> +#include <sysdeps/sparc/sparc64/fpu/s_signbitf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
> deleted file mode 100644
> index d57e999..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(signbitf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __signbitf __signbitf_generic
> -
> -#include "../s_signbitf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
> new file mode 100644
> index 0000000..7e817f0
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
> @@ -0,0 +1,28 @@
> +/* signbit ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern int __signbitf_vis3 (float) attribute_hidden;
> +extern int __signbitf_generic (float) attribute_hidden;
> +
> +sparc_libm_ifunc(__signbitf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __signbitf_vis3
> + : __signbitf_generic);
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 15/25] sparc: refactor sparc64 __mpn_addmul_1 selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (16 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 06/25] sparc: refactor sparc64 signbit{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 13:09 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 19/25] sparc: refactor sparc32 fabs{f} " Adhemerval Zanella
` (7 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
addmul_1-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
Add addmul_1-generic.
* sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S: New file.
* sysdeps/sparc/sparc64/multiarch/addmul_1.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/addmul_1.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 6 +++
sysdeps/sparc/sparc64/multiarch/Makefile | 4 +-
sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S | 2 +
sysdeps/sparc/sparc64/multiarch/addmul_1.S | 56 ----------------------
sysdeps/sparc/sparc64/multiarch/addmul_1.c | 28 +++++++++++
5 files changed, 38 insertions(+), 58 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.c
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 10fe54f..fbd7e22 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -13,8 +13,8 @@ sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
endif
ifeq ($(subdir),stdlib)
-sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
- add_n-vis3 sub_n-vis3 sub_n-generic
+sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
+ submul_1-vis3 add_n-vis3 sub_n-vis3 sub_n-generic
endif
ifeq ($(subdir),math)
diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
new file mode 100644
index 0000000..5bf1da7
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
@@ -0,0 +1,2 @@
+#define __mpn_addmul_1 __mpn_addmul_1_generic
+#include <sysdeps/sparc/sparc64/addmul_1.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1.S b/sysdeps/sparc/sparc64/multiarch/addmul_1.S
deleted file mode 100644
index dcb1da1..0000000
--- a/sysdeps/sparc/sparc64/multiarch/addmul_1.S
+++ /dev/null
@@ -1,56 +0,0 @@
-/* Multiple versions of addmul_1
-
- Copyright (C) 2013-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-ENTRY(__mpn_addmul_1)
- .type __mpn_addmul_1, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_VIS3, %o1
- andcc %o0, %o1, %g0
- be 1f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_addmul_1_vis3), %o1
- xor %o1, %gdop_lox10(__mpn_addmul_1_vis3), %o1
-# else
- set __mpn_addmul_1_vis3, %o1
-# endif
- ba 10f
- nop
-1:
-# ifdef SHARED
- sethi %gdop_hix22(__mpn_addmul_1_generic), %o1
- xor %o1, %gdop_lox10(__mpn_addmul_1_generic), %o1
-# else
- set __mpn_addmul_1_generic, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mpn_addmul_1)
-
-#define __mpn_addmul_1 __mpn_addmul_1_generic
-#include "../addmul_1.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1.c b/sysdeps/sparc/sparc64/multiarch/addmul_1.c
new file mode 100644
index 0000000..78bc34d
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/addmul_1.c
@@ -0,0 +1,28 @@
+/* __mpn_addmul_1 ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <gmp.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (mpn_addmul_1) __mpn_addmul_1_vis3 attribute_hidden;
+extern __typeof (mpn_addmul_1) __mpn_addmul_1_generic attribute_hidden;
+
+sparc_libm_ifunc (__mpn_addmul_1,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __mpn_addmul_1_vis3
+ : __mpn_addmul_1_generic)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 15/25] sparc: refactor sparc64 __mpn_addmul_1 selector to C
2017-10-26 19:07 ` [PATCH 15/25] sparc: refactor sparc64 __mpn_addmul_1 " Adhemerval Zanella
@ 2017-11-30 13:09 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 13:09 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> addmul_1-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/multiarch/Makefile (sysdep_routines):
> Add addmul_1-generic.
> * sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S: New file.
> * sysdeps/sparc/sparc64/multiarch/addmul_1.c: Likewise.
> * sysdeps/sparc/sparc64/multiarch/addmul_1.S: Remove file.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 6 +++
> sysdeps/sparc/sparc64/multiarch/Makefile | 4 +-
> sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/addmul_1.S | 56 ----------------------
> sysdeps/sparc/sparc64/multiarch/addmul_1.c | 28 +++++++++++
> 5 files changed, 38 insertions(+), 58 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.c
>
> diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
> index 10fe54f..fbd7e22 100644
> --- a/sysdeps/sparc/sparc64/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/multiarch/Makefile
> @@ -13,8 +13,8 @@ sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
> endif
>
> ifeq ($(subdir),stdlib)
> -sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 submul_1-vis3 \
> - add_n-vis3 sub_n-vis3 sub_n-generic
> +sysdep_routines += mul_1-vis3 mul_1-generic addmul_1-vis3 addmul_1-generic \
> + submul_1-vis3 add_n-vis3 sub_n-vis3 sub_n-generic
> endif
>
> ifeq ($(subdir),math)
> diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S b/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
> new file mode 100644
> index 0000000..5bf1da7
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
> @@ -0,0 +1,2 @@
> +#define __mpn_addmul_1 __mpn_addmul_1_generic
> +#include <sysdeps/sparc/sparc64/addmul_1.S>
> diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1.S b/sysdeps/sparc/sparc64/multiarch/addmul_1.S
> deleted file mode 100644
> index dcb1da1..0000000
> --- a/sysdeps/sparc/sparc64/multiarch/addmul_1.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/* Multiple versions of addmul_1
> -
> - Copyright (C) 2013-2017 Free Software Foundation, Inc.
> - Contributed by David S. Miller (davem@davemloft.net)
> - 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>
> -
> -ENTRY(__mpn_addmul_1)
> - .type __mpn_addmul_1, @gnu_indirect_function
> -# ifdef SHARED
> - SETUP_PIC_REG_LEAF(o3, o5)
> -# endif
> - set HWCAP_SPARC_VIS3, %o1
> - andcc %o0, %o1, %g0
> - be 1f
> - nop
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_addmul_1_vis3), %o1
> - xor %o1, %gdop_lox10(__mpn_addmul_1_vis3), %o1
> -# else
> - set __mpn_addmul_1_vis3, %o1
> -# endif
> - ba 10f
> - nop
> -1:
> -# ifdef SHARED
> - sethi %gdop_hix22(__mpn_addmul_1_generic), %o1
> - xor %o1, %gdop_lox10(__mpn_addmul_1_generic), %o1
> -# else
> - set __mpn_addmul_1_generic, %o1
> -# endif
> -10:
> -# ifdef SHARED
> - add %o3, %o1, %o1
> -# endif
> - retl
> - mov %o1, %o0
> -END(__mpn_addmul_1)
> -
> -#define __mpn_addmul_1 __mpn_addmul_1_generic
> -#include "../addmul_1.S"
> diff --git a/sysdeps/sparc/sparc64/multiarch/addmul_1.c b/sysdeps/sparc/sparc64/multiarch/addmul_1.c
> new file mode 100644
> index 0000000..78bc34d
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/multiarch/addmul_1.c
> @@ -0,0 +1,28 @@
> +/* __mpn_addmul_1 ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <gmp.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (mpn_addmul_1) __mpn_addmul_1_vis3 attribute_hidden;
> +extern __typeof (mpn_addmul_1) __mpn_addmul_1_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__mpn_addmul_1,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __mpn_addmul_1_vis3
> + : __mpn_addmul_1_generic)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 19/25] sparc: refactor sparc32 fabs{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (17 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 15/25] sparc: refactor sparc64 __mpn_addmul_1 " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 03/25] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
` (6 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc32 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_fabs{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_fabsf-generic and s_fabs-generic.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_fabs-generic.S: New
file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabs.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S:
Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabs.S: Remove file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 11 +++++++
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 3 +-
.../sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S | 8 +++++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S | 18 -----------
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c | 35 ++++++++++++++++++++++
.../sparcv9/fpu/multiarch/s_fabsf-generic.S | 4 +++
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S | 12 --------
.../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c | 29 ++++++++++++++++++
8 files changed, 89 insertions(+), 31 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index b8d1126..bd8e341 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -7,7 +7,8 @@ sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
s_copysign-generic
sysdep_routines += $(sysdep_calls)
-libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
+libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
+ s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
new file mode 100644
index 0000000..ddfdf4b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
@@ -0,0 +1,8 @@
+#include <math_ldbl_opt.h>
+
+#define __fabs __fabs_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#undef compat_symbol
+#define compat_symbol(a, b, c, d)
+#include <sysdeps/sparc/sparc32/fpu/s_fabs.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
deleted file mode 100644
index 72cc08f..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
+++ /dev/null
@@ -1,18 +0,0 @@
-#include <sparc-ifunc.h>
-#include <math_ldbl_opt.h>
-
-SPARC_ASM_VIS3_IFUNC(fabs)
-
-weak_alias (__fabs, fabs)
-#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, __fabs, fabsl, GLIBC_2_0);
-#endif
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-
-#define __fabs __fabs_generic
-
-#include "../s_fabs.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
new file mode 100644
index 0000000..58b0192
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
@@ -0,0 +1,35 @@
+/* fabs ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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/>. */
+
+#define __fabs __redirect_fabs
+#include <math.h>
+#undef __fabs
+#include <math_ldbl_opt.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_fabs) __fabs_vis3 attribute_hidden;
+extern __typeof (__redirect_fabs) __fabs_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_fabs, __fabs,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __fabs_vis3
+ : __fabs_generic);
+weak_alias (__fabs, fabs)
+#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
+compat_symbol (libm, __fabs, fabsl, GLIBC_2_0);
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
new file mode 100644
index 0000000..1d55c95
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
@@ -0,0 +1,4 @@
+#define __fabsf __fabsf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc32/fpu/s_fabsf.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
deleted file mode 100644
index 0f2e11e..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(fabsf)
-
-weak_alias (__fabsf, fabsf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __fabsf __fabsf_generic
-
-#include "../../../fpu/s_fabsf.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
new file mode 100644
index 0000000..76711b9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
@@ -0,0 +1,29 @@
+/* fabsf ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (fabsf) __fabsf_vis3 attribute_hidden;
+extern __typeof (fabsf) __fabsf_generic attribute_hidden;
+
+sparc_libm_ifunc (__fabsf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __fabsf_vis3
+ : __fabsf_generic);
+weak_alias (__fabsf, fabsf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 19/25] sparc: refactor sparc32 fabs{f} selector to C
2017-10-26 19:07 ` [PATCH 19/25] sparc: refactor sparc32 fabs{f} " Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly. I had to adjust to use
Joseph recent changes to use libc_alias_{float,double}.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc32 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_fabs{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_fabsf-generic and s_fabs-generic.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_fabs-generic.S: New
> file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabs.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S:
> Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabs.S: Remove file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_fabsf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 11 +++++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 3 +-
> .../sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S | 8 +++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S | 18 -----------
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c | 35 ++++++++++++++++++++++
> .../sparcv9/fpu/multiarch/s_fabsf-generic.S | 4 +++
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S | 12 --------
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c | 29 ++++++++++++++++++
> 8 files changed, 89 insertions(+), 31 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index b8d1126..bd8e341 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -7,7 +7,8 @@ sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
> s_copysign-generic
>
> sysdep_routines += $(sysdep_calls)
> -libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
> +libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
> + s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
> s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
> new file mode 100644
> index 0000000..ddfdf4b
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
> @@ -0,0 +1,8 @@
> +#include <math_ldbl_opt.h>
> +
> +#define __fabs __fabs_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#undef compat_symbol
> +#define compat_symbol(a, b, c, d)
> +#include <sysdeps/sparc/sparc32/fpu/s_fabs.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
> deleted file mode 100644
> index 72cc08f..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -#include <sparc-ifunc.h>
> -#include <math_ldbl_opt.h>
> -
> -SPARC_ASM_VIS3_IFUNC(fabs)
> -
> -weak_alias (__fabs, fabs)
> -#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
> -compat_symbol (libm, __fabs, fabsl, GLIBC_2_0);
> -#endif
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef compat_symbol
> -# define compat_symbol(a, b, c, d)
> -
> -#define __fabs __fabs_generic
> -
> -#include "../s_fabs.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
> new file mode 100644
> index 0000000..58b0192
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
> @@ -0,0 +1,35 @@
> +/* fabs ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __fabs __redirect_fabs
> +#include <math.h>
> +#undef __fabs
> +#include <math_ldbl_opt.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_fabs) __fabs_vis3 attribute_hidden;
> +extern __typeof (__redirect_fabs) __fabs_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_fabs, __fabs,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __fabs_vis3
> + : __fabs_generic);
> +weak_alias (__fabs, fabs)
> +#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
> +compat_symbol (libm, __fabs, fabsl, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
> new file mode 100644
> index 0000000..1d55c95
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
> @@ -0,0 +1,4 @@
> +#define __fabsf __fabsf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc32/fpu/s_fabsf.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
> deleted file mode 100644
> index 0f2e11e..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(fabsf)
> -
> -weak_alias (__fabsf, fabsf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __fabsf __fabsf_generic
> -
> -#include "../../../fpu/s_fabsf.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
> new file mode 100644
> index 0000000..76711b9
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
> @@ -0,0 +1,29 @@
> +/* fabsf ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (fabsf) __fabsf_vis3 attribute_hidden;
> +extern __typeof (fabsf) __fabsf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__fabsf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __fabsf_vis3
> + : __fabsf_generic);
> +weak_alias (__fabsf, fabsf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 03/25] sparc: Implement memcpy/mempcpy ifunc selection in C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (18 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 19/25] sparc: refactor sparc32 fabs{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 11/25] sparc: refactor sparc64 lrint{f} selector to C Adhemerval Zanella
` (5 subsequent siblings)
25 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactor the SPARC64 ifunc selector to a C implementation.
The x86_64 implementation is used as default, which resulted in common
definitions (ifunc-init.h) used on both architectures. No functional
change is expected, including ifunc resolution rules.
Checked on sparc64-linux-gnu, sparcv9-linux-gnu and x86_64-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S: New
file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c: Likewise.
* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h: Likewise.
* sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S: Likewise.
* sysdeps/sparc/sparc64/multiarch/memcpy.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/mempcpy.c: Likewise.
* sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S: Likewise.
* sysdeps/sparc/sparc-ifunc.h (sparc_libc_ifunc_redirected): New
macro.
* sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
[$(subdir) = string] (sysdep_routines): Add memcpy-ultra1.
* sysdeps/sparc/sparc64/multiarch/Makefile [$(subdir) = string]
(sysdep_routines): Add memcpy-ultra1.
* sysdeps/sparc/sparc64/multiarch/memcpy.S: Remove file.
* sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 19 +++
sysdeps/sparc/sparc-ifunc.h | 13 ++
sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile | 3 +-
.../sparc32/sparcv9/multiarch/memcpy-ultra1.S | 32 ++++
sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S | 4 -
sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c | 1 +
sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c | 1 +
.../sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S | 1 +
sysdeps/sparc/sparc64/multiarch/Makefile | 3 +-
sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h | 40 +++++
sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S | 33 ++++
sysdeps/sparc/sparc64/multiarch/memcpy.S | 167 ---------------------
sysdeps/sparc/sparc64/multiarch/memcpy.c | 33 ++++
sysdeps/sparc/sparc64/multiarch/mempcpy.c | 39 +++++
sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S | 1 +
15 files changed, 217 insertions(+), 173 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
create mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
delete mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.S
create mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/mempcpy.c
create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
diff --git a/sysdeps/sparc/sparc-ifunc.h b/sysdeps/sparc/sparc-ifunc.h
index 4b1ea00..044fe36 100644
--- a/sysdeps/sparc/sparc-ifunc.h
+++ b/sysdeps/sparc/sparc-ifunc.h
@@ -161,10 +161,23 @@ END (__##name)
#else /* __ASSEMBLER__ */
+# define INIT_ARCH()
+
+# define sparc_libc_ifunc_redirected(redirected_name, name, expr) \
+ __ifunc (redirected_name, name, expr(hwcap), int hwcap, INIT_ARCH)
# define sparc_libm_ifunc(name, expr) \
__ifunc (name, name, expr, int hwcap, libm_ifunc_init)
# define sparc_libc_ifunc(name, expr) sparc_libm_ifunc (name, expr)
+/* It essentially does libc_hidden_builtin_def (name) and redirect
+ the internal redirected symbol to ifunc implementation. */
+# if defined SHARED
+# define sparc_ifunc_redirected_hidden_def(redirect_name, name) \
+ __hidden_ver1 (name, __GI_##name, redirect_name) \
+ __attribute__ ((visibility ("hidden")));
+# else
+# define sparc_ifunc_redirected_hidden_def(redirect_name, name)
+# endif
#endif /* __ASSEMBLER__ */
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
index 4ad7aff..ca44798 100644
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile
@@ -8,5 +8,6 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
- memset-niagara1 memcpy-niagara4 memset-niagara4
+ memset-niagara1 memcpy-niagara4 memset-niagara4 \
+ memcpy-ultra1
endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
new file mode 100644
index 0000000..ac0e7aa
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
@@ -0,0 +1,32 @@
+/* Default SPARC32 memcpy implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+
+# define memcpy __memcpy_ultra1
+# define __mempcpy __mempcpy_ultra1
+# include <sysdeps/sparc/sparc32/sparcv9/memcpy.S>
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
deleted file mode 100644
index 14df91e..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
+++ /dev/null
@@ -1,4 +0,0 @@
-#define ASI_PNF 0x82
-#define ASI_BLK_P 0xf0
-#define XCC icc
-#include <sparc64/multiarch/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
new file mode 100644
index 0000000..369acac
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/memcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
new file mode 100644
index 0000000..616a538
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
@@ -0,0 +1 @@
+#include <sysdeps/sparc/sparc64/multiarch/mempcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
new file mode 100644
index 0000000..f18c9f9
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
@@ -0,0 +1 @@
+/* rtld-mempcpy is implemented by rtld-memcpy.S. */
diff --git a/sysdeps/sparc/sparc64/multiarch/Makefile b/sysdeps/sparc/sparc64/multiarch/Makefile
index 55b757f..4e52526 100644
--- a/sysdeps/sparc/sparc64/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/multiarch/Makefile
@@ -8,7 +8,8 @@ endif
ifeq ($(subdir),string)
sysdep_routines += memcpy-ultra3 memcpy-niagara1 memcpy-niagara2 \
- memset-niagara1 memcpy-niagara4 memset-niagara4
+ memset-niagara1 memcpy-niagara4 memset-niagara4 \
+ memcpy-ultra1
endif
ifeq ($(subdir),stdlib)
diff --git a/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h b/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
new file mode 100644
index 0000000..46f3795
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
@@ -0,0 +1,40 @@
+/* Common definition for memcpy and mempcpy implementation.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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 <ifunc-init.h>
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara4) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara2) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (niagara1) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra3) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (ultra1) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_SPARC_CRYPTO)
+ return OPTIMIZE (niagara4);
+ if (hwcap & HWCAP_SPARC_N2)
+ return OPTIMIZE (niagara2);
+ if (hwcap & HWCAP_SPARC_BLKINIT)
+ return OPTIMIZE (niagara1);
+ if (hwcap & HWCAP_SPARC_ULTRA3)
+ return OPTIMIZE (ultra3);
+ return OPTIMIZE (ultra1);
+}
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
new file mode 100644
index 0000000..fc392c5
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy-ultra1.S
@@ -0,0 +1,33 @@
+/* Default SPARC64 memcpy implementation.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# include <sysdep.h>
+
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(name)
+# undef weak_alias
+# define weak_alias(x, y)
+# undef libc_hidden_def
+# define libc_hidden_def(name)
+
+# define memcpy __memcpy_ultra1
+# define __mempcpy __mempcpy_ultra1
+
+#include <sysdeps/sparc/sparc64/memcpy.S>
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.S b/sysdeps/sparc/sparc64/multiarch/memcpy.S
deleted file mode 100644
index b6396ee..0000000
--- a/sysdeps/sparc/sparc64/multiarch/memcpy.S
+++ /dev/null
@@ -1,167 +0,0 @@
-/* Multiple versions of memcpy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2010-2017 Free Software Foundation, Inc.
- Contributed by David S. Miller (davem@davemloft.net)
- 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>
-
-#if IS_IN (libc)
- .text
-ENTRY(memcpy)
- .type memcpy, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_N2, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara4), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara4), %o1
-# else
- set __memcpy_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara2), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara2), %o1
-# else
- set __memcpy_niagara2, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_ULTRA3, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_niagara1), %o1
- xor %o1, %gdop_lox10(__memcpy_niagara1), %o1
-# else
- set __memcpy_niagara1, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_ultra3), %o1
- xor %o1, %gdop_lox10(__memcpy_ultra3), %o1
-# else
- set __memcpy_ultra3, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__memcpy_ultra1), %o1
- xor %o1, %gdop_lox10(__memcpy_ultra1), %o1
-# else
- set __memcpy_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(memcpy)
-
-ENTRY(__mempcpy)
- .type __mempcpy, @gnu_indirect_function
-# ifdef SHARED
- SETUP_PIC_REG_LEAF(o3, o5)
-# endif
- set HWCAP_SPARC_CRYPTO, %o1
- andcc %o0, %o1, %g0
- be 1f
- andcc %o0, HWCAP_SPARC_N2, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara4), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara4), %o1
-# else
- set __mempcpy_niagara4, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_BLKINIT, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara2), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara2), %o1
-# else
- set __mempcpy_niagara2, %o1
-# endif
- ba 10f
- nop
-1: be 1f
- andcc %o0, HWCAP_SPARC_ULTRA3, %g0
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_niagara1), %o1
- xor %o1, %gdop_lox10(__mempcpy_niagara1), %o1
-# else
- set __mempcpy_niagara1, %o1
-# endif
- ba 10f
- nop
-1: be 9f
- nop
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_ultra3), %o1
- xor %o1, %gdop_lox10(__mempcpy_ultra3), %o1
-# else
- set __mempcpy_ultra3, %o1
-# endif
- ba 10f
- nop
-9:
-# ifdef SHARED
- sethi %gdop_hix22(__mempcpy_ultra1), %o1
- xor %o1, %gdop_lox10(__mempcpy_ultra1), %o1
-# else
- set __mempcpy_ultra1, %o1
-# endif
-10:
-# ifdef SHARED
- add %o3, %o1, %o1
-# endif
- retl
- mov %o1, %o0
-END(__mempcpy)
-
-libc_hidden_builtin_def (memcpy)
-
-libc_hidden_def (__mempcpy)
-weak_alias (__mempcpy, mempcpy)
-libc_hidden_builtin_def (mempcpy)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(x, y)
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-
-#define memcpy __memcpy_ultra1
-#define __mempcpy __mempcpy_ultra1
-
-#endif
-
-#include "../memcpy.S"
diff --git a/sysdeps/sparc/sparc64/multiarch/memcpy.c b/sysdeps/sparc/sparc64/multiarch/memcpy.c
new file mode 100644
index 0000000..5510e15
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/memcpy.c
@@ -0,0 +1,33 @@
+/* Multiple versions of memcpy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define memcpy __redirect_memcpy
+# include <string.h>
+# undef memcpy
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME memcpy
+# include "ifunc-memcpy.h"
+
+sparc_libc_ifunc_redirected (__redirect_memcpy, memcpy, IFUNC_SELECTOR)
+
+sparc_ifunc_redirected_hidden_def (__redirect_memcpy, memcpy)
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/mempcpy.c b/sysdeps/sparc/sparc64/multiarch/mempcpy.c
new file mode 100644
index 0000000..8a4b2a1
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/mempcpy.c
@@ -0,0 +1,39 @@
+/* Multiple versions of memcpy
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+#if IS_IN (libc)
+# define mempcpy __redirect_mempcpy
+# define __mempcpy __redirect___mempcpy
+# define NO_MEMPCPY_STPCPY_REDIRECT
+# define __NO_STRING_INLINES
+# include <string.h>
+# undef mempcpy
+# undef __mempcpy
+
+# include <sparc-ifunc.h>
+
+# define SYMBOL_NAME mempcpy
+# include "ifunc-memcpy.h"
+
+sparc_libc_ifunc_redirected (__redirect_mempcpy, __mempcpy, IFUNC_SELECTOR)
+
+sparc_ifunc_redirected_hidden_def (__redirect___mempcpy, __mempcpy)
+weak_alias (__mempcpy, mempcpy)
+sparc_ifunc_redirected_hidden_def (__redirect_mempcpy, mempcpy)
+#endif
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S b/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
new file mode 100644
index 0000000..f18c9f9
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
@@ -0,0 +1 @@
+/* rtld-mempcpy is implemented by rtld-memcpy.S. */
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 11/25] sparc: refactor sparc64 lrint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (19 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 03/25] sparc: Implement memcpy/mempcpy ifunc selection in C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:41 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 01/25] arm: Implement memcpy ifunc selection in C Adhemerval Zanella
` (4 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_lrint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_lrint-generic and s_lrint-generic
objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 10 ++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 3 +-
.../sparc/sparc64/fpu/multiarch/s_lrint-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S | 17 ----------
sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c | 39 ++++++++++++++++++++++
.../sparc/sparc64/fpu/multiarch/s_lrintf-generic.S | 6 ++++
sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S | 17 ----------
sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c | 39 ++++++++++++++++++++++
8 files changed, 102 insertions(+), 35 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index 6062af0..d0a87d1 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -9,7 +9,8 @@ sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
sysdep_routines += $(sysdep_calls)
-libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
+libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_lrintf-generic \
+ s_lrint-generic s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
s_nearbyint-generic s_nearbyintf-generic \
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
new file mode 100644
index 0000000..e6ab999
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
@@ -0,0 +1,6 @@
+#define __lrint __lrint_generic
+#undef weak_alias
+#define weak_alias(a,b)
+#undef strong_alias
+#define strong_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_lrint.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
deleted file mode 100644
index 94af8f0..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(lrint)
-
-weak_alias (__lrint, lrint)
-
-strong_alias (__lrint, __llrint)
-weak_alias (__llrint, llrint)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef strong_alias
-# define strong_alias(a, b)
-
-#define __lrint __lrint_generic
-
-#include "../s_lrint.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
new file mode 100644
index 0000000..557f0d6
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
@@ -0,0 +1,39 @@
+/* lrint/llrint ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define lrint __redirect_lrint
+#define llrint __redirect_llrint
+#define __lrint __redirect___lrint
+#define __llrint __redirect___llrint
+#include <math.h>
+#undef lrint
+#undef llrint
+#undef __lrint
+#undef __llrint
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_lrint) __lrint_vis3 attribute_hidden;
+extern __typeof (__redirect_lrint) __lrint_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_lrint, __lrint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __lrint_vis3
+ : __lrint_generic);
+weak_alias (__lrint, lrint)
+strong_alias (__lrint, __llrint)
+weak_alias (__llrint, llrint)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
new file mode 100644
index 0000000..4cfbf4a
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
@@ -0,0 +1,6 @@
+#define __lrintf __lrintf_generic
+#undef weak_alias
+#define weak_alias(a,b)
+#undef strong_alias
+#define strong_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_lrintf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
deleted file mode 100644
index e6ea406..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
+++ /dev/null
@@ -1,17 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(lrintf)
-
-weak_alias (__lrintf, lrintf)
-
-strong_alias (__lrintf, __llrintf)
-weak_alias (__llrintf, llrintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef strong_alias
-# define strong_alias(a, b)
-
-#define __lrintf __lrintf_generic
-
-#include "../s_lrintf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
new file mode 100644
index 0000000..9b1a569
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
@@ -0,0 +1,39 @@
+/* lrintf/llrintf ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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/>. */
+
+#define lrintf __redirect_lrintf
+#define llrintf __redirect_llrintf
+#define __lrintf __redirect_lrintf
+#define __llrintf __redirect_llrintf
+#include <math.h>
+#undef lrintf
+#undef llrintf
+#undef __lrintf
+#undef __llrintf
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_lrintf) __lrintf_vis3 attribute_hidden;
+extern __typeof (__redirect_lrintf) __lrintf_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_lrintf, __lrintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __lrintf_vis3
+ : __lrintf_generic);
+weak_alias (__lrintf, lrintf)
+strong_alias (__lrintf, __llrintf)
+weak_alias (__llrintf, llrintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 11/25] sparc: refactor sparc64 lrint{f} selector to C
2017-10-26 19:07 ` [PATCH 11/25] sparc: refactor sparc64 lrint{f} selector to C Adhemerval Zanella
@ 2017-11-29 13:41 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:41 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_lrint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_lrint-generic and s_lrint-generic
> objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 10 ++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 3 +-
> .../sparc/sparc64/fpu/multiarch/s_lrint-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S | 17 ----------
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c | 39 ++++++++++++++++++++++
> .../sparc/sparc64/fpu/multiarch/s_lrintf-generic.S | 6 ++++
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S | 17 ----------
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c | 39 ++++++++++++++++++++++
> 8 files changed, 102 insertions(+), 35 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index 6062af0..d0a87d1 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -9,7 +9,8 @@ sysdep_calls := s_signbitf-vis3 s_signbit-vis3 s_signbitf-generic \
> s_isnanf-vis3 s_isnan-vis3 s_isnanf-generic s_isnan-generic
>
> sysdep_routines += $(sysdep_calls)
> -libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> +libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_lrintf-generic \
> + s_lrint-generic s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> s_nearbyint-generic s_nearbyintf-generic \
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
> new file mode 100644
> index 0000000..e6ab999
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
> @@ -0,0 +1,6 @@
> +#define __lrint __lrint_generic
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#undef strong_alias
> +#define strong_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_lrint.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
> deleted file mode 100644
> index 94af8f0..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(lrint)
> -
> -weak_alias (__lrint, lrint)
> -
> -strong_alias (__lrint, __llrint)
> -weak_alias (__llrint, llrint)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef strong_alias
> -# define strong_alias(a, b)
> -
> -#define __lrint __lrint_generic
> -
> -#include "../s_lrint.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
> new file mode 100644
> index 0000000..557f0d6
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
> @@ -0,0 +1,39 @@
> +/* lrint/llrint ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define lrint __redirect_lrint
> +#define llrint __redirect_llrint
> +#define __lrint __redirect___lrint
> +#define __llrint __redirect___llrint
> +#include <math.h>
> +#undef lrint
> +#undef llrint
> +#undef __lrint
> +#undef __llrint
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_lrint) __lrint_vis3 attribute_hidden;
> +extern __typeof (__redirect_lrint) __lrint_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_lrint, __lrint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __lrint_vis3
> + : __lrint_generic);
> +weak_alias (__lrint, lrint)
> +strong_alias (__lrint, __llrint)
> +weak_alias (__llrint, llrint)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
> new file mode 100644
> index 0000000..4cfbf4a
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
> @@ -0,0 +1,6 @@
> +#define __lrintf __lrintf_generic
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#undef strong_alias
> +#define strong_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_lrintf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
> deleted file mode 100644
> index e6ea406..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(lrintf)
> -
> -weak_alias (__lrintf, lrintf)
> -
> -strong_alias (__lrintf, __llrintf)
> -weak_alias (__llrintf, llrintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef strong_alias
> -# define strong_alias(a, b)
> -
> -#define __lrintf __lrintf_generic
> -
> -#include "../s_lrintf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
> new file mode 100644
> index 0000000..9b1a569
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
> @@ -0,0 +1,39 @@
> +/* lrintf/llrintf ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define lrintf __redirect_lrintf
> +#define llrintf __redirect_llrintf
> +#define __lrintf __redirect_lrintf
> +#define __llrintf __redirect_llrintf
> +#include <math.h>
> +#undef lrintf
> +#undef llrintf
> +#undef __lrintf
> +#undef __llrintf
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_lrintf) __lrintf_vis3 attribute_hidden;
> +extern __typeof (__redirect_lrintf) __lrintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_lrintf, __lrintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __lrintf_vis3
> + : __lrintf_generic);
> +weak_alias (__lrintf, lrintf)
> +strong_alias (__lrintf, __llrintf)
> +weak_alias (__llrintf, llrintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 01/25] arm: Implement memcpy ifunc selection in C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (20 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 11/25] sparc: refactor sparc64 lrint{f} selector to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-10-31 18:16 ` Joseph Myers
2017-10-26 19:07 ` [PATCH 18/25] sparc: refactor sparc32 copysign selector to C Adhemerval Zanella
` (3 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactor ARM memcpy ifunc selector to a C implementation.
No functional change is expected, including ifunc resolution rules.
It also adds some cleanup:
- Internal memcpy hidden definition (__GI_memcpy) is now a hidden
symbol.
- No need to create hidden definition for the ifunc variants.
Checked on armv7-linux-gnueabihf and with a build for arm-linux-gnueabi,
arm-linux-gnueabihf with and without multiarch support and with both
GCC 7.1 and GCC mainline. I also checked with the some possible
multiarch different configurations that trigger different memcpy
buids (__ARM_NEON__ && !__SOFT_FP__, !__ARM_NEON__ && !__SOFT_FP__, and
!__ARM_NEON__ && __SOFT_FP__).
* sysdeps/arm/arm-ifunc.h: New file.
* sysdeps/arm/armv7/multiarch/ifunc-memcpy.h: Likewise.
* sysdeps/arm/armv7/multiarch/memcpy.c: Likewise.
* sysdeps/arm/armv7/multiarch/memcpy_arm.S: Likewise.
* sysdeps/arm/armv7/multiarch/rtld-memcpy.S: Likewise.
* sysdeps/arm/armv7/multiarch/memcpy_neon.S [!__ARM_NEON__]
(__memcpy_neon): Avoid create hidden alias.
* sysdeps/arm/armv7/multiarch/memcpy_vfp.S [!__ARM_NEON_]
(__memcpy_vfp): Likewise.
* sysdeps/arm/armv7/multiarch/Makefile [$(subdir) = string]
(sysdep_routines): Add memcpy_arm.
* sysdeps/arm/armv7/multiarch/memcpy.S: Remove file.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 15 ++++++
sysdeps/arm/arm-ifunc.h | 33 +++++++++++++
sysdeps/arm/armv7/multiarch/Makefile | 2 +-
sysdeps/arm/armv7/multiarch/ifunc-memcpy.h | 37 +++++++++++++++
sysdeps/arm/armv7/multiarch/memcpy.S | 76 ------------------------------
sysdeps/arm/armv7/multiarch/memcpy.c | 35 ++++++++++++++
sysdeps/arm/armv7/multiarch/memcpy_arm.S | 10 ++++
sysdeps/arm/armv7/multiarch/memcpy_neon.S | 8 ++--
sysdeps/arm/armv7/multiarch/memcpy_vfp.S | 4 +-
sysdeps/arm/armv7/multiarch/rtld-memcpy.S | 1 +
10 files changed, 139 insertions(+), 82 deletions(-)
create mode 100644 sysdeps/arm/arm-ifunc.h
create mode 100644 sysdeps/arm/armv7/multiarch/ifunc-memcpy.h
delete mode 100644 sysdeps/arm/armv7/multiarch/memcpy.S
create mode 100644 sysdeps/arm/armv7/multiarch/memcpy.c
create mode 100644 sysdeps/arm/armv7/multiarch/memcpy_arm.S
create mode 100644 sysdeps/arm/armv7/multiarch/rtld-memcpy.S
diff --git a/sysdeps/arm/arm-ifunc.h b/sysdeps/arm/arm-ifunc.h
new file mode 100644
index 0000000..52cb533
--- /dev/null
+++ b/sysdeps/arm/arm-ifunc.h
@@ -0,0 +1,33 @@
+/* Common definition for ifunc resolvers. Linux/ARM version.
+ This file is part of the GNU C Library.
+ Copyright (C) 2017 Free Software Foundation, Inc.
+
+ 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 <ifunc-init.h>
+
+#define INIT_ARCH()
+
+#define arm_libc_ifunc_redirected(redirected_name, name, expr) \
+ __ifunc (redirected_name, name, expr(hwcap), int hwcap, INIT_ARCH)
+
+#if defined SHARED
+# define arm_libc_ifunc_hidden_def(redirect_name, name) \
+ __hidden_ver1 (name, __GI_##name, redirect_name) \
+ __attribute__ ((visibility ("hidden")))
+#else
+# define arm_libc_ifunc_hidden_def(redirect_name, name)
+#endif
diff --git a/sysdeps/arm/armv7/multiarch/Makefile b/sysdeps/arm/armv7/multiarch/Makefile
index 9e1e61c..1e62ef9 100644
--- a/sysdeps/arm/armv7/multiarch/Makefile
+++ b/sysdeps/arm/armv7/multiarch/Makefile
@@ -1,3 +1,3 @@
ifeq ($(subdir),string)
-sysdep_routines += memcpy_neon memcpy_vfp memchr_neon
+sysdep_routines += memcpy_neon memcpy_vfp memchr_neon memcpy_arm
endif
diff --git a/sysdeps/arm/armv7/multiarch/ifunc-memcpy.h b/sysdeps/arm/armv7/multiarch/ifunc-memcpy.h
new file mode 100644
index 0000000..78cef2a
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/ifunc-memcpy.h
@@ -0,0 +1,37 @@
+/* Common definition for memcpy resolver.
+ Copyright (C) 2017 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/>. */
+
+#ifdef __SOFTFP__
+__typeof (REDIRECT_NAME) OPTIMIZE (arm) attribute_hidden;
+#endif
+__typeof (REDIRECT_NAME) OPTIMIZE (vfp) attribute_hidden;
+__typeof (REDIRECT_NAME) OPTIMIZE (neon) attribute_hidden;
+
+static inline void *
+IFUNC_SELECTOR (int hwcap)
+{
+ if (hwcap & HWCAP_ARM_NEON)
+ return OPTIMIZE (neon);
+#ifdef __SOFTFP__
+ if (hwcap & HWCAP_ARM_VFP)
+ return OPTIMIZE (vfp);
+ return OPTIMIZE (arm);
+#else
+ return OPTIMIZE (vfp);
+#endif
+}
diff --git a/sysdeps/arm/armv7/multiarch/memcpy.S b/sysdeps/arm/armv7/multiarch/memcpy.S
deleted file mode 100644
index 8a53bda..0000000
--- a/sysdeps/arm/armv7/multiarch/memcpy.S
+++ /dev/null
@@ -1,76 +0,0 @@
-/* Multiple versions of memcpy
- All versions must be listed in ifunc-impl-list.c.
- Copyright (C) 2013-2017 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/>. */
-
-/* Thumb requires excess IT instructions here. */
-#define NO_THUMB
-#include <sysdep.h>
-#include <rtld-global-offsets.h>
-
-#if IS_IN (libc)
-/* Under __ARM_NEON__, memcpy_neon.S defines the name memcpy. */
-# ifndef __ARM_NEON__
- .text
-ENTRY(memcpy)
- .type memcpy, %gnu_indirect_function
-# ifdef __SOFTFP__
- ldr r1, .Lmemcpy_arm
- tst r0, #HWCAP_ARM_VFP
- ldrne r1, .Lmemcpy_vfp
-# else
- ldr r1, .Lmemcpy_vfp
-# endif
- tst r0, #HWCAP_ARM_NEON
- ldrne r1, .Lmemcpy_neon
-1:
- add r0, r1, pc
- DO_RET(lr)
-
-# ifdef __SOFTFP__
-.Lmemcpy_arm:
- .long C_SYMBOL_NAME(__memcpy_arm) - 1b - PC_OFS
-# endif
-.Lmemcpy_neon:
- .long C_SYMBOL_NAME(__memcpy_neon) - 1b - PC_OFS
-.Lmemcpy_vfp:
- .long C_SYMBOL_NAME(__memcpy_vfp) - 1b - PC_OFS
-
-END(memcpy)
-
-libc_hidden_builtin_def (memcpy)
-#endif /* Not __ARM_NEON__. */
-
-/* These versions of memcpy are defined not to clobber any VFP or NEON
- registers so they must always call the ARM variant of the memcpy code. */
-strong_alias (__memcpy_arm, __aeabi_memcpy)
-strong_alias (__memcpy_arm, __aeabi_memcpy4)
-strong_alias (__memcpy_arm, __aeabi_memcpy8)
-libc_hidden_def (__memcpy_arm)
-
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(name)
-#undef weak_alias
-#define weak_alias(x, y)
-#undef libc_hidden_def
-#define libc_hidden_def(name)
-
-#define memcpy __memcpy_arm
-
-#endif
-
-#include "memcpy_impl.S"
diff --git a/sysdeps/arm/armv7/multiarch/memcpy.c b/sysdeps/arm/armv7/multiarch/memcpy.c
new file mode 100644
index 0000000..b94a017
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/memcpy.c
@@ -0,0 +1,35 @@
+/* Multiple versions of memcpy.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2017 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/>. */
+
+/* For __ARM_NEON__ memchr_neon.S defines memchr directly and ifunc
+ is not used. */
+#if IS_IN (libc) && !defined (__ARM_NEON__)
+# define memcpy __redirect_memcpy
+# include <string.h>
+# undef memcpy
+
+# include <arm-ifunc.h>
+
+# define SYMBOL_NAME memcpy
+# include "ifunc-memcpy.h"
+
+arm_libc_ifunc_redirected (__redirect_memcpy, memcpy, IFUNC_SELECTOR);
+
+arm_libc_ifunc_hidden_def (__redirect_memcpy, memcpy);
+#endif
diff --git a/sysdeps/arm/armv7/multiarch/memcpy_arm.S b/sysdeps/arm/armv7/multiarch/memcpy_arm.S
new file mode 100644
index 0000000..e4a9a68
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/memcpy_arm.S
@@ -0,0 +1,10 @@
+#define memcpy __memcpy_arm
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(a)
+#include "memcpy_impl.S"
+
+/* These versions of memcpy are defined not to clobber any VFP or NEON
+ registers so they must always call the ARM variant of the memcpy code. */
+strong_alias (__memcpy_arm, __aeabi_memcpy)
+strong_alias (__memcpy_arm, __aeabi_memcpy4)
+strong_alias (__memcpy_arm, __aeabi_memcpy8)
diff --git a/sysdeps/arm/armv7/multiarch/memcpy_neon.S b/sysdeps/arm/armv7/multiarch/memcpy_neon.S
index e60d1cc..1a8d8bb 100644
--- a/sysdeps/arm/armv7/multiarch/memcpy_neon.S
+++ b/sysdeps/arm/armv7/multiarch/memcpy_neon.S
@@ -1,8 +1,8 @@
-#ifdef __ARM_NEON__
-/* Under __ARM_NEON__, this file defines memcpy directly. */
-libc_hidden_builtin_def (memcpy)
-#else
+/* For __ARM_NEON__ this file defines memcpy. */
+#ifndef __ARM_NEON__
# define memcpy __memcpy_neon
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(a)
#endif
#define MEMCPY_NEON
diff --git a/sysdeps/arm/armv7/multiarch/memcpy_vfp.S b/sysdeps/arm/armv7/multiarch/memcpy_vfp.S
index e008c04..d1e9ede 100644
--- a/sysdeps/arm/armv7/multiarch/memcpy_vfp.S
+++ b/sysdeps/arm/armv7/multiarch/memcpy_vfp.S
@@ -1,7 +1,9 @@
-/* Under __ARM_NEON__, memcpy_neon.S defines memcpy directly
+/* Under __ARM_NEON__ memcpy_neon.S defines memcpy directly
and the __memcpy_vfp code will never be used. */
#ifndef __ARM_NEON__
# define MEMCPY_VFP
# define memcpy __memcpy_vfp
+# undef libc_hidden_builtin_def
+# define libc_hidden_builtin_def(a)
# include "memcpy_impl.S"
#endif
diff --git a/sysdeps/arm/armv7/multiarch/rtld-memcpy.S b/sysdeps/arm/armv7/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000..ca23875
--- /dev/null
+++ b/sysdeps/arm/armv7/multiarch/rtld-memcpy.S
@@ -0,0 +1 @@
+#include <sysdeps/arm/armv7/multiarch/memcpy_impl.S>
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 01/25] arm: Implement memcpy ifunc selection in C
2017-10-26 19:07 ` [PATCH 01/25] arm: Implement memcpy ifunc selection in C Adhemerval Zanella
@ 2017-10-31 18:16 ` Joseph Myers
0 siblings, 0 replies; 52+ messages in thread
From: Joseph Myers @ 2017-10-31 18:16 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha
On Thu, 26 Oct 2017, Adhemerval Zanella wrote:
> This patch refactor ARM memcpy ifunc selector to a C implementation.
> No functional change is expected, including ifunc resolution rules.
>
> It also adds some cleanup:
>
> - Internal memcpy hidden definition (__GI_memcpy) is now a hidden
> symbol.
>
> - No need to create hidden definition for the ifunc variants.
>
> Checked on armv7-linux-gnueabihf and with a build for arm-linux-gnueabi,
> arm-linux-gnueabihf with and without multiarch support and with both
> GCC 7.1 and GCC mainline. I also checked with the some possible
> multiarch different configurations that trigger different memcpy
> buids (__ARM_NEON__ && !__SOFT_FP__, !__ARM_NEON__ && !__SOFT_FP__, and
> !__ARM_NEON__ && __SOFT_FP__).
OK.
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 18/25] sparc: refactor sparc32 copysign selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (21 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 01/25] arm: Implement memcpy ifunc selection in C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 22/25] sparc: refactor sparc32 nearbyint{f} " Adhemerval Zanella
` (2 subsequent siblings)
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc32 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_copysign{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
(sysdep_calls): New rule.
(sysdep_routines): Use sysdep_calls as base.
(libm-sysdep_routines): Add generic rule for symbols shared with
libc. Add s_copysign-generic and s_copysign-generic objects.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_copysign-generic.S: New
file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysign.c: Likewise.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_copysignf-generic.S:
Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysignf.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysign.S: Remove file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysignf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 14 ++++++++
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 15 ++++++---
.../sparcv9/fpu/multiarch/s_copysign-generic.S | 8 +++++
.../sparc32/sparcv9/fpu/multiarch/s_copysign.S | 21 ------------
.../sparc32/sparcv9/fpu/multiarch/s_copysign.c | 38 ++++++++++++++++++++++
.../sparcv9/fpu/multiarch/s_copysignf-generic.S | 4 +++
.../sparc32/sparcv9/fpu/multiarch/s_copysignf.S | 12 -------
.../sparc32/sparcv9/fpu/multiarch/s_copysignf.c | 11 +++++++
8 files changed, 86 insertions(+), 37 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index 62bf6f1..b8d1126 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -1,12 +1,19 @@
ifeq ($(subdir),math)
-libm-sysdep_routines += m_copysignf-vis3 m_copysign-vis3 s_fabs-vis3 \
- s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
+
+# These functions are built both for libc and libm because they're required
+# by printf. While the libc objects have the prefix s_, the libm ones are
+# prefixed with m_.
+sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
+ s_copysign-generic
+
+sysdep_routines += $(sysdep_calls)
+libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
- s_fdimf-generic
-sysdep_routines += s_copysignf-vis3 s_copysign-vis3
+ s_fdimf-generic \
+ $(sysdep_calls:s_%=m_%)
CFLAGS-s_fdimf-vis3.c += -Wa,-Av9d -mvis3
CFLAGS-s_fdim-vis3.c += -Wa,-Av9d -mvis3
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
new file mode 100644
index 0000000..55fb0ed
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
@@ -0,0 +1,8 @@
+#include <math_ldbl_opt.h>
+
+#define __copysign __copysign_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#undef compat_symbol
+#define compat_symbol(a, b, c, d)
+#include <sysdeps/sparc/sparc32/fpu/s_copysign.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
deleted file mode 100644
index 5d26430..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
+++ /dev/null
@@ -1,21 +0,0 @@
-#include <sparc-ifunc.h>
-#include <math_ldbl_opt.h>
-
-SPARC_ASM_VIS3_IFUNC(copysign)
-
-weak_alias (__copysign, copysign)
-#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
-compat_symbol (libm, __copysign, copysignl, GLIBC_2_0);
-#endif
-#if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
-compat_symbol (libc, __copysign, copysignl, GLIBC_2_0);
-#endif
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-
-#define __copysign __copysign_generic
-
-#include "../../../fpu/s_copysign.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
new file mode 100644
index 0000000..f11181b
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
@@ -0,0 +1,38 @@
+/* copysign ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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/>. */
+
+#define __copysign __redirect_copysign
+#include <math.h>
+#include <math_ldbl_opt.h>
+#undef __copysign
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_copysign) __copysign_vis3 attribute_hidden;
+extern __typeof (__redirect_copysign) __copysign_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_copysign, __copysign,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __copysign_vis3
+ : __copysign_generic);
+weak_alias (__copysign, copysign)
+#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
+compat_symbol (libm, __copysign, copysignl, GLIBC_2_0);
+#endif
+#if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
+compat_symbol (libc, __copysign, copysignl, GLIBC_2_0);
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
new file mode 100644
index 0000000..ebe0759
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
@@ -0,0 +1,4 @@
+#define __copysignf __copysignf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc32/fpu/s_copysignf.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
deleted file mode 100644
index cd40955..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(copysignf)
-
-weak_alias (__copysignf, copysignf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __copysignf __copysignf_generic
-
-#include "../../../fpu/s_copysignf.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
new file mode 100644
index 0000000..573c14d
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
@@ -0,0 +1,11 @@
+#include <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (copysignf) __copysignf_vis3 attribute_hidden;
+extern __typeof (copysignf) __copysignf_generic attribute_hidden;
+
+sparc_libm_ifunc (__copysignf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __copysignf_vis3
+ : __copysignf_generic);
+weak_alias (__copysignf, copysignf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 18/25] sparc: refactor sparc32 copysign selector to C
2017-10-26 19:07 ` [PATCH 18/25] sparc: refactor sparc32 copysign selector to C Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
2017-12-01 17:13 ` Joseph Myers
0 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly. I had to adjust to use
Joseph recent changes to use libc_alias_{float,double}.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc32 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_copysign{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> (sysdep_calls): New rule.
> (sysdep_routines): Use sysdep_calls as base.
> (libm-sysdep_routines): Add generic rule for symbols shared with
> libc. Add s_copysign-generic and s_copysign-generic objects.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_copysign-generic.S: New
> file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysign.c: Likewise.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_copysignf-generic.S:
> Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysignf.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysign.S: Remove file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_copysignf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 14 ++++++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 15 ++++++---
> .../sparcv9/fpu/multiarch/s_copysign-generic.S | 8 +++++
> .../sparc32/sparcv9/fpu/multiarch/s_copysign.S | 21 ------------
> .../sparc32/sparcv9/fpu/multiarch/s_copysign.c | 38 ++++++++++++++++++++++
> .../sparcv9/fpu/multiarch/s_copysignf-generic.S | 4 +++
> .../sparc32/sparcv9/fpu/multiarch/s_copysignf.S | 12 -------
> .../sparc32/sparcv9/fpu/multiarch/s_copysignf.c | 11 +++++++
> 8 files changed, 86 insertions(+), 37 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index 62bf6f1..b8d1126 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -1,12 +1,19 @@
> ifeq ($(subdir),math)
> -libm-sysdep_routines += m_copysignf-vis3 m_copysign-vis3 s_fabs-vis3 \
> - s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
> +
> +# These functions are built both for libc and libm because they're required
> +# by printf. While the libc objects have the prefix s_, the libm ones are
> +# prefixed with m_.
> +sysdep_calls := s_copysignf-vis3 s_copysign-vis3 s_copysignf-generic \
> + s_copysign-generic
> +
> +sysdep_routines += $(sysdep_calls)
> +libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_llrintf-vis3 s_llrint-vis3 \
> s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
> - s_fdimf-generic
> -sysdep_routines += s_copysignf-vis3 s_copysign-vis3
> + s_fdimf-generic \
> + $(sysdep_calls:s_%=m_%)
>
> CFLAGS-s_fdimf-vis3.c += -Wa,-Av9d -mvis3
> CFLAGS-s_fdim-vis3.c += -Wa,-Av9d -mvis3
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
> new file mode 100644
> index 0000000..55fb0ed
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
> @@ -0,0 +1,8 @@
> +#include <math_ldbl_opt.h>
> +
> +#define __copysign __copysign_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#undef compat_symbol
> +#define compat_symbol(a, b, c, d)
> +#include <sysdeps/sparc/sparc32/fpu/s_copysign.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
> deleted file mode 100644
> index 5d26430..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -#include <sparc-ifunc.h>
> -#include <math_ldbl_opt.h>
> -
> -SPARC_ASM_VIS3_IFUNC(copysign)
> -
> -weak_alias (__copysign, copysign)
> -#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
> -compat_symbol (libm, __copysign, copysignl, GLIBC_2_0);
> -#endif
> -#if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
> -compat_symbol (libc, __copysign, copysignl, GLIBC_2_0);
> -#endif
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef compat_symbol
> -# define compat_symbol(a, b, c, d)
> -
> -#define __copysign __copysign_generic
> -
> -#include "../../../fpu/s_copysign.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
> new file mode 100644
> index 0000000..f11181b
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
> @@ -0,0 +1,38 @@
> +/* copysign ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __copysign __redirect_copysign
> +#include <math.h>
> +#include <math_ldbl_opt.h>
> +#undef __copysign
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_copysign) __copysign_vis3 attribute_hidden;
> +extern __typeof (__redirect_copysign) __copysign_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_copysign, __copysign,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __copysign_vis3
> + : __copysign_generic);
> +weak_alias (__copysign, copysign)
> +#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_0)
> +compat_symbol (libm, __copysign, copysignl, GLIBC_2_0);
> +#endif
> +#if LONG_DOUBLE_COMPAT (libc, GLIBC_2_0)
> +compat_symbol (libc, __copysign, copysignl, GLIBC_2_0);
> +#endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
> new file mode 100644
> index 0000000..ebe0759
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
> @@ -0,0 +1,4 @@
> +#define __copysignf __copysignf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc32/fpu/s_copysignf.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
> deleted file mode 100644
> index cd40955..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(copysignf)
> -
> -weak_alias (__copysignf, copysignf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __copysignf __copysignf_generic
> -
> -#include "../../../fpu/s_copysignf.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
> new file mode 100644
> index 0000000..573c14d
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
> @@ -0,0 +1,11 @@
> +#include <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (copysignf) __copysignf_vis3 attribute_hidden;
> +extern __typeof (copysignf) __copysignf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__copysignf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __copysignf_vis3
> + : __copysignf_generic);
> +weak_alias (__copysignf, copysignf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 18/25] sparc: refactor sparc32 copysign selector to C
2017-11-30 20:33 ` Adhemerval Zanella
@ 2017-12-01 17:13 ` Joseph Myers
2017-12-01 17:48 ` Adhemerval Zanella
0 siblings, 1 reply; 52+ messages in thread
From: Joseph Myers @ 2017-12-01 17:13 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha
I'm seeing a build failure for sparcv9-linux-gnu.
https://sourceware.org/ml/libc-testresults/2017-q4/msg00399.html
../sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c:33:32: error: 'copysign' aliased to external symbol '__copysign'
libm_alias_double (__copysign, copysign)
^
./../include/libc-symbols.h:146:26: note: in definition of macro '_weak_alias'
extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
^~~~~~~~~
../sysdeps/ieee754/ldbl-opt/libm-alias-double.h:44:3: note: in expansion of macro 'weak_alias'
weak_alias (from ## r, to ## r); \
^~~~~~~~~~
../sysdeps/ieee754/ldbl-opt/libm-alias-double.h:53:37: note: in expansion of macro 'libm_alias_double_r'
#define libm_alias_double(from, to) libm_alias_double_r (from, to, )
^~~~~~~~~~~~~~~~~~~
../sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c:33:1: note: in expansion of macro 'libm_alias_double'
libm_alias_double (__copysign, copysign)
^~~~~~~~~~~~~~~~~
/scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/sysd-rules:67: recipe for target '/scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/math/s_copysign.os' failed
make[3]: *** [/scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/math/s_copysign.os] Error 1
--
Joseph S. Myers
joseph@codesourcery.com
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 18/25] sparc: refactor sparc32 copysign selector to C
2017-12-01 17:13 ` Joseph Myers
@ 2017-12-01 17:48 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-12-01 17:48 UTC (permalink / raw)
To: Joseph Myers; +Cc: libc-alpha
On 01/12/2017 15:13, Joseph Myers wrote:
> I'm seeing a build failure for sparcv9-linux-gnu.
>
> https://sourceware.org/ml/libc-testresults/2017-q4/msg00399.html
>
> ../sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c:33:32: error: 'copysign' aliased to external symbol '__copysign'
> libm_alias_double (__copysign, copysign)
> ^
> ./../include/libc-symbols.h:146:26: note: in definition of macro '_weak_alias'
> extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
> ^~~~~~~~~
> ../sysdeps/ieee754/ldbl-opt/libm-alias-double.h:44:3: note: in expansion of macro 'weak_alias'
> weak_alias (from ## r, to ## r); \
> ^~~~~~~~~~
> ../sysdeps/ieee754/ldbl-opt/libm-alias-double.h:53:37: note: in expansion of macro 'libm_alias_double_r'
> #define libm_alias_double(from, to) libm_alias_double_r (from, to, )
> ^~~~~~~~~~~~~~~~~~~
> ../sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c:33:1: note: in expansion of macro 'libm_alias_double'
> libm_alias_double (__copysign, copysign)
> ^~~~~~~~~~~~~~~~~
> /scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/sysd-rules:67: recipe for target '/scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/math/s_copysign.os' failed
> make[3]: *** [/scratch/jmyers/glibc-bot/build/glibcs/sparcv9-linux-gnu/glibc/math/s_copysign.os] Error 1
>
It should be fixed now, sorry for the trouble.
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 22/25] sparc: refactor sparc32 nearbyint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (22 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 18/25] sparc: refactor sparc32 copysign selector to C Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-30 20:33 ` Adhemerval Zanella
2017-10-26 19:07 ` [PATCH 10/25] sparc: refactor sparc64 " Adhemerval Zanella
2017-11-24 18:54 ` [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc32 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_nearbyint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_nearbyintf-generic and
s_nearbyint-generic.
* sysdeps/sparc/sparcv9/fpu/multiarch/s_nearbyint-generic.S: New
file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S:
Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c: Likewise.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S: Remove file.
* sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 12 ++++++++
.../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 6 ++--
.../sparcv9/fpu/multiarch/s_nearbyint-generic.S | 9 ++++++
.../sparc32/sparcv9/fpu/multiarch/s_nearbyint.S | 19 ------------
.../sparc32/sparcv9/fpu/multiarch/s_nearbyint.c | 35 ++++++++++++++++++++++
.../sparcv9/fpu/multiarch/s_nearbyintf-generic.S | 4 +++
.../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S | 12 --------
.../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c | 29 ++++++++++++++++++
8 files changed, 92 insertions(+), 34 deletions(-)
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
index 459c0e5..1a26ee1 100644
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
@@ -11,9 +11,9 @@ libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
s_llrintf-generic s_llrint-generic \
s_rintf-vis3 s_rint-vis3 s_rintf-generic \
- s_rint-generic \
- s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
- s_nearbyint-vis3 s_nearbyintf-vis3 \
+ s_rint-generic s_fmaf-vis3 s_fma-vis3 s_fma-generic \
+ s_fmaf-generic s_nearbyint-vis3 s_nearbyintf-vis3 \
+ s_nearbyint-generic s_nearbyintf-generic \
s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
s_fdimf-generic \
$(sysdep_calls:s_%=m_%)
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
new file mode 100644
index 0000000..fd4112e
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
@@ -0,0 +1,9 @@
+#include <math_ldbl_opt.h>
+
+#define __nearbyint __nearbyint_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#undef compat_symbol
+#define compat_symbol(a, b, c, d)
+
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyint.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
deleted file mode 100644
index 47da9ea..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
+++ /dev/null
@@ -1,19 +0,0 @@
-#include <sparc-ifunc.h>
-#include <math_ldbl_opt.h>
-
-SPARC_ASM_VIS3_IFUNC(nearbyint)
-
-weak_alias (__nearbyint, nearbyint)
-
-#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
-compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1)
-#endif
-
-# undef weak_alias
-# define weak_alias(a, b)
-# undef compat_symbol
-# define compat_symbol(a, b, c, d)
-
-#define __nearbyint __nearbyint_generic
-
-#include "../s_nearbyint.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
new file mode 100644
index 0000000..5a2b6e4
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
@@ -0,0 +1,35 @@
+/* nearbyint ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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/>. */
+
+#define __nearbyint __redirect_nearbyint
+#include <math.h>
+#undef __nearbyint
+#include <math_ldbl_opt.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (__redirect_nearbyint) __nearbyint_vis3 attribute_hidden;
+extern __typeof (__redirect_nearbyint) __nearbyint_generic attribute_hidden;
+
+sparc_libm_ifunc_redirected (__redirect_nearbyint, __nearbyint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __nearbyint_vis3
+ : __nearbyint_generic);
+weak_alias (__nearbyint, nearbyint)
+#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
+compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1);
+#endif
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
new file mode 100644
index 0000000..8f9088e
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
@@ -0,0 +1,4 @@
+#define __nearbyintf __nearbyintf_generic
+#undef weak_alias
+#define weak_alias(a, b)
+#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyintf.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
deleted file mode 100644
index 95100c1..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(nearbyintf)
-
-weak_alias (__nearbyintf, nearbyintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __nearbyintf __nearbyintf_generic
-
-#include "../s_nearbyintf.S"
diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
new file mode 100644
index 0000000..a513fa7
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
@@ -0,0 +1,29 @@
+/* nearbyintf ifunc resolver, Linux/sparc32 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (nearbyintf) __nearbyintf_vis3 attribute_hidden;
+extern __typeof (nearbyintf) __nearbyintf_generic attribute_hidden;
+
+sparc_libm_ifunc (__nearbyintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __nearbyintf_vis3
+ : __nearbyintf_generic);
+weak_alias (__nearbyintf, nearbyintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 22/25] sparc: refactor sparc32 nearbyint{f} selector to C
2017-10-26 19:07 ` [PATCH 22/25] sparc: refactor sparc32 nearbyint{f} " Adhemerval Zanella
@ 2017-11-30 20:33 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-30 20:33 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly. I had to adjust to use
Joseph recent changes to use libc_alias_{float,double}.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc32 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_nearbyint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_nearbyintf-generic and
> s_nearbyint-generic.
> * sysdeps/sparc/sparcv9/fpu/multiarch/s_nearbyint-generic.S: New
> file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S:
> Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c: Likewise.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S: Remove file.
> * sysdeps/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 12 ++++++++
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 6 ++--
> .../sparcv9/fpu/multiarch/s_nearbyint-generic.S | 9 ++++++
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyint.S | 19 ------------
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyint.c | 35 ++++++++++++++++++++++
> .../sparcv9/fpu/multiarch/s_nearbyintf-generic.S | 4 +++
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S | 12 --------
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c | 29 ++++++++++++++++++
> 8 files changed, 92 insertions(+), 34 deletions(-)
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> index 459c0e5..1a26ee1 100644
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/Makefile
> @@ -11,9 +11,9 @@ libm-sysdep_routines += s_fabs-vis3 s_fabsf-vis3 s_fabs-generic \
> s_fabsf-generic s_llrintf-vis3 s_llrint-vis3 \
> s_llrintf-generic s_llrint-generic \
> s_rintf-vis3 s_rint-vis3 s_rintf-generic \
> - s_rint-generic \
> - s_fmaf-vis3 s_fma-vis3 s_fma-generic s_fmaf-generic \
> - s_nearbyint-vis3 s_nearbyintf-vis3 \
> + s_rint-generic s_fmaf-vis3 s_fma-vis3 s_fma-generic \
> + s_fmaf-generic s_nearbyint-vis3 s_nearbyintf-vis3 \
> + s_nearbyint-generic s_nearbyintf-generic \
> s_fdimf-vis3 s_fdim-vis3 s_fdim-generic \
> s_fdimf-generic \
> $(sysdep_calls:s_%=m_%)
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
> new file mode 100644
> index 0000000..fd4112e
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
> @@ -0,0 +1,9 @@
> +#include <math_ldbl_opt.h>
> +
> +#define __nearbyint __nearbyint_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#undef compat_symbol
> +#define compat_symbol(a, b, c, d)
> +
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyint.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
> deleted file mode 100644
> index 47da9ea..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
> +++ /dev/null
> @@ -1,19 +0,0 @@
> -#include <sparc-ifunc.h>
> -#include <math_ldbl_opt.h>
> -
> -SPARC_ASM_VIS3_IFUNC(nearbyint)
> -
> -weak_alias (__nearbyint, nearbyint)
> -
> -#if LONG_DOUBLE_COMPAT(libm, GLIBC_2_1)
> -compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1)
> -#endif
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -# undef compat_symbol
> -# define compat_symbol(a, b, c, d)
> -
> -#define __nearbyint __nearbyint_generic
> -
> -#include "../s_nearbyint.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
> new file mode 100644
> index 0000000..5a2b6e4
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
> @@ -0,0 +1,35 @@
> +/* nearbyint ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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/>. */
> +
> +#define __nearbyint __redirect_nearbyint
> +#include <math.h>
> +#undef __nearbyint
> +#include <math_ldbl_opt.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (__redirect_nearbyint) __nearbyint_vis3 attribute_hidden;
> +extern __typeof (__redirect_nearbyint) __nearbyint_generic attribute_hidden;
> +
> +sparc_libm_ifunc_redirected (__redirect_nearbyint, __nearbyint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __nearbyint_vis3
> + : __nearbyint_generic);
> +weak_alias (__nearbyint, nearbyint)
> +#if LONG_DOUBLE_COMPAT (libm, GLIBC_2_1)
> +compat_symbol (libm, __nearbyint, nearbyintl, GLIBC_2_1);
> +#endif
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
> new file mode 100644
> index 0000000..8f9088e
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
> @@ -0,0 +1,4 @@
> +#define __nearbyintf __nearbyintf_generic
> +#undef weak_alias
> +#define weak_alias(a, b)
> +#include <sysdeps/sparc/sparc32/sparcv9/fpu/s_nearbyintf.S>
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
> deleted file mode 100644
> index 95100c1..0000000
> --- a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(nearbyintf)
> -
> -weak_alias (__nearbyintf, nearbyintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __nearbyintf __nearbyintf_generic
> -
> -#include "../s_nearbyintf.S"
> diff --git a/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
> new file mode 100644
> index 0000000..a513fa7
> --- /dev/null
> +++ b/sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
> @@ -0,0 +1,29 @@
> +/* nearbyintf ifunc resolver, Linux/sparc32 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (nearbyintf) __nearbyintf_vis3 attribute_hidden;
> +extern __typeof (nearbyintf) __nearbyintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__nearbyintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __nearbyintf_vis3
> + : __nearbyintf_generic);
> +weak_alias (__nearbyintf, nearbyintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* [PATCH 10/25] sparc: refactor sparc64 nearbyint{f} selector to C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (23 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 22/25] sparc: refactor sparc32 nearbyint{f} " Adhemerval Zanella
@ 2017-10-26 19:07 ` Adhemerval Zanella
2017-11-29 13:40 ` Adhemerval Zanella
2017-11-24 18:54 ` [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
25 siblings, 1 reply; 52+ messages in thread
From: Adhemerval Zanella @ 2017-10-26 19:07 UTC (permalink / raw)
To: libc-alpha
This patch refactors the sparc64 ifunc selector to a C implementation.
Also, the generic symbol is moved to its own implementation file
s_nearbyint{f}-generic.S).
Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
* sysdeps/sparc/sparc64/fpu/multiarch/Makefile
(libm-sysdep_routines): Add s_nearbyint-generic and
s_nearbyintf-generic objects.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S: New file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c: Likewise.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S: Remove file.
* sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S: Likewise.
Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
---
ChangeLog | 10 ++++++++
sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
.../sparc64/fpu/multiarch/s_nearbyint-generic.S | 4 +++
sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S | 12 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c | 29 ++++++++++++++++++++++
.../sparc64/fpu/multiarch/s_nearbyintf-generic.S | 4 +++
sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S | 12 ---------
sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c | 29 ++++++++++++++++++++++
8 files changed, 77 insertions(+), 24 deletions(-)
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
index d19a446..6062af0 100644
--- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
@@ -12,6 +12,7 @@ sysdep_routines += $(sysdep_calls)
libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
s_nearbyint-vis3 s_nearbyintf-vis3 \
+ s_nearbyint-generic s_nearbyintf-generic \
s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
s_ceil-generic s_floorf-vis3 s_floor-vis3 \
s_floorf-generic s_floor-generic s_truncf-vis3 \
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
new file mode 100644
index 0000000..efe2383
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
@@ -0,0 +1,4 @@
+#define __nearbyint __nearbyint_generic
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_nearbyint.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
deleted file mode 100644
index bb75ab3..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(nearbyint)
-
-weak_alias (__nearbyint, nearbyint)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __nearbyint __nearbyint_generic
-
-#include "../s_nearbyint.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
new file mode 100644
index 0000000..3ccb3be
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
@@ -0,0 +1,29 @@
+/* nearbyint ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (nearbyint) __nearbyint_vis3 attribute_hidden;
+extern __typeof (nearbyint) __nearbyint_generic attribute_hidden;
+
+sparc_libm_ifunc (__nearbyint,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __nearbyint_vis3
+ : __nearbyint_generic);
+weak_alias (__nearbyint, nearbyint)
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
new file mode 100644
index 0000000..a2e38e9
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
@@ -0,0 +1,4 @@
+#define __nearbyintf __nearbyintf_generic
+#undef weak_alias
+#define weak_alias(a,b)
+#include <sysdeps/sparc/sparc64/fpu/s_nearbyintf.S>
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
deleted file mode 100644
index 95100c1..0000000
--- a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
+++ /dev/null
@@ -1,12 +0,0 @@
-#include <sparc-ifunc.h>
-
-SPARC_ASM_VIS3_IFUNC(nearbyintf)
-
-weak_alias (__nearbyintf, nearbyintf)
-
-# undef weak_alias
-# define weak_alias(a, b)
-
-#define __nearbyintf __nearbyintf_generic
-
-#include "../s_nearbyintf.S"
diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
new file mode 100644
index 0000000..23e3c13
--- /dev/null
+++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
@@ -0,0 +1,29 @@
+/* nearbyintf ifunc resolver, Linux/sparc64 version.
+ Copyright (C) 2017 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 <math.h>
+#include <sparc-ifunc.h>
+
+extern __typeof (nearbyintf) __nearbyintf_vis3 attribute_hidden;
+extern __typeof (nearbyintf) __nearbyintf_generic attribute_hidden;
+
+sparc_libm_ifunc (__nearbyintf,
+ hwcap & HWCAP_SPARC_VIS3
+ ? __nearbyintf_vis3
+ : __nearbyintf_generic);
+weak_alias (__nearbyintf, nearbyintf)
--
2.7.4
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 10/25] sparc: refactor sparc64 nearbyint{f} selector to C
2017-10-26 19:07 ` [PATCH 10/25] sparc: refactor sparc64 " Adhemerval Zanella
@ 2017-11-29 13:40 ` Adhemerval Zanella
0 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-29 13:40 UTC (permalink / raw)
To: libc-alpha
If no one opposes it, I will commit it shortly.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patch refactors the sparc64 ifunc selector to a C implementation.
> Also, the generic symbol is moved to its own implementation file
> s_nearbyint{f}-generic.S).
>
> Checked on sparc64-linux-gnu and sparcv9-linux-gnu.
>
> * sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> (libm-sysdep_routines): Add s_nearbyint-generic and
> s_nearbyintf-generic objects.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S: New file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c: Likewise.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S: Remove file.
> * sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S: Likewise.
>
> Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> ChangeLog | 10 ++++++++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 1 +
> .../sparc64/fpu/multiarch/s_nearbyint-generic.S | 4 +++
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S | 12 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c | 29 ++++++++++++++++++++++
> .../sparc64/fpu/multiarch/s_nearbyintf-generic.S | 4 +++
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S | 12 ---------
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c | 29 ++++++++++++++++++++++
> 8 files changed, 77 insertions(+), 24 deletions(-)
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> index d19a446..6062af0 100644
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/Makefile
> @@ -12,6 +12,7 @@ sysdep_routines += $(sysdep_calls)
> libm-sysdep_routines += s_lrintf-vis3 s_lrint-vis3 s_rintf-vis3 s_rint-vis3 \
> s_fmaf-vis3 s_fma-vis3 s_fmaf-generic s_fma-generic \
> s_nearbyint-vis3 s_nearbyintf-vis3 \
> + s_nearbyint-generic s_nearbyintf-generic \
> s_ceilf-vis3 s_ceil-vis3 s_ceilf-generic \
> s_ceil-generic s_floorf-vis3 s_floor-vis3 \
> s_floorf-generic s_floor-generic s_truncf-vis3 \
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
> new file mode 100644
> index 0000000..efe2383
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
> @@ -0,0 +1,4 @@
> +#define __nearbyint __nearbyint_generic
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_nearbyint.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
> deleted file mode 100644
> index bb75ab3..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(nearbyint)
> -
> -weak_alias (__nearbyint, nearbyint)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __nearbyint __nearbyint_generic
> -
> -#include "../s_nearbyint.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
> new file mode 100644
> index 0000000..3ccb3be
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
> @@ -0,0 +1,29 @@
> +/* nearbyint ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (nearbyint) __nearbyint_vis3 attribute_hidden;
> +extern __typeof (nearbyint) __nearbyint_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__nearbyint,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __nearbyint_vis3
> + : __nearbyint_generic);
> +weak_alias (__nearbyint, nearbyint)
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
> new file mode 100644
> index 0000000..a2e38e9
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
> @@ -0,0 +1,4 @@
> +#define __nearbyintf __nearbyintf_generic
> +#undef weak_alias
> +#define weak_alias(a,b)
> +#include <sysdeps/sparc/sparc64/fpu/s_nearbyintf.S>
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
> deleted file mode 100644
> index 95100c1..0000000
> --- a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#include <sparc-ifunc.h>
> -
> -SPARC_ASM_VIS3_IFUNC(nearbyintf)
> -
> -weak_alias (__nearbyintf, nearbyintf)
> -
> -# undef weak_alias
> -# define weak_alias(a, b)
> -
> -#define __nearbyintf __nearbyintf_generic
> -
> -#include "../s_nearbyintf.S"
> diff --git a/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
> new file mode 100644
> index 0000000..23e3c13
> --- /dev/null
> +++ b/sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
> @@ -0,0 +1,29 @@
> +/* nearbyintf ifunc resolver, Linux/sparc64 version.
> + Copyright (C) 2017 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 <math.h>
> +#include <sparc-ifunc.h>
> +
> +extern __typeof (nearbyintf) __nearbyintf_vis3 attribute_hidden;
> +extern __typeof (nearbyintf) __nearbyintf_generic attribute_hidden;
> +
> +sparc_libm_ifunc (__nearbyintf,
> + hwcap & HWCAP_SPARC_VIS3
> + ? __nearbyintf_vis3
> + : __nearbyintf_generic);
> +weak_alias (__nearbyintf, nearbyintf)
>
^ permalink raw reply [flat|nested] 52+ messages in thread
* Re: [PATCH 00/25] Refactor IFUNC selection in C
2017-10-26 19:07 [PATCH 00/25] Refactor IFUNC selection in C Adhemerval Zanella
` (24 preceding siblings ...)
2017-10-26 19:07 ` [PATCH 10/25] sparc: refactor sparc64 " Adhemerval Zanella
@ 2017-11-24 18:54 ` Adhemerval Zanella
25 siblings, 0 replies; 52+ messages in thread
From: Adhemerval Zanella @ 2017-11-24 18:54 UTC (permalink / raw)
To: libc-alpha; +Cc: Patrick McGehearty
I have tested this patchset natively on SPARC using GCC 4.9, 5, 6, 7, and
8 without any regression. Since it does not change any semantic regarding
ifunc selection I am planning to push the mempcy and memset refactor
next week so Patrick McGehearty can rebase its work on optimized M7
implementation.
On 26/10/2017 17:06, Adhemerval Zanella wrote:
> This patchset is the continuation of two previous patchset
> [1][2][3][4] to convert ifunc implementation in assembly to C
> using GLIBC macros (which may use direct asm or GCC attributes
> depending of compiler support).
>
> No functional change is expected in generated symbols or
> ifunc selection, although some code reorganization was
> done in the case of ifunc selection also build the default
> variant at the same module. In this case a new file is
> created with 'generic' suffix.
>
> I also created a personal branch for this patchset on
> azanella/ifunc-c [5]
>
> [1] https://sourceware.org/ml/libc-alpha/2017-10/msg00578.html
> [2] https://sourceware.org/ml/libc-alpha/2017-10/msg00576.html
> [3] https://sourceware.org/ml/libc-alpha/2017-10/msg00281.html
> [4] https://sourceware.org/ml/libc-alpha/2017-10/msg00282.html
> [5] https://sourceware.org/git/?p=glibc.git;a=shortlog;h=refs/heads/azanella/ifunc-c
>
> Adhemerval Zanella (25):
> arm: Implement memcpy ifunc selection in C
> arm: Implement memchr ifunc selection in C
> sparc: Implement memcpy/mempcpy ifunc selection in C
> sparc: Implement memset/bzero ifunc selection in C
> sparc: Assume VIS3 support
> sparc: refactor sparc64 signbit{f} selector to C
> sparc: refactor sparc64 isnan{f} selector to C
> sparc: refactor sparc64 isinf{f} selector to C
> sparc: refactor sparc64 finite{f} selector to C
> sparc: refactor sparc64 nearbyint{f} selector to C
> sparc: refactor sparc64 lrint{f} selector to C
> sparc: refactor sparc64 rint{f} selector to C
> sparc: refactor sparc64 __mpn_mul_1 selector to C
> sparc: refactor sparc64 __mpn_sub_n selector to C
> sparc: refactor sparc64 __mpn_addmul_1 selector to C
> sparc: refactor sparc64 __mpn_submul_1 selector to C
> sparc: refactor sparc64 __mpn_add_n selector to C
> sparc: refactor sparc32 copysign selector to C
> sparc: refactor sparc32 fabs{f} selector to C
> sparc: refactor sparc32 llrint{f} selector to C
> sparc: refactor sparc32 rint{f} selector to C
> sparc: refactor sparc32 nearbyint{f} selector to C
> sparc: refactor cpu_relax to C
> sparc: Remove ununsed ifunc assembly macros
> x32: Remove unused getcpu implementation
>
> ChangeLog | 279 +++++++++++++++++++++
> config.h.in | 3 -
> sysdeps/arm/arm-ifunc.h | 33 +++
> sysdeps/arm/armv7/multiarch/Makefile | 3 +-
> sysdeps/arm/armv7/multiarch/ifunc-memchr.h | 28 +++
> sysdeps/arm/armv7/multiarch/ifunc-memcpy.h | 37 +++
> sysdeps/arm/armv7/multiarch/memchr.c | 35 +++
> sysdeps/arm/armv7/multiarch/memchr_impl.S | 219 ----------------
> sysdeps/arm/armv7/multiarch/memchr_neon.S | 221 +++++++++++++++-
> sysdeps/arm/armv7/multiarch/memchr_noneon.S | 5 +
> sysdeps/arm/armv7/multiarch/memcpy.S | 76 ------
> sysdeps/arm/armv7/multiarch/memcpy.c | 35 +++
> sysdeps/arm/armv7/multiarch/memcpy_arm.S | 10 +
> sysdeps/arm/armv7/multiarch/memcpy_neon.S | 8 +-
> sysdeps/arm/armv7/multiarch/memcpy_vfp.S | 4 +-
> sysdeps/arm/armv7/multiarch/rtld-memchr.S | 1 +
> sysdeps/arm/armv7/multiarch/rtld-memcpy.S | 1 +
> sysdeps/sparc/configure | 42 ----
> sysdeps/sparc/configure.ac | 29 ---
> sysdeps/sparc/sparc-ifunc.h | 163 ++----------
> sysdeps/sparc/sparc32/sparcv9/Makefile | 7 -
> sysdeps/sparc/sparc32/sparcv9/cpu_relax.S | 1 -
> sysdeps/sparc/sparc32/sparcv9/cpu_relax.c | 1 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/Makefile | 26 +-
> .../sparcv9/fpu/multiarch/s_copysign-generic.S | 8 +
> .../sparc32/sparcv9/fpu/multiarch/s_copysign.S | 21 --
> .../sparc32/sparcv9/fpu/multiarch/s_copysign.c | 38 +++
> .../sparcv9/fpu/multiarch/s_copysignf-generic.S | 4 +
> .../sparc32/sparcv9/fpu/multiarch/s_copysignf.S | 12 -
> .../sparc32/sparcv9/fpu/multiarch/s_copysignf.c | 11 +
> .../sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S | 8 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S | 18 --
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c | 35 +++
> .../sparcv9/fpu/multiarch/s_fabsf-generic.S | 4 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S | 12 -
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c | 29 +++
> .../sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c | 4 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fdim.c | 17 +-
> .../sparcv9/fpu/multiarch/s_fdimf-generic.c | 3 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf.c | 12 +-
> .../sparc32/sparcv9/fpu/multiarch/s_fma-generic.c | 2 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fma.c | 12 +-
> .../sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c | 2 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf.c | 10 +-
> .../sparcv9/fpu/multiarch/s_llrint-generic.S | 8 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S | 24 --
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c | 36 +++
> .../sparcv9/fpu/multiarch/s_llrintf-generic.S | 4 +
> .../sparc32/sparcv9/fpu/multiarch/s_llrintf.S | 17 --
> .../sparc32/sparcv9/fpu/multiarch/s_llrintf.c | 29 +++
> .../sparcv9/fpu/multiarch/s_nearbyint-generic.S | 9 +
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyint.S | 19 --
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyint.c | 35 +++
> .../sparcv9/fpu/multiarch/s_nearbyintf-generic.S | 4 +
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S | 12 -
> .../sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c | 29 +++
> .../sparc32/sparcv9/fpu/multiarch/s_rint-generic.S | 8 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S | 19 --
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c | 35 +++
> .../sparcv9/fpu/multiarch/s_rintf-generic.S | 4 +
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S | 12 -
> .../sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c | 29 +++
> sysdeps/sparc/sparc32/sparcv9/multiarch/Makefile | 3 +-
> .../sparc32/sparcv9/multiarch/memcpy-ultra1.S | 32 +++
> sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S | 4 -
> sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c | 1 +
> sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c | 1 +
> .../sparc32/sparcv9/multiarch/memset-ultra1.S | 30 +++
> sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S | 4 -
> sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c | 1 +
> .../sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S | 1 +
> sysdeps/sparc/sparc64/Makefile | 2 -
> sysdeps/sparc/sparc64/cpu_relax.S | 67 -----
> sysdeps/sparc/sparc64/cpu_relax.c | 38 +++
> sysdeps/sparc/sparc64/fpu/multiarch/Makefile | 32 ++-
> .../sparc/sparc64/fpu/multiarch/s_ceil-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_ceil.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_ceilf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_finite-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c | 37 +++
> .../sparc64/fpu/multiarch/s_finitef-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c | 33 +++
> .../sparc/sparc64/fpu/multiarch/s_floor-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_floor.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_floorf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_floorf.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_fma-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_fma.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_fmaf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_isinf-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c | 37 +++
> .../sparc/sparc64/fpu/multiarch/s_isinff-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c | 33 +++
> .../sparc/sparc64/fpu/multiarch/s_isnan-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c | 37 +++
> .../sparc/sparc64/fpu/multiarch/s_isnanf-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S | 15 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c | 33 +++
> .../sparc/sparc64/fpu/multiarch/s_lrint-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S | 17 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c | 39 +++
> .../sparc/sparc64/fpu/multiarch/s_lrintf-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S | 17 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c | 39 +++
> .../sparc64/fpu/multiarch/s_nearbyint-generic.S | 4 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S | 12 -
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c | 29 +++
> .../sparc64/fpu/multiarch/s_nearbyintf-generic.S | 4 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S | 12 -
> sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c | 29 +++
> .../sparc/sparc64/fpu/multiarch/s_rint-generic.S | 4 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S | 12 -
> sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c | 29 +++
> .../sparc/sparc64/fpu/multiarch/s_rintf-generic.S | 4 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S | 12 -
> sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c | 29 +++
> .../sparc64/fpu/multiarch/s_signbit-generic.S | 6 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S | 20 --
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c | 37 +++
> .../sparc64/fpu/multiarch/s_signbitf-generic.S | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S | 10 -
> sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c | 28 +++
> .../sparc/sparc64/fpu/multiarch/s_trunc-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_trunc.c | 19 +-
> .../sparc/sparc64/fpu/multiarch/s_truncf-generic.c | 2 +
> sysdeps/sparc/sparc64/fpu/multiarch/s_truncf.c | 19 +-
> sysdeps/sparc/sparc64/multiarch/Makefile | 7 +-
> sysdeps/sparc/sparc64/multiarch/add_n-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/add_n.S | 56 -----
> sysdeps/sparc/sparc64/multiarch/add_n.c | 28 +++
> sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/addmul_1.S | 56 -----
> sysdeps/sparc/sparc64/multiarch/addmul_1.c | 28 +++
> sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h | 40 +++
> sysdeps/sparc/sparc64/multiarch/ifunc-memset.h | 34 +++
> .../sparc64/multiarch/memcpy-ultra1.S} | 38 +--
> sysdeps/sparc/sparc64/multiarch/memcpy.S | 167 ------------
> sysdeps/sparc/sparc64/multiarch/memcpy.c | 33 +++
> sysdeps/sparc/sparc64/multiarch/mempcpy.c | 39 +++
> .../sparc64/multiarch/memset-ultra1.S} | 23 +-
> sysdeps/sparc/sparc64/multiarch/memset.S | 124 ---------
> sysdeps/sparc/sparc64/multiarch/memset.c | 42 ++++
> sysdeps/sparc/sparc64/multiarch/mul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/mul_1.S | 56 -----
> sysdeps/sparc/sparc64/multiarch/mul_1.c | 28 +++
> sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S | 1 +
> sysdeps/sparc/sparc64/multiarch/sub_n-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/sub_n.S | 56 -----
> sysdeps/sparc/sparc64/multiarch/sub_n.c | 28 +++
> sysdeps/sparc/sparc64/multiarch/submul_1-generic.S | 2 +
> sysdeps/sparc/sparc64/multiarch/submul_1.S | 56 -----
> sysdeps/sparc/sparc64/multiarch/submul_1.c | 28 +++
> 159 files changed, 2222 insertions(+), 1745 deletions(-)
> create mode 100644 sysdeps/arm/arm-ifunc.h
> create mode 100644 sysdeps/arm/armv7/multiarch/ifunc-memchr.h
> create mode 100644 sysdeps/arm/armv7/multiarch/ifunc-memcpy.h
> create mode 100644 sysdeps/arm/armv7/multiarch/memchr.c
> delete mode 100644 sysdeps/arm/armv7/multiarch/memchr_impl.S
> create mode 100644 sysdeps/arm/armv7/multiarch/memchr_noneon.S
> delete mode 100644 sysdeps/arm/armv7/multiarch/memcpy.S
> create mode 100644 sysdeps/arm/armv7/multiarch/memcpy.c
> create mode 100644 sysdeps/arm/armv7/multiarch/memcpy_arm.S
> create mode 100644 sysdeps/arm/armv7/multiarch/rtld-memchr.S
> create mode 100644 sysdeps/arm/armv7/multiarch/rtld-memcpy.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/cpu_relax.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysign.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_copysignf.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabs.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fabsf.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdim-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fdimf-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fma-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_fmaf-generic.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_llrintf.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_nearbyintf.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rint.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/fpu/multiarch/s_rintf.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy-ultra1.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memcpy.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/mempcpy.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset-ultra1.S
> delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.S
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/memset.c
> create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-mempcpy.S
> delete mode 100644 sysdeps/sparc/sparc64/cpu_relax.S
> create mode 100644 sysdeps/sparc/sparc64/cpu_relax.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceil-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_ceilf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finite.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_finitef.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floor-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_floorf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fma-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_fmaf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isinff.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnan.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_isnanf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_lrintf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_nearbyintf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rint.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_rintf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbit.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.S
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_signbitf.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_trunc-generic.c
> create mode 100644 sysdeps/sparc/sparc64/fpu/multiarch/s_truncf-generic.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/add_n.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/addmul_1.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memcpy.h
> create mode 100644 sysdeps/sparc/sparc64/multiarch/ifunc-memset.h
> rename sysdeps/{arm/armv7/multiarch/memchr.S => sparc/sparc64/multiarch/memcpy-ultra1.S} (55%)
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/memcpy.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/mempcpy.c
> rename sysdeps/{unix/sysv/linux/x86_64/x32/getcpu.c => sparc/sparc64/multiarch/memset-ultra1.S} (67%)
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/memset.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/memset.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/mul_1.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-mempcpy.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/sub_n.c
> create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1-generic.S
> delete mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.S
> create mode 100644 sysdeps/sparc/sparc64/multiarch/submul_1.c
>
^ permalink raw reply [flat|nested] 52+ messages in thread