#include <stdlib.h>
#include <stdio.h>
#include <ppu_intrinsics.h>

extern void *memcpy(void *, const void *, size_t);

int main() {
	unsigned char *s, *d;
	register unsigned long long start, finish,  i;
	if(posix_memalign((void *)&s, 128, 4096)) {
		printf("failed\n");
		goto end;
	}
	for(i = 32, j = 0; i > 0; i--, j += 128) {		/* clear s from cache */
		__dcbf(s+j);
	}
	if(posix_memalign((void *)&d, 128, 4096)) {
		printf("failed\n");
		goto end;
	}
	for(i = 32, j = 0; i > 0; i--, j += 128) {		/* clear d from cache */
		__dcbf(s+j);
	}

	__dcbt(cpymem);		/* prefetch memcpy */
	__dcbt(cpymem+128);
	__dcbt(cpymem+256);
	__dcbt(cpymem+384);
	__dcbt(cpymem+512);
	__dcbt(cpymem+640);
	__dcbt(cpymem+768);
	__dcbt(cpymem+896);
	__dcbt(cpymem+1024);
	__dcbt(cpymem+1152);
	__dcbt(cpymem+1280);
	__dcbt(cpymem+1408);
	__dcbt(cpymem+1536);
	__dcbt(cpymem+1664);
	__dcbt(cpymem+1792);
	__dcbt(cpymem+1920);
	__dcbt(cpymem+2048);
	__dcbt(cpymem+2176);
	__dcbt(cpymem+2304);
	__dcbt(cpymem+2432);
	__sync();

	start = __mftb();
	memcpy(d, s, 4096);
	finish = __mftb();

	printf("%lld\n", finish - start);

	free(s);
	free(d);
end:
	return 0;
}
