| xf.li | bdd93d5 | 2023-05-12 07:10:14 -0700 | [diff] [blame] | 1 | /* Measure memchr functions. | 
 | 2 |    Copyright (C) 2013-2016 Free Software Foundation, Inc. | 
 | 3 |    This file is part of the GNU C Library. | 
 | 4 |  | 
 | 5 |    The GNU C Library is free software; you can redistribute it and/or | 
 | 6 |    modify it under the terms of the GNU Lesser General Public | 
 | 7 |    License as published by the Free Software Foundation; either | 
 | 8 |    version 2.1 of the License, or (at your option) any later version. | 
 | 9 |  | 
 | 10 |    The GNU C Library is distributed in the hope that it will be useful, | 
 | 11 |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 12 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | 13 |    Lesser General Public License for more details. | 
 | 14 |  | 
 | 15 |    You should have received a copy of the GNU Lesser General Public | 
 | 16 |    License along with the GNU C Library; if not, see | 
 | 17 |    <http://www.gnu.org/licenses/>.  */ | 
 | 18 |  | 
 | 19 | #include <assert.h> | 
 | 20 |  | 
 | 21 | #define TEST_MAIN | 
 | 22 | #define TEST_NAME "rawmemchr" | 
 | 23 | #include "bench-string.h" | 
 | 24 |  | 
 | 25 | typedef char *(*proto_t) (const char *, int); | 
 | 26 | char *simple_rawmemchr (const char *, int); | 
 | 27 |  | 
 | 28 | IMPL (simple_rawmemchr, 0) | 
 | 29 | IMPL (rawmemchr, 1) | 
 | 30 |  | 
 | 31 | char * | 
 | 32 | simple_rawmemchr (const char *s, int c) | 
 | 33 | { | 
 | 34 |   while (1) | 
 | 35 |     if (*s++ == (char) c) | 
 | 36 |       return (char *) s - 1; | 
 | 37 |   return NULL; | 
 | 38 | } | 
 | 39 |  | 
 | 40 | static void | 
 | 41 | do_one_test (impl_t *impl, const char *s, int c, char *exp_res) | 
 | 42 | { | 
 | 43 |   size_t i, iters = INNER_LOOP_ITERS; | 
 | 44 |   timing_t start, stop, cur; | 
 | 45 |   char *res = CALL (impl, s, c); | 
 | 46 |   if (res != exp_res) | 
 | 47 |     { | 
 | 48 |       error (0, 0, "Wrong result in function %s %p %p", impl->name, | 
 | 49 | 	     res, exp_res); | 
 | 50 |       ret = 1; | 
 | 51 |       return; | 
 | 52 |     } | 
 | 53 |  | 
 | 54 |   TIMING_NOW (start); | 
 | 55 |   for (i = 0; i < iters; ++i) | 
 | 56 |     { | 
 | 57 |       CALL (impl, s, c); | 
 | 58 |     } | 
 | 59 |   TIMING_NOW (stop); | 
 | 60 |  | 
 | 61 |   TIMING_DIFF (cur, start, stop); | 
 | 62 |  | 
 | 63 |   TIMING_PRINT_MEAN ((double) cur, (double) iters); | 
 | 64 | } | 
 | 65 |  | 
 | 66 | static void | 
 | 67 | do_test (size_t align, size_t pos, size_t len, int seek_char) | 
 | 68 | { | 
 | 69 |   size_t i; | 
 | 70 |   char *result; | 
 | 71 |  | 
 | 72 |   align &= 7; | 
 | 73 |   if (align + len >= page_size) | 
 | 74 |     return; | 
 | 75 |  | 
 | 76 |   for (i = 0; i < len; ++i) | 
 | 77 |     { | 
 | 78 |       buf1[align + i] = 1 + 23 * i % 127; | 
 | 79 |       if (buf1[align + i] == seek_char) | 
 | 80 | 	buf1[align + i] = seek_char + 1; | 
 | 81 |     } | 
 | 82 |   buf1[align + len] = 0; | 
 | 83 |  | 
 | 84 |   assert (pos < len); | 
 | 85 |  | 
 | 86 |   buf1[align + pos] = seek_char; | 
 | 87 |   buf1[align + len] = -seek_char; | 
 | 88 |   result = (char *) (buf1 + align + pos); | 
 | 89 |  | 
 | 90 |   printf ("Length %4zd, alignment %2zd:", pos, align); | 
 | 91 |  | 
 | 92 |   FOR_EACH_IMPL (impl, 0) | 
 | 93 |     do_one_test (impl, (char *) (buf1 + align), seek_char, result); | 
 | 94 |  | 
 | 95 |   putchar ('\n'); | 
 | 96 | } | 
 | 97 |  | 
 | 98 | int | 
 | 99 | test_main (void) | 
 | 100 | { | 
 | 101 |   size_t i; | 
 | 102 |  | 
 | 103 |   test_init (); | 
 | 104 |  | 
 | 105 |   printf ("%20s", ""); | 
 | 106 |   FOR_EACH_IMPL (impl, 0) | 
 | 107 |     printf ("\t%s", impl->name); | 
 | 108 |   putchar ('\n'); | 
 | 109 |  | 
 | 110 |   for (i = 1; i < 7; ++i) | 
 | 111 |     { | 
 | 112 |       do_test (0, 16 << i, 2048, 23); | 
 | 113 |       do_test (i, 64, 256, 23); | 
 | 114 |       do_test (0, 16 << i, 2048, 0); | 
 | 115 |       do_test (i, 64, 256, 0); | 
 | 116 |     } | 
 | 117 |   for (i = 1; i < 32; ++i) | 
 | 118 |     { | 
 | 119 |       do_test (0, i, i + 1, 23); | 
 | 120 |       do_test (0, i, i + 1, 0); | 
 | 121 |     } | 
 | 122 |  | 
 | 123 |   return ret; | 
 | 124 | } | 
 | 125 |  | 
 | 126 | #include "../test-skeleton.c" |