hppa: Sync with pthread.h.
[platform/upstream/glibc.git] / benchtests / bench-rawmemchr.c
1 /* Measure memchr functions.
2    Copyright (C) 2013-2015 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"