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