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>
This commit is contained in:

committed by
Michael Ellerman

parent
1bb07b593a
commit
f0abbfd89f
127
tools/testing/selftests/powerpc/stringloops/strlen.c
Normal file
127
tools/testing/selftests/powerpc/stringloops/strlen.c
Normal file
@@ -0,0 +1,127 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
#include <malloc.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "utils.h"
|
||||
|
||||
#define SIZE 256
|
||||
#define ITERATIONS 1000
|
||||
#define ITERATIONS_BENCH 100000
|
||||
|
||||
int test_strlen(const void *s);
|
||||
|
||||
/* test all offsets and lengths */
|
||||
static void test_one(char *s)
|
||||
{
|
||||
unsigned long offset;
|
||||
|
||||
for (offset = 0; offset < SIZE; offset++) {
|
||||
int x, y;
|
||||
unsigned long i;
|
||||
|
||||
y = strlen(s + offset);
|
||||
x = test_strlen(s + offset);
|
||||
|
||||
if (x != y) {
|
||||
printf("strlen() returned %d, should have returned %d (%p offset %ld)\n", x, y, s, offset);
|
||||
|
||||
for (i = offset; i < SIZE; i++)
|
||||
printf("%02x ", s[i]);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void bench_test(char *s)
|
||||
{
|
||||
struct timespec ts_start, ts_end;
|
||||
int i;
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_start);
|
||||
|
||||
for (i = 0; i < ITERATIONS_BENCH; i++)
|
||||
test_strlen(s);
|
||||
|
||||
clock_gettime(CLOCK_MONOTONIC, &ts_end);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
static int testcase(void)
|
||||
{
|
||||
char *s;
|
||||
unsigned long i;
|
||||
|
||||
s = memalign(128, SIZE);
|
||||
if (!s) {
|
||||
perror("memalign");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
srandom(1);
|
||||
|
||||
memset(s, 0, SIZE);
|
||||
for (i = 0; i < SIZE; i++) {
|
||||
char c;
|
||||
|
||||
do {
|
||||
c = random() & 0x7f;
|
||||
} while (!c);
|
||||
s[i] = c;
|
||||
test_one(s);
|
||||
}
|
||||
|
||||
for (i = 0; i < ITERATIONS; i++) {
|
||||
unsigned long j;
|
||||
|
||||
for (j = 0; j < SIZE; j++) {
|
||||
char c;
|
||||
|
||||
do {
|
||||
c = random() & 0x7f;
|
||||
} while (!c);
|
||||
s[j] = c;
|
||||
}
|
||||
for (j = 0; j < sizeof(long); j++) {
|
||||
s[SIZE - 1 - j] = 0;
|
||||
test_one(s);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < SIZE; i++) {
|
||||
char c;
|
||||
|
||||
do {
|
||||
c = random() & 0x7f;
|
||||
} while (!c);
|
||||
s[i] = c;
|
||||
}
|
||||
|
||||
bench_test(s);
|
||||
|
||||
s[16] = 0;
|
||||
bench_test(s);
|
||||
|
||||
s[8] = 0;
|
||||
bench_test(s);
|
||||
|
||||
s[4] = 0;
|
||||
bench_test(s);
|
||||
|
||||
s[3] = 0;
|
||||
bench_test(s);
|
||||
|
||||
s[2] = 0;
|
||||
bench_test(s);
|
||||
|
||||
s[1] = 0;
|
||||
bench_test(s);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
return test_harness(testcase, "strlen");
|
||||
}
|
Reference in New Issue
Block a user