mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
S390: Optimize strcspn and wcscspn.
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.
This commit is contained in:
committed by
Andreas Krebbel
parent
f0ba659847
commit
b4c21601b1
@ -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.
|
||||
@ -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)
|
||||
@ -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)
|
||||
@ -57,4 +76,6 @@ stupid_strcspn (const char *s, const char *rej)
|
||||
return i;
|
||||
}
|
||||
|
||||
#undef CHAR
|
||||
#undef STRLEN
|
||||
#include "test-strpbrk.c"
|
||||
|
Reference in New Issue
Block a user