hppa: Sync with pthread.h.
[platform/upstream/glibc.git] / benchtests / bench-memmove.c
1 /* Measure memmove 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 #define TEST_MAIN
20 #ifdef TEST_BCOPY
21 # define TEST_NAME "bcopy"
22 #else
23 # define TEST_NAME "memmove"
24 #endif
25 #include "bench-string.h"
26
27 char *simple_memmove (char *, const char *, size_t);
28
29 #ifdef TEST_BCOPY
30 typedef void (*proto_t) (const char *, char *, size_t);
31 void simple_bcopy (const char *, char *, size_t);
32
33 IMPL (simple_bcopy, 0)
34 IMPL (bcopy, 1)
35
36 void
37 simple_bcopy (const char *src, char *dst, size_t n)
38 {
39   simple_memmove (dst, src, n);
40 }
41 #else
42 typedef char *(*proto_t) (char *, const char *, size_t);
43
44 IMPL (simple_memmove, 0)
45 IMPL (memmove, 1)
46 #endif
47
48 char *
49 inhibit_loop_to_libcall
50 simple_memmove (char *dst, const char *src, size_t n)
51 {
52   char *ret = dst;
53   if (src < dst)
54     {
55       dst += n;
56       src += n;
57       while (n--)
58         *--dst = *--src;
59     }
60   else
61     while (n--)
62       *dst++ = *src++;
63   return ret;
64 }
65
66 static void
67 do_one_test (impl_t *impl, char *dst, char *src, const char *orig_src,
68              size_t len)
69 {
70   size_t i, iters = INNER_LOOP_ITERS;
71   timing_t start, stop, cur;
72
73   memcpy (src, orig_src, len);
74 #ifdef TEST_BCOPY
75   CALL (impl, src, dst, len);
76 #else
77   char *res;
78
79   res = CALL (impl, dst, src, len);
80   if (res != dst)
81     {
82       error (0, 0, "Wrong result in function %s %p %p", impl->name,
83              res, dst);
84       ret = 1;
85       return;
86     }
87 #endif
88
89   if (memcmp (dst, orig_src, len) != 0)
90     {
91       error (0, 0, "Wrong result in function %s dst \"%s\" src \"%s\"",
92              impl->name, dst, src);
93       ret = 1;
94       return;
95     }
96
97   TIMING_NOW (start);
98   for (i = 0; i < iters; ++i)
99     {
100 #ifdef TEST_BCOPY
101       CALL (impl, src, dst, len);
102 #else
103       CALL (impl, dst, src, len);
104 #endif
105     }
106   TIMING_NOW (stop);
107
108   TIMING_DIFF (cur, start, stop);
109
110   TIMING_PRINT_MEAN ((double) cur, (double) iters);
111 }
112
113 static void
114 do_test (size_t align1, size_t align2, size_t len)
115 {
116   size_t i, j;
117   char *s1, *s2;
118
119   align1 &= 63;
120   if (align1 + len >= page_size)
121     return;
122
123   align2 &= 63;
124   if (align2 + len >= page_size)
125     return;
126
127   s1 = (char *) (buf1 + align1);
128   s2 = (char *) (buf2 + align2);
129
130   for (i = 0, j = 1; i < len; i++, j += 23)
131     s1[i] = j;
132
133   printf ("Length %4zd, alignment %2zd/%2zd:", len, align1, align2);
134
135   FOR_EACH_IMPL (impl, 0)
136     do_one_test (impl, s2, (char *) (buf2 + align1), s1, len);
137
138   putchar ('\n');
139 }
140
141 int
142 test_main (void)
143 {
144   size_t i;
145
146   test_init ();
147
148   printf ("%23s", "");
149   FOR_EACH_IMPL (impl, 0)
150     printf ("\t%s", impl->name);
151   putchar ('\n');
152
153   for (i = 0; i < 14; ++i)
154     {
155       do_test (0, 32, 1 << i);
156       do_test (32, 0, 1 << i);
157       do_test (0, i, 1 << i);
158       do_test (i, 0, 1 << i);
159     }
160
161   for (i = 0; i < 32; ++i)
162     {
163       do_test (0, 32, i);
164       do_test (32, 0, i);
165       do_test (0, i, i);
166       do_test (i, 0, i);
167     }
168
169   for (i = 3; i < 32; ++i)
170     {
171       if ((i & (i - 1)) == 0)
172         continue;
173       do_test (0, 32, 16 * i);
174       do_test (32, 0, 16 * i);
175       do_test (0, i, 16 * i);
176       do_test (i, 0, 16 * i);
177     }
178
179   return ret;
180 }
181
182 #include "../test-skeleton.c"