1570af302Sopenharmony_ci#include <string.h>
2570af302Sopenharmony_ci#include <stdlib.h>
3570af302Sopenharmony_ci#include <stdint.h>
4570af302Sopenharmony_ci#include "test.h"
5570af302Sopenharmony_ci
6570af302Sopenharmony_cistatic char buf[512];
7570af302Sopenharmony_ci
8570af302Sopenharmony_cistatic void *(*volatile pmemcpy)(void *restrict, const void *restrict, size_t);
9570af302Sopenharmony_ci
10570af302Sopenharmony_cistatic void *aligned(void *p) {
11570af302Sopenharmony_ci	return (void*)(((uintptr_t)p + 63) & -64);
12570af302Sopenharmony_ci}
13570af302Sopenharmony_ci
14570af302Sopenharmony_ci#define N 80
15570af302Sopenharmony_cistatic void test_align(int dalign, int salign, int len)
16570af302Sopenharmony_ci{
17570af302Sopenharmony_ci	char *src = aligned(buf);
18570af302Sopenharmony_ci	char *dst = aligned(buf + 128);
19570af302Sopenharmony_ci	char *want = aligned(buf + 256);
20570af302Sopenharmony_ci	char *p;
21570af302Sopenharmony_ci	int i;
22570af302Sopenharmony_ci
23570af302Sopenharmony_ci	if (salign + len > N || dalign + len > N)
24570af302Sopenharmony_ci		abort();
25570af302Sopenharmony_ci	for (i = 0; i < N; i++) {
26570af302Sopenharmony_ci		src[i] = '#';
27570af302Sopenharmony_ci		dst[i] = want[i] = ' ';
28570af302Sopenharmony_ci	}
29570af302Sopenharmony_ci	for (i = 0; i < len; i++)
30570af302Sopenharmony_ci		src[salign+i] = want[dalign+i] = '0'+i;
31570af302Sopenharmony_ci	p = pmemcpy(dst+dalign, src+salign, len);
32570af302Sopenharmony_ci	if (p != dst+dalign)
33570af302Sopenharmony_ci		t_error("memcpy(%p,...) returned %p\n", dst+dalign, p);
34570af302Sopenharmony_ci	for (i = 0; i < N; i++)
35570af302Sopenharmony_ci		if (dst[i] != want[i]) {
36570af302Sopenharmony_ci			t_error("memcpy(align %d, align %d, %d) failed\n", dalign, salign, len);
37570af302Sopenharmony_ci			t_printf("got : %.*s\n", dalign+len+1, dst);
38570af302Sopenharmony_ci			t_printf("want: %.*s\n", dalign+len+1, want);
39570af302Sopenharmony_ci			break;
40570af302Sopenharmony_ci		}
41570af302Sopenharmony_ci}
42570af302Sopenharmony_ci
43570af302Sopenharmony_ciint main(void)
44570af302Sopenharmony_ci{
45570af302Sopenharmony_ci	int i,j,k;
46570af302Sopenharmony_ci
47570af302Sopenharmony_ci	pmemcpy = memcpy;
48570af302Sopenharmony_ci
49570af302Sopenharmony_ci	for (i = 0; i < 16; i++)
50570af302Sopenharmony_ci		for (j = 0; j < 16; j++)
51570af302Sopenharmony_ci			for (k = 0; k < 64; k++)
52570af302Sopenharmony_ci				test_align(i,j,k);
53570af302Sopenharmony_ci
54570af302Sopenharmony_ci	return t_status;
55570af302Sopenharmony_ci}
56