From bb04e529f60df7138a4fe5f1ed016dd87ade59a3 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 14 Oct 2013 09:26:07 -0500 Subject: PowerPC: multiarch wcsrchr for PowerPC32 --- sysdeps/powerpc/power6/wcsrchr.c | 89 ++++++++++++++++++++++ .../powerpc/powerpc32/power4/multiarch/Makefile | 4 +- .../powerpc32/power4/multiarch/ifunc-impl-list.c | 11 +++ .../powerpc32/power4/multiarch/wcsrchr-power6.c | 20 +++++ .../powerpc32/power4/multiarch/wcsrchr-power7.c | 20 +++++ .../powerpc32/power4/multiarch/wcsrchr-ppc32.c | 26 +++++++ .../powerpc/powerpc32/power4/multiarch/wcsrchr.c | 36 +++++++++ sysdeps/powerpc/powerpc32/power6/wcsrchr.c | 88 --------------------- sysdeps/powerpc/powerpc64/power6/wcsrchr.c | 2 +- 9 files changed, 206 insertions(+), 90 deletions(-) create mode 100644 sysdeps/powerpc/power6/wcsrchr.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power6.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power7.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c delete mode 100644 sysdeps/powerpc/powerpc32/power6/wcsrchr.c (limited to 'sysdeps/powerpc') diff --git a/sysdeps/powerpc/power6/wcsrchr.c b/sysdeps/powerpc/power6/wcsrchr.c new file mode 100644 index 0000000000..5602be35e9 --- /dev/null +++ b/sysdeps/powerpc/power6/wcsrchr.c @@ -0,0 +1,89 @@ +/* wcsrchr.c - Wide Character Reverse Search for POWER6+. + Copyright (C) 2012-2013 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; see the file COPYING.LIB. If + not, see . */ + +#include + +#ifndef WCSRCHR +# define WCSRCHR wcsrchr +#endif + +/* Find the last occurrence of WC in WCS. */ +wchar_t * +WCSRCHR (const wchar_t *wcs, const wchar_t wc) +{ + const wchar_t *wcs2 = wcs + 1; + const wchar_t *retval = NULL; + + if (*wcs == wc) + retval = wcs; + + if (*wcs == L'\0') return (wchar_t *) retval; + + do + { + wcs+=2; + + if (*wcs2 == wc) + retval = wcs2; + if (*wcs2 == L'\0') + return (wchar_t *) retval; + wcs2+=2; + + if (*wcs == wc) + retval = wcs; + if (*wcs == L'\0') + return (wchar_t *) retval; + wcs+=2; + + if (*wcs2 == wc) + retval = wcs2; + if (*wcs2 == L'\0') + return (wchar_t *) retval; + wcs2+=2; + + if (*wcs == wc) + retval = wcs; + if (*wcs == L'\0') + return (wchar_t *) retval; + wcs+=2; + + if (*wcs2 == wc) + retval = wcs2; + if (*wcs2 == L'\0') + return (wchar_t *) retval; + wcs2+=2; + + if (*wcs == wc) + retval = wcs; + if (*wcs == L'\0') + return (wchar_t *) retval; + wcs+=2; + + if (*wcs2 == wc) + retval = wcs2; + if (*wcs2 == L'\0') + return (wchar_t *) retval; + wcs2+=2; + + if (*wcs == wc) + retval = wcs; + } + while (*wcs != L'\0'); + + return (wchar_t *) retval; +} diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile index 12b180ec7d..4af490ea6e 100644 --- a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile @@ -9,10 +9,12 @@ sysdep_routines += memcpy-power7 memcpy-a2 memcpy-power6 memcpy-cell \ strcasecmp-power7 strcasecmp_l-power7 strncase-power7 \ strncase_l-power7 strchrnul-power7 strchrnul-ppc32 \ strchr-power7 strchr-ppc32 wcschr-power7 wcschr-power6 \ - wcschr-ppc32 + wcschr-ppc32 wcsrchr-power7 wcsrchr-power6 wcsrchr-ppc32 CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops CFLAGS-wcschr-power7.c += -mcpu=power7 CFLAGS-wcschr-power6.c += -mcpu=power6 +CFLAGS-wcsrchr-power7.c += -mcpu=power7 +CFLAGS-wcsrchr-power6.c += -mcpu=power6 endif diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c index a602beac98..7ac5c4a9fd 100644 --- a/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c @@ -192,5 +192,16 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL_ADD (array, i, wcschr, 1, __wcschr_ppc)) + /* Support sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c. */ + IFUNC_IMPL (i, name, wcsrchr, + IFUNC_IMPL_ADD (array, i, wcsrchr, + hwcap & PPC_FEATURE_HAS_VSX, + __wcsrchr_power7) + IFUNC_IMPL_ADD (array, i, wcsrchr, + hwcap & PPC_FEATURE_ARCH_2_05, + __wcsrchr_power6) + IFUNC_IMPL_ADD (array, i, wcsrchr, 1, + __wcsrchr_ppc)) + return i; } diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power6.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power6.c new file mode 100644 index 0000000000..68fe4775be --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power6.c @@ -0,0 +1,20 @@ +/* Copyright (C) 2013 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 + . */ + +#define WCSRCHR __wcsrchr_power6 + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power7.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power7.c new file mode 100644 index 0000000000..3422816689 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-power7.c @@ -0,0 +1,20 @@ +/* Copyright (C) 2013 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 + . */ + +#define WCSRCHR __wcsrchr_power7 + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c new file mode 100644 index 0000000000..b33eadacd8 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr-ppc32.c @@ -0,0 +1,26 @@ +/* Copyright (C) 2013 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 + . */ + +#include + +#ifndef NOT_IN_libc +# define WCSRCHR __wcsrchr_ppc +#endif + +extern __typeof (wcsrchr) __wcsrchr_ppc; + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c new file mode 100644 index 0000000000..cd0b87e935 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcsrchr.c @@ -0,0 +1,36 @@ +/* Multiple versions of wcsrchr + Copyright (C) 2013 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 + . */ + +#ifndef NOT_IN_libc +# include +# include +# include "init-arch.h" + +extern __typeof (wcsrchr) __wcsrchr_ppc attribute_hidden; +extern __typeof (wcsrchr) __wcsrchr_power6 attribute_hidden; +extern __typeof (wcsrchr) __wcsrchr_power7 attribute_hidden; + +libc_ifunc (wcsrchr, + (hwcap & PPC_FEATURE_HAS_VSX) + ? __wcsrchr_power7 : + (hwcap & PPC_FEATURE_ARCH_2_05) + ? __wcsrchr_power6 + : __wcsrchr_ppc); +#else +#include +#endif diff --git a/sysdeps/powerpc/powerpc32/power6/wcsrchr.c b/sysdeps/powerpc/powerpc32/power6/wcsrchr.c deleted file mode 100644 index 8d26af05fb..0000000000 --- a/sysdeps/powerpc/powerpc32/power6/wcsrchr.c +++ /dev/null @@ -1,88 +0,0 @@ -/* wcsrchr.c - Wide Character Reverse Search for powerpc32/power6. - Copyright (C) 2012-2013 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; see the file COPYING.LIB. If - not, see . */ - -#include - - -/* Find the last occurrence of WC in WCS. */ -wchar_t * -wcsrchr (wcs, wc) - const wchar_t *wcs; - const wchar_t wc; -{ - const wchar_t *wcs2 = wcs + 1; - const wchar_t *retval = NULL; - - if (*wcs == wc) - retval = wcs; - - if (*wcs == L'\0') return (wchar_t *) retval; - - do - { - wcs+=2; - - if (*wcs2 == wc) - retval = wcs2; - if (*wcs2 == L'\0') - return (wchar_t *) retval; - wcs2+=2; - - if (*wcs == wc) - retval = wcs; - if (*wcs == L'\0') - return (wchar_t *) retval; - wcs+=2; - - if (*wcs2 == wc) - retval = wcs2; - if (*wcs2 == L'\0') - return (wchar_t *) retval; - wcs2+=2; - - if (*wcs == wc) - retval = wcs; - if (*wcs == L'\0') - return (wchar_t *) retval; - wcs+=2; - - if (*wcs2 == wc) - retval = wcs2; - if (*wcs2 == L'\0') - return (wchar_t *) retval; - wcs2+=2; - - if (*wcs == wc) - retval = wcs; - if (*wcs == L'\0') - return (wchar_t *) retval; - wcs+=2; - - if (*wcs2 == wc) - retval = wcs2; - if (*wcs2 == L'\0') - return (wchar_t *) retval; - wcs2+=2; - - if (*wcs == wc) - retval = wcs; - } - while (*wcs != L'\0'); - - return (wchar_t *) retval; -} diff --git a/sysdeps/powerpc/powerpc64/power6/wcsrchr.c b/sysdeps/powerpc/powerpc64/power6/wcsrchr.c index 2327c05b04..b86472d7bd 100644 --- a/sysdeps/powerpc/powerpc64/power6/wcsrchr.c +++ b/sysdeps/powerpc/powerpc64/power6/wcsrchr.c @@ -1 +1 @@ -#include "../../powerpc32/power6/wcsrchr.c" +#include -- cgit 1.4.1