}
#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; \
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(
" 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(
" 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;
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;
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;
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;
}
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];
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)