Skip to content

Commit

Permalink
S390: Optimize strcspn and wcscspn.
Browse files Browse the repository at this point in the history
This patch provides optimized versions of strcspn and wcscspn with the z13
vector instructions.

ChangeLog:

	* sysdeps/s390/multiarch/strcspn-c.c: New File.
	* sysdeps/s390/multiarch/strcspn-vx.S: Likewise.
	* sysdeps/s390/multiarch/strcspn.c: Likewise.
	* sysdeps/s390/multiarch/wcscspn-c.c: Likewise.
	* sysdeps/s390/multiarch/wcscspn-vx.S: Likewise.
	* sysdeps/s390/multiarch/wcscspn.c: Likewise.
	* sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcspn and
	wcscspn functions.
	* sysdeps/s390/multiarch/ifunc-impl-list.c
	(__libc_ifunc_impl_list): Add ifunc test for strcspn, wcscspn.
	* wcsmbs/wcscspn.c: Use WCSCSPN if defined.
	* string/test-strcspn.c: Add wcscspn support.
	* wcsmbs/test-wcscspn.c: New File.
	* wcsmbs/Makefile (strop-tests): Add wcscspn.
	* benchtests/bench-strcspn.c: Add wcscspn support.
	* benchtests/bench-wcscspn.c: New File.
	* benchtests/Makefile (wcsmbs-bench): Add wcscspn.
  • Loading branch information
Stefan Liebler authored and Andreas Krebbel committed Aug 26, 2015
1 parent f0ba659 commit b4c2160
Show file tree
Hide file tree
Showing 16 changed files with 822 additions and 29 deletions.
20 changes: 20 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,23 @@
2015-08-26 Stefan Liebler <stli@linux.vnet.ibm.com>

* sysdeps/s390/multiarch/strcspn-c.c: New File.
* sysdeps/s390/multiarch/strcspn-vx.S: Likewise.
* sysdeps/s390/multiarch/strcspn.c: Likewise.
* sysdeps/s390/multiarch/wcscspn-c.c: Likewise.
* sysdeps/s390/multiarch/wcscspn-vx.S: Likewise.
* sysdeps/s390/multiarch/wcscspn.c: Likewise.
* sysdeps/s390/multiarch/Makefile (sysdep_routines): Add strcspn and
wcscspn functions.
* sysdeps/s390/multiarch/ifunc-impl-list.c
(__libc_ifunc_impl_list): Add ifunc test for strcspn, wcscspn.
* wcsmbs/wcscspn.c: Use WCSCSPN if defined.
* string/test-strcspn.c: Add wcscspn support.
* wcsmbs/test-wcscspn.c: New File.
* wcsmbs/Makefile (strop-tests): Add wcscspn.
* benchtests/bench-strcspn.c: Add wcscspn support.
* benchtests/bench-wcscspn.c: New File.
* benchtests/Makefile (wcsmbs-bench): Add wcscspn.

2015-08-26 Stefan Liebler <stli@linux.vnet.ibm.com>

* sysdeps/s390/multiarch/strpbrk-c.c: New File.
Expand Down
2 changes: 1 addition & 1 deletion benchtests/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ string-bench := bcopy bzero memccpy memchr memcmp memcpy memmem memmove \
strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok \
strcoll
wcsmbs-bench := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \
wcscmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk
wcscmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn
string-bench-all := $(string-bench) ${wcsmbs-bench}

# We have to generate locales
Expand Down
45 changes: 33 additions & 12 deletions benchtests/bench-strcspn.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,41 @@
#define STRPBRK_RESULT(s, pos) (pos)
#define RES_TYPE size_t
#define TEST_MAIN
#define TEST_NAME "strcspn"
#ifndef WIDE
# define TEST_NAME "strcspn"
#else
# define TEST_NAME "wcscspn"
#endif /* WIDE */
#include "bench-string.h"

typedef size_t (*proto_t) (const char *, const char *);
size_t simple_strcspn (const char *, const char *);
size_t stupid_strcspn (const char *, const char *);
#ifndef WIDE
# define STRCSPN strcspn
# define CHAR char
# define SIMPLE_STRCSPN simple_strcspn
# define STUPID_STRCSPN stupid_strcspn
# define STRLEN strlen
#else
# include <wchar.h>
# define STRCSPN wcscspn
# define CHAR wchar_t
# define SIMPLE_STRCSPN simple_wcscspn
# define STUPID_STRCSPN stupid_wcscspn
# define STRLEN wcslen
#endif /* WIDE */

IMPL (stupid_strcspn, 0)
IMPL (simple_strcspn, 0)
IMPL (strcspn, 1)
typedef size_t (*proto_t) (const CHAR *, const CHAR *);
size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *);
size_t STUPID_STRCSPN (const CHAR *, const CHAR *);

IMPL (STUPID_STRCSPN, 0)
IMPL (SIMPLE_STRCSPN, 0)
IMPL (STRCSPN, 1)

size_t
simple_strcspn (const char *s, const char *rej)
SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej)
{
const char *r, *str = s;
char c;
const CHAR *r, *str = s;
CHAR c;

while ((c = *s++) != '\0')
for (r = rej; *r != '\0'; ++r)
Expand All @@ -44,9 +63,9 @@ simple_strcspn (const char *s, const char *rej)
}

size_t
stupid_strcspn (const char *s, const char *rej)
STUPID_STRCSPN (const CHAR *s, const CHAR *rej)
{
size_t ns = strlen (s), nrej = strlen (rej);
size_t ns = STRLEN (s), nrej = STRLEN (rej);
size_t i, j;

for (i = 0; i < ns; ++i)
Expand All @@ -56,4 +75,6 @@ stupid_strcspn (const char *s, const char *rej)
return i;
}

#undef CHAR
#undef STRLEN
#include "bench-strpbrk.c"
20 changes: 20 additions & 0 deletions benchtests/bench-wcscspn.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/* Measure wcscspn functions.
Copyright (C) 2015 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 WIDE 1
#include "bench-strcspn.c"
47 changes: 34 additions & 13 deletions string/test-strcspn.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* Test and measure strcspn functions.
/* Test strcspn functions.
Copyright (C) 1999-2015 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written by Jakub Jelinek <jakub@redhat.com>, 1999.
Expand All @@ -20,22 +20,41 @@
#define STRPBRK_RESULT(s, pos) (pos)
#define RES_TYPE size_t
#define TEST_MAIN
#define TEST_NAME "strcspn"
#ifndef WIDE
# define TEST_NAME "strcspn"
#else
# define TEST_NAME "wcscspn"
#endif /* WIDE */
#include "test-string.h"

typedef size_t (*proto_t) (const char *, const char *);
size_t simple_strcspn (const char *, const char *);
size_t stupid_strcspn (const char *, const char *);
#ifndef WIDE
# define STRCSPN strcspn
# define CHAR char
# define SIMPLE_STRCSPN simple_strcspn
# define STUPID_STRCSPN stupid_strcspn
# define STRLEN strlen
#else
# include <wchar.h>
# define STRCSPN wcscspn
# define CHAR wchar_t
# define SIMPLE_STRCSPN simple_wcscspn
# define STUPID_STRCSPN stupid_wcscspn
# define STRLEN wcslen
#endif /* WIDE */

IMPL (stupid_strcspn, 0)
IMPL (simple_strcspn, 0)
IMPL (strcspn, 1)
typedef size_t (*proto_t) (const CHAR *, const CHAR *);
size_t SIMPLE_STRCSPN (const CHAR *, const CHAR *);
size_t STUPID_STRCSPN (const CHAR *, const CHAR *);

IMPL (STUPID_STRCSPN, 0)
IMPL (SIMPLE_STRCSPN, 0)
IMPL (STRCSPN, 1)

size_t
simple_strcspn (const char *s, const char *rej)
SIMPLE_STRCSPN (const CHAR *s, const CHAR *rej)
{
const char *r, *str = s;
char c;
const CHAR *r, *str = s;
CHAR c;

while ((c = *s++) != '\0')
for (r = rej; *r != '\0'; ++r)
Expand All @@ -45,9 +64,9 @@ simple_strcspn (const char *s, const char *rej)
}

size_t
stupid_strcspn (const char *s, const char *rej)
STUPID_STRCSPN (const CHAR *s, const CHAR *rej)
{
size_t ns = strlen (s), nrej = strlen (rej);
size_t ns = STRLEN (s), nrej = STRLEN (rej);
size_t i, j;

for (i = 0; i < ns; ++i)
Expand All @@ -57,4 +76,6 @@ stupid_strcspn (const char *s, const char *rej)
return i;
}

#undef CHAR
#undef STRLEN
#include "test-strpbrk.c"
6 changes: 4 additions & 2 deletions sysdeps/s390/multiarch/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ sysdep_routines += strlen strlen-vx strlen-c \
strchrnul strchrnul-vx strchrnul-c \
strrchr strrchr-vx strrchr-c \
strspn strspn-vx strspn-c \
strpbrk strpbrk-vx strpbrk-c
strpbrk strpbrk-vx strpbrk-c \
strcspn strcspn-vx strcspn-c
endif

ifeq ($(subdir),wcsmbs)
Expand All @@ -31,5 +32,6 @@ sysdep_routines += wcslen wcslen-vx wcslen-c \
wcschrnul wcschrnul-vx wcschrnul-c \
wcsrchr wcsrchr-vx wcsrchr-c \
wcsspn wcsspn-vx wcsspn-c \
wcspbrk wcspbrk-vx wcspbrk-c
wcspbrk wcspbrk-vx wcspbrk-c \
wcscspn wcscspn-vx wcscspn-c
endif
3 changes: 3 additions & 0 deletions sysdeps/s390/multiarch/ifunc-impl-list.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
IFUNC_VX_IMPL (strpbrk);
IFUNC_VX_IMPL (wcspbrk);

IFUNC_VX_IMPL (strcspn);
IFUNC_VX_IMPL (wcscspn);

#endif /* HAVE_S390_VX_ASM_SUPPORT */

return i;
Expand Down
28 changes: 28 additions & 0 deletions sysdeps/s390/multiarch/strcspn-c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
/* Default strcspn implementation for S/390.
Copyright (C) 2015 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 defined HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc)
# define STRCSPN __strcspn_c
# ifdef SHARED
# undef libc_hidden_builtin_def
# define libc_hidden_builtin_def(name) \
__hidden_ver1 (__strcspn_c, __GI_strcspn, __strcspn_c);
# endif /* SHARED */

# include <string/strcspn.c>
#endif /* HAVE_S390_VX_ASM_SUPPORT && IS_IN (libc) */
Loading

0 comments on commit b4c2160

Please sign in to comment.