diff options
author | Martin Storsjö <martin@martin.st> | 2019-06-20 23:38:06 +0300 |
---|---|---|
committer | Josh de Kock <josh@itanimul.li> | 2020-05-15 10:29:30 +0100 |
commit | 3ce1b2bf8d75708ea041f6bbad86b2b249643b9a (patch) | |
tree | e5d22d062f28f92f3406ce75497521ba6842c012 /tests/checkasm/checkasm.c | |
parent | 718c8f9aa59751bb490e2688acf2b5cb68fd5ad1 (diff) |
checkasm: add function to check and diff memory
This was ported from dav1d (c950e7101bdf5f7117bfca816984a21e550509f0).
Signed-off-by: Josh de Kock <josh@itanimul.li>
Diffstat (limited to 'tests/checkasm/checkasm.c')
-rw-r--r-- | tests/checkasm/checkasm.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/tests/checkasm/checkasm.c b/tests/checkasm/checkasm.c index d67147ae6f..27dff4c72a 100644 --- a/tests/checkasm/checkasm.c +++ b/tests/checkasm/checkasm.c @@ -268,6 +268,7 @@ static struct { int cpu_flag; const char *cpu_flag_name; const char *test_name; + int verbose; } state; /* PRNG state */ @@ -686,6 +687,8 @@ int main(int argc, char *argv[]) state.bench_pattern = ""; } else if (!strncmp(argv[1], "--test=", 7)) { state.test_name = argv[1] + 7; + } else if (!strcmp(argv[1], "--verbose") || !strcmp(argv[1], "-v")) { + state.verbose = 1; } else { seed = strtoul(argv[1], NULL, 10); } @@ -836,3 +839,42 @@ void checkasm_report(const char *name, ...) max_length = length; } } + +#define DEF_CHECKASM_CHECK_FUNC(type, fmt) \ +int checkasm_check_##type(const char *const file, const int line, \ + const type *buf1, ptrdiff_t stride1, \ + const type *buf2, ptrdiff_t stride2, \ + const int w, int h, const char *const name) \ +{ \ + int y = 0; \ + stride1 /= sizeof(*buf1); \ + stride2 /= sizeof(*buf2); \ + for (y = 0; y < h; y++) \ + if (memcmp(&buf1[y*stride1], &buf2[y*stride2], w*sizeof(*buf1))) \ + break; \ + if (y == h) \ + return 0; \ + checkasm_fail_func("%s:%d", file, line); \ + if (!state.verbose) \ + return 1; \ + fprintf(stderr, "%s:\n", name); \ + while (h--) { \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, " " fmt, buf1[x]); \ + fprintf(stderr, " "); \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, " " fmt, buf2[x]); \ + fprintf(stderr, " "); \ + for (int x = 0; x < w; x++) \ + fprintf(stderr, "%c", buf1[x] != buf2[x] ? 'x' : '.'); \ + buf1 += stride1; \ + buf2 += stride2; \ + fprintf(stderr, "\n"); \ + } \ + return 1; \ +} + +DEF_CHECKASM_CHECK_FUNC(uint8_t, "%02x") +DEF_CHECKASM_CHECK_FUNC(uint16_t, "%04x") +DEF_CHECKASM_CHECK_FUNC(int16_t, "%6d") +DEF_CHECKASM_CHECK_FUNC(int32_t, "%9d") |