aboutsummaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/powerpc/stringloops/strlen.c
diff options
context:
space:
mode:
authorChristophe Leroy <christophe.leroy@c-s.fr>2018-08-01 05:01:12 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2018-08-07 07:49:30 -0400
commitf0abbfd89fed4abd8301b35fbf65a26d85b16e7f (patch)
tree408b80cf6f30bac7f4723a8ce30a3bc5ae5e215c /tools/testing/selftests/powerpc/stringloops/strlen.c
parent1bb07b593adc1934a526eb04acfe8bf786decfd2 (diff)
selftests/powerpc: Add test for strlen()
This patch adds a test for strlen() string.c contains a copy of strlen() from lib/string.c The test first tests the correctness of strlen() by comparing the result with libc strlen(). It tests all cases of alignment. It them tests the duration of an aligned strlen() on a 4 bytes string, on a 16 bytes string and on a 256 bytes string. Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr> [mpe: Drop change log from copy of string.c] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'tools/testing/selftests/powerpc/stringloops/strlen.c')
-rw-r--r--tools/testing/selftests/powerpc/stringloops/strlen.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/tools/testing/selftests/powerpc/stringloops/strlen.c b/tools/testing/selftests/powerpc/stringloops/strlen.c
new file mode 100644
index 000000000000..9055ebc484d0
--- /dev/null
+++ b/tools/testing/selftests/powerpc/stringloops/strlen.c
@@ -0,0 +1,127 @@
1// SPDX-License-Identifier: GPL-2.0
2#include <malloc.h>
3#include <stdlib.h>
4#include <string.h>
5#include <time.h>
6#include "utils.h"
7
8#define SIZE 256
9#define ITERATIONS 1000
10#define ITERATIONS_BENCH 100000
11
12int test_strlen(const void *s);
13
14/* test all offsets and lengths */
15static void test_one(char *s)
16{
17 unsigned long offset;
18
19 for (offset = 0; offset < SIZE; offset++) {
20 int x, y;
21 unsigned long i;
22
23 y = strlen(s + offset);
24 x = test_strlen(s + offset);
25
26 if (x != y) {
27 printf("strlen() returned %d, should have returned %d (%p offset %ld)\n", x, y, s, offset);
28
29 for (i = offset; i < SIZE; i++)
30 printf("%02x ", s[i]);
31 printf("\n");
32 }
33 }
34}
35
36static void bench_test(char *s)
37{
38 struct timespec ts_start, ts_end;
39 int i;
40
41 clock_gettime(CLOCK_MONOTONIC, &ts_start);
42
43 for (i = 0; i < ITERATIONS_BENCH; i++)
44 test_strlen(s);
45
46 clock_gettime(CLOCK_MONOTONIC, &ts_end);
47
48 printf("len %3.3d : time = %.6f\n", test_strlen(s), ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9);
49}
50
51static int testcase(void)
52{
53 char *s;
54 unsigned long i;
55
56 s = memalign(128, SIZE);
57 if (!s) {
58 perror("memalign");
59 exit(1);
60 }
61
62 srandom(1);
63
64 memset(s, 0, SIZE);
65 for (i = 0; i < SIZE; i++) {
66 char c;
67
68 do {
69 c = random() & 0x7f;
70 } while (!c);
71 s[i] = c;
72 test_one(s);
73 }
74
75 for (i = 0; i < ITERATIONS; i++) {
76 unsigned long j;
77
78 for (j = 0; j < SIZE; j++) {
79 char c;
80
81 do {
82 c = random() & 0x7f;
83 } while (!c);
84 s[j] = c;
85 }
86 for (j = 0; j < sizeof(long); j++) {
87 s[SIZE - 1 - j] = 0;
88 test_one(s);
89 }
90 }
91
92 for (i = 0; i < SIZE; i++) {
93 char c;
94
95 do {
96 c = random() & 0x7f;
97 } while (!c);
98 s[i] = c;
99 }
100
101 bench_test(s);
102
103 s[16] = 0;
104 bench_test(s);
105
106 s[8] = 0;
107 bench_test(s);
108
109 s[4] = 0;
110 bench_test(s);
111
112 s[3] = 0;
113 bench_test(s);
114
115 s[2] = 0;
116 bench_test(s);
117
118 s[1] = 0;
119 bench_test(s);
120
121 return 0;
122}
123
124int main(void)
125{
126 return test_harness(testcase, "strlen");
127}