diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2012-10-11 13:58:16 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2012-10-11 13:58:16 -0700 |
commit | 9a387d1f787f764474943294024b02258f14e80a (patch) | |
tree | 3159228b99a2195dd1347a673a08efefce787ad3 /string | |
parent | 54a417345edca0015e70e8b360b7f83ade5a7507 (diff) | |
download | glibc-9a387d1f787f764474943294024b02258f14e80a.tar.gz |
Use IFUNC memmove/memset in x86-64 bcopy/bzero
Also add separate tests for bcopy and bzero.
Diffstat (limited to 'string')
-rw-r--r-- | string/Makefile | 2 | ||||
-rw-r--r-- | string/test-bcopy.c | 20 | ||||
-rw-r--r-- | string/test-bzero.c | 19 | ||||
-rw-r--r-- | string/test-memmove.c | 35 | ||||
-rw-r--r-- | string/test-memset.c | 63 |
5 files changed, 124 insertions, 15 deletions
diff --git a/string/Makefile b/string/Makefile index 6f2c6c369b..8d1db744f7 100644 --- a/string/Makefile +++ b/string/Makefile @@ -49,7 +49,7 @@ strop-tests := memchr memcmp memcpy memmove mempcpy memset memccpy \ stpcpy stpncpy strcat strchr strcmp strcpy strcspn \ strlen strncmp strncpy strpbrk strrchr strspn memmem \ strstr strcasestr strnlen strcasecmp strncasecmp \ - strncat rawmemchr strchrnul + strncat rawmemchr strchrnul bcopy bzero tests := tester inl-tester noinl-tester testcopy test-ffs \ tst-strlen stratcliff tst-svc tst-inlcall \ bug-strncat1 bug-strspn1 bug-strpbrk1 tst-bswap \ diff --git a/string/test-bcopy.c b/string/test-bcopy.c new file mode 100644 index 0000000000..bf9347bcce --- /dev/null +++ b/string/test-bcopy.c @@ -0,0 +1,20 @@ +/* Test and measure bcopy functions. + Copyright (C) 2012 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 TEST_BCOPY +#include "test-memmove.c" diff --git a/string/test-bzero.c b/string/test-bzero.c new file mode 100644 index 0000000000..b59a7e49e1 --- /dev/null +++ b/string/test-bzero.c @@ -0,0 +1,19 @@ +/* Test and measure bzero functions. + Copyright (C) 2012 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 TEST_BZERO +#include "test-memset.c" diff --git a/string/test-memmove.c b/string/test-memmove.c index 7d10712394..cbd40cd31e 100644 --- a/string/test-memmove.c +++ b/string/test-memmove.c @@ -1,5 +1,5 @@ /* Test and measure memmove functions. - Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Jakub Jelinek <jakub@redhat.com>, 1999. @@ -20,11 +20,26 @@ #define TEST_MAIN #include "test-string.h" -typedef char *(*proto_t) (char *, const char *, size_t); char *simple_memmove (char *, const char *, size_t); +#ifdef TEST_BCOPY +typedef void (*proto_t) (const char *, char *, size_t); +void simple_bcopy (const char *, char *, size_t); + +IMPL (simple_bcopy, 0) +IMPL (bcopy, 1) + +void +simple_bcopy (const char *src, char *dst, size_t n) +{ + simple_memmove (dst, src, n); +} +#else +typedef char *(*proto_t) (char *, const char *, size_t); + IMPL (simple_memmove, 0) IMPL (memmove, 1) +#endif char * simple_memmove (char *dst, const char *src, size_t n) @@ -47,9 +62,12 @@ static void do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src, size_t len) { + memcpy (src, orig_src, len); +#ifdef TEST_BCOPY + CALL (impl, src, dst, len); +#else char *res; - memcpy (src, orig_src, len); res = CALL (impl, dst, src, len); if (res != dst) { @@ -58,6 +76,7 @@ do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src, ret = 1; return; } +#endif if (memcmp (dst, orig_src, len) != 0) { @@ -77,7 +96,11 @@ do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src, for (i = 0; i < 32; ++i) { HP_TIMING_NOW (start); +#ifdef TEST_BCOPY + CALL (impl, src, dst, len); +#else CALL (impl, dst, src, len); +#endif HP_TIMING_NOW (stop); HP_TIMING_BEST (best_time, start, stop); } @@ -123,7 +146,9 @@ do_random_tests (void) size_t srcstart, srcend, dststart, dstend; int c; unsigned char *p1, *p2; +#ifndef TEST_BCOPY unsigned char *res; +#endif for (n = 0; n < ITERATIONS; n++) { @@ -178,6 +203,9 @@ do_random_tests (void) { memset (p2 + dststart, c, dstend - dststart); memcpy (p2 + srcstart, p1 + srcstart, srcend - srcstart); +#ifdef TEST_BCOPY + CALL (impl, (char *) (p2 + align1), (char *) (p2 + align2), len); +#else res = (unsigned char *) CALL (impl, (char *) (p2 + align2), (char *) (p2 + align1), len); @@ -187,6 +215,7 @@ do_random_tests (void) n, impl->name, align1, align2, len, res, p2 + align2); ret = 1; } +#endif if (memcmp (p1 + align1, p2 + align2, len)) { error (0, 0, "Iteration %zd - different strings, %s (%zd, %zd, %zd)", diff --git a/string/test-memset.c b/string/test-memset.c index 839b8a1802..e8dd406c20 100644 --- a/string/test-memset.c +++ b/string/test-memset.c @@ -1,5 +1,5 @@ /* Test and measure memset functions. - Copyright (C) 1999, 2002, 2003, 2005 Free Software Foundation, Inc. + Copyright (C) 1999-2012 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Jakub Jelinek <jakub@redhat.com>, 1999. @@ -21,8 +21,30 @@ #define MIN_PAGE_SIZE 131072 #include "test-string.h" -typedef char *(*proto_t) (char *, int, size_t); char *simple_memset (char *, int, size_t); + +#ifdef TEST_BZERO +typedef void (*proto_t) (char *, size_t); +void simple_bzero (char *, size_t); +void builtin_bzero (char *, size_t); + +IMPL (simple_bzero, 0) +IMPL (builtin_bzero, 0) +IMPL (bzero, 1) + +void +simple_bzero (char *s, size_t n) +{ + simple_memset (s, 0, n); +} + +void +builtin_bzero (char *s, size_t n) +{ + __builtin_bzero (s, n); +} +#else +typedef char *(*proto_t) (char *, int, size_t); char *builtin_memset (char *, int, size_t); IMPL (simple_memset, 0) @@ -30,6 +52,13 @@ IMPL (builtin_memset, 0) IMPL (memset, 1) char * +builtin_memset (char *s, int c, size_t n) +{ + return __builtin_memset (s, c, n); +} +#endif + +char * simple_memset (char *s, int c, size_t n) { char *r = s, *end = s + n; @@ -38,20 +67,20 @@ simple_memset (char *s, int c, size_t n) return s; } -char * -builtin_memset (char *s, int c, size_t n) -{ - return __builtin_memset (s, c, n); -} - static void -do_one_test (impl_t *impl, char *s, int c, size_t n) +do_one_test (impl_t *impl, char *s, int c __attribute ((unused)), size_t n) { - char *res = CALL (impl, s, c, n); char tstbuf[n]; +#ifdef TEST_BZERO + simple_bzero (tstbuf, n); + CALL (impl, s, n); + if (memcmp (s, tstbuf, n) != 0) +#else + char *res = CALL (impl, s, c, n); if (res != s || simple_memset (tstbuf, c, n) != tstbuf || memcmp (s, tstbuf, n) != 0) +#endif { error (0, 0, "Wrong result in function %s", impl->name); ret = 1; @@ -68,7 +97,12 @@ do_one_test (impl_t *impl, char *s, int c, size_t n) for (i = 0; i < 32; ++i) { HP_TIMING_NOW (start); +#ifdef TEST_BZERO + CALL (impl, s, n); +#else CALL (impl, s, c, n); +#endif + HP_TIMING_NOW (stop); HP_TIMING_BEST (best_time, start, stop); } @@ -94,6 +128,7 @@ do_test (size_t align, int c, size_t len) putchar ('\n'); } +#ifndef TEST_BZERO static void do_random_tests (void) { @@ -178,12 +213,13 @@ do_random_tests (void) } } } +#endif int test_main (void) { size_t i; - int c; + int c = 0; test_init (); @@ -192,7 +228,9 @@ test_main (void) printf ("\t%s", impl->name); putchar ('\n'); +#ifndef TEST_BZERO for (c = -65; c <= 130; c += 65) +#endif { for (i = 0; i < 18; ++i) do_test (0, c, 1 << i); @@ -208,7 +246,10 @@ test_main (void) do_test (2, c, 25); } +#ifndef TEST_BZERO do_random_tests (); +#endif + return ret; } |