tests: add simple write tests
authorGrazvydas Ignotas <notasas@gmail.com>
Mon, 30 Nov 2015 23:10:03 +0000 (01:10 +0200)
committerGrazvydas Ignotas <notasas@gmail.com>
Mon, 30 Nov 2015 23:10:03 +0000 (01:10 +0200)
tests/test_uncached.c

index f1fd070..bf6051f 100644 (file)
@@ -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)