From: Grazvydas Ignotas Date: Mon, 30 Nov 2015 23:10:03 +0000 (+0200) Subject: tests: add simple write tests X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a63081e8ac915af52f308ac434b98a2e1c0172c0;p=pandora-misc.git tests: add simple write tests --- diff --git a/tests/test_uncached.c b/tests/test_uncached.c index f1fd070..bf6051f 100644 --- a/tests/test_uncached.c +++ b/tests/test_uncached.c @@ -35,7 +35,7 @@ static inline unsigned int pcnt_get(void) } #define make_rd_test(name, type) \ -static int name(const void *mem_, size_t size) \ +static int name(void *mem_, size_t size) \ { \ const type *mem = mem_; \ int sum = 0; \ @@ -52,7 +52,7 @@ make_rd_test(read_c_16, int16_t) make_rd_test(read_c_32, int32_t) make_rd_test(read_c_64, int64_t) -static int read_ldrd(const void *mem, size_t size) +static int read_ldrd(void *mem, size_t size) { size /= 8; asm volatile( @@ -61,11 +61,11 @@ static int read_ldrd(const void *mem, size_t size) " bgt 0b\n" : "=&r"(mem), "=&r"(size) : "0"(mem), "1"(size) - : "r2", "r3", "cc"); + : "r2", "r3", "cc", "memory"); return 0; } -static int read_ldrd_pld(const void *mem, size_t size) +static int read_ldrd_pld(void *mem, size_t size) { size /= 8; asm volatile( @@ -75,12 +75,12 @@ static int read_ldrd_pld(const void *mem, size_t size) " bgt 0b\n" : "=&r"(mem), "=&r"(size) : "0"(mem), "1"(size) - : "r2", "r3", "cc"); + : "r2", "r3", "cc", "memory"); return 0; } static int g_skip; -static int read_c_32_skip(const void *mem_, size_t size) +static int read_c_32_skip(void *mem_, size_t size) { const int *mem = mem_; int skip = g_skip / 4; @@ -94,7 +94,7 @@ static int read_c_32_skip(const void *mem_, size_t size) return sum; } -static int read_fbt_neon(const void *mem, size_t size) +static int read_fbt_neon(void *mem, size_t size) { size_t i; @@ -104,7 +104,7 @@ static int read_fbt_neon(const void *mem, size_t size) return 0; } -static int read_fbt_vfp(const void *mem, size_t size) +static int read_fbt_vfp(void *mem, size_t size) { size_t i; @@ -114,10 +114,58 @@ static int read_fbt_vfp(const void *mem, size_t size) return 0; } +static int write8(void *mem, size_t size) +{ + asm volatile( + "0: strb %1, [%0], #1\n" + " subs %1, #1\n" + " bgt 0b\n" + : "=&r"(mem), "=&r"(size) + : "0"(mem), "1"(size) + : "cc", "memory"); + return 0; +} + +static int write16(void *mem, size_t size) +{ + asm volatile( + "0: strh %1, [%0], #2\n" + " subs %1, #2\n" + " bgt 0b\n" + : "=&r"(mem), "=&r"(size) + : "0"(mem), "1"(size) + : "cc", "memory"); + return 0; +} + +static int write32(void *mem, size_t size) +{ + asm volatile( + "0: str %1, [%0], #4\n" + " subs %1, #4\n" + " bgt 0b\n" + : "=&r"(mem), "=&r"(size) + : "0"(mem), "1"(size) + : "cc", "memory"); + return 0; +} + +static int write64(void *mem, size_t size) +{ + asm volatile( + "0: strd r12, r13, [%0], #8\n" + " subs %1, #8\n" + " bgt 0b\n" + : "=&r"(mem), "=&r"(size) + : "0"(mem), "1"(size) + : "cc", "memory"); + return 0; +} + static unsigned int run(const char *name, - void (*inv)(const void *mem, size_t size), - int (*test)(const void *mem, size_t size), - const void *mem, unsigned int baseline) + void (*inv)(void *mem, size_t size), + int (*test)(void *mem, size_t size), + void *mem, unsigned int baseline) { unsigned int i, cycles, smallest = ~0; @@ -141,8 +189,8 @@ static unsigned int run(const char *name, } static void run_all(const char *name, - void (*inv)(const void *mem, size_t size), - const void *mem) + void (*inv)(void *mem, size_t size), + void *mem) { static unsigned int b[16]; unsigned int r[16]; @@ -161,14 +209,18 @@ static void run_all(const char *name, r[t] = run(" ldrd pld", inv, read_ldrd_pld, mem, b[t]); t++; r[t] = run(" fbt neon", inv, read_fbt_neon, mem, b[t]); t++; r[t] = run(" fbt vfp", inv, read_fbt_vfp, mem, b[t]); t++; + r[t] = run(" w08", NULL, write8, mem, b[t]); t++; + r[t] = run(" w16", NULL, write16, mem, b[t]); t++; + r[t] = run(" w32", NULL, write32, mem, b[t]); t++; + r[t] = run(" w64", NULL, write64, mem, b[t]); t++; if (b[0] == 0) memcpy(b, r, sizeof(b)); } -static void shm_inv(const void *mem, size_t size) +static void shm_inv(void *mem, size_t size) { - dsp_cache_inv_virt((void *)mem, size); + dsp_cache_inv_virt(mem, size); } static void run_shm(const char *name, dsp_cache_t ct, int use_inv)