diff options
Diffstat (limited to 'tools/testing/selftests/powerpc/stringloops/strlen.c')
| -rw-r--r-- | tools/testing/selftests/powerpc/stringloops/strlen.c | 127 | 
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 @@ +// 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"); +} |