From 93be09e7259caf227dd586404f3c74b61c830cb4 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 14 Oct 2013 09:43:31 -0500 Subject: PowerPC: multiarch wcscpy for PowerPC32 --- sysdeps/powerpc/power6/wcscpy.c | 105 +++++++++++++++++++++ .../powerpc/powerpc32/power4/multiarch/Makefile | 3 +- .../powerpc32/power4/multiarch/ifunc-impl-list.c | 11 +++ .../powerpc32/power4/multiarch/wcscpy-power6.c | 22 +++++ .../powerpc32/power4/multiarch/wcscpy-power7.c | 22 +++++ .../powerpc32/power4/multiarch/wcscpy-ppc32.c | 26 +++++ .../powerpc/powerpc32/power4/multiarch/wcscpy.c | 36 +++++++ sysdeps/powerpc/powerpc32/power6/wcscpy.c | 104 -------------------- sysdeps/powerpc/powerpc64/power6/wcscpy.c | 2 +- 9 files changed, 225 insertions(+), 106 deletions(-) create mode 100644 sysdeps/powerpc/power6/wcscpy.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power6.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power7.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c create mode 100644 sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c delete mode 100644 sysdeps/powerpc/powerpc32/power6/wcscpy.c (limited to 'sysdeps/powerpc') diff --git a/sysdeps/powerpc/power6/wcscpy.c b/sysdeps/powerpc/power6/wcscpy.c new file mode 100644 index 0000000000..c70c6c6d3f --- /dev/null +++ b/sysdeps/powerpc/power6/wcscpy.c @@ -0,0 +1,105 @@ +/* wcscpy.c - Wide Character Copy 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 +#include + +#ifndef WCSCPY +# define WCSCPY wcscpy +#endif + +/* Copy SRC to DEST. */ +wchar_t * +WCSCPY (wchar_t *dest, const wchar_t *src) +{ + wint_t c,d; + wchar_t *wcp, *wcp2; + + if (__alignof__ (wchar_t) >= sizeof (wchar_t)) + { + const ptrdiff_t off = dest - src; + + wcp = (wchar_t *) src; + wcp2 = wcp + 1 ; + + do + { + d = *wcp; + wcp[off] = d; + if (d == L'\0') + return dest; + wcp += 2; + + c = *wcp2; + wcp2[off] = c; + if (c == L'\0') + return dest; + wcp2 += 2; + + d = *wcp; + wcp[off] = d; + if (d == L'\0') + return dest; + wcp += 2; + + c = *wcp2; + wcp2[off] = c; + if (c == L'\0') + return dest; + wcp2 += 2; + + d = *wcp; + wcp[off] = d; + if (d == L'\0') + return dest; + wcp += 2; + + c = *wcp2; + wcp2[off] = c; + if (c == L'\0') + return dest; + wcp2 += 2; + + d = *wcp; + wcp[off] = d; + if (d == L'\0') + return dest; + wcp += 2; + + c = *wcp2; + wcp2[off] = c; + if (c == L'\0') + return dest; + wcp2 += 2; + } + while (c != L'\0'); + + } + else + { + wcp = dest; + + do + { + c = *src++; + *wcp++ = c; + } + while (c != L'\0'); + } + return dest; +} diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile index 4af490ea6e..b537b890f3 100644 --- a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile @@ -9,7 +9,8 @@ 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 wcsrchr-power7 wcsrchr-power6 wcsrchr-ppc32 + wcschr-ppc32 wcsrchr-power7 wcsrchr-power6 wcsrchr-ppc32 \ + wcscpy-power7 wcscpy-power6 wcscpy-ppc32 CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c index 7ac5c4a9fd..18034b677b 100644 --- a/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c @@ -203,5 +203,16 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, IFUNC_IMPL_ADD (array, i, wcsrchr, 1, __wcsrchr_ppc)) + /* Support sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c. */ + IFUNC_IMPL (i, name, wcscpy, + IFUNC_IMPL_ADD (array, i, wcscpy, + hwcap & PPC_FEATURE_HAS_VSX, + __wcscpy_power7) + IFUNC_IMPL_ADD (array, i, wcscpy, + hwcap & PPC_FEATURE_ARCH_2_05, + __wcscpy_power6) + IFUNC_IMPL_ADD (array, i, wcscpy, 1, + __wcscpy_ppc)) + return i; } diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power6.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power6.c new file mode 100644 index 0000000000..51d0a0a137 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power6.c @@ -0,0 +1,22 @@ +/* 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 + +#define WCSCPY __wcscpy_power6 + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power7.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power7.c new file mode 100644 index 0000000000..1eae9e98dd --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-power7.c @@ -0,0 +1,22 @@ +/* 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 + +#define WCSCPY __wcscpy_power7 + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-ppc32.c new file mode 100644 index 0000000000..8601d43acd --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy-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 WCSCPY __wcscpy_ppc +#endif + +extern __typeof (wcscpy) __wcscpy_ppc; + +#include diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c new file mode 100644 index 0000000000..252fb6cbb3 --- /dev/null +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcscpy.c @@ -0,0 +1,36 @@ +/* Multiple versions of wcscpy + 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 (wcscpy) __wcscpy_ppc attribute_hidden; +extern __typeof (wcscpy) __wcscpy_power6 attribute_hidden; +extern __typeof (wcscpy) __wcscpy_power7 attribute_hidden; + +libc_ifunc (wcscpy, + (hwcap & PPC_FEATURE_HAS_VSX) + ? __wcscpy_power7 : + (hwcap & PPC_FEATURE_ARCH_2_05) + ? __wcscpy_power6 + : __wcscpy_ppc); +#else +#include +#endif diff --git a/sysdeps/powerpc/powerpc32/power6/wcscpy.c b/sysdeps/powerpc/powerpc32/power6/wcscpy.c deleted file mode 100644 index 5950ef3dd9..0000000000 --- a/sysdeps/powerpc/powerpc32/power6/wcscpy.c +++ /dev/null @@ -1,104 +0,0 @@ -/* wcscpy.c - Wide Character Copy 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 -#include - - -/* Copy SRC to DEST. */ -wchar_t * -wcscpy (dest, src) - wchar_t *dest; - const wchar_t *src; -{ - wint_t c,d; - wchar_t *wcp, *wcp2; - - if (__alignof__ (wchar_t) >= sizeof (wchar_t)) - { - const ptrdiff_t off = dest - src; - - wcp = (wchar_t *) src; - wcp2 = wcp + 1 ; - - do - { - d = *wcp; - wcp[off] = d; - if (d == L'\0') - return dest; - wcp += 2; - - c = *wcp2; - wcp2[off] = c; - if (c == L'\0') - return dest; - wcp2 += 2; - - d = *wcp; - wcp[off] = d; - if (d == L'\0') - return dest; - wcp += 2; - - c = *wcp2; - wcp2[off] = c; - if (c == L'\0') - return dest; - wcp2 += 2; - - d = *wcp; - wcp[off] = d; - if (d == L'\0') - return dest; - wcp += 2; - - c = *wcp2; - wcp2[off] = c; - if (c == L'\0') - return dest; - wcp2 += 2; - - d = *wcp; - wcp[off] = d; - if (d == L'\0') - return dest; - wcp += 2; - - c = *wcp2; - wcp2[off] = c; - if (c == L'\0') - return dest; - wcp2 += 2; - } - while (c != L'\0'); - - } - else - { - wcp = dest; - - do - { - c = *src++; - *wcp++ = c; - } - while (c != L'\0'); - } - return dest; -} diff --git a/sysdeps/powerpc/powerpc64/power6/wcscpy.c b/sysdeps/powerpc/powerpc64/power6/wcscpy.c index 57b706ab99..722c8f995b 100644 --- a/sysdeps/powerpc/powerpc64/power6/wcscpy.c +++ b/sysdeps/powerpc/powerpc64/power6/wcscpy.c @@ -1 +1 @@ -#include "../../powerpc32/power6/wcscpy.c" +#include -- cgit 1.4.1