Test the dczeroa instruction which zeroes a cache line. Verifies aligned, unaligned, and buffer-start addresses.
Signed-off-by: Brian Cain <[email protected]> --- tests/tcg/hexagon/test_dczeroa.c | 88 ++++++++++++++++++++++++++++++++ tests/tcg/hexagon/meson.build | 1 + 2 files changed, 89 insertions(+) create mode 100644 tests/tcg/hexagon/test_dczeroa.c diff --git a/tests/tcg/hexagon/test_dczeroa.c b/tests/tcg/hexagon/test_dczeroa.c new file mode 100644 index 00000000000..8cdcdd6a3b5 --- /dev/null +++ b/tests/tcg/hexagon/test_dczeroa.c @@ -0,0 +1,88 @@ +/* + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +/* + * Test the dczeroa instruction, which zeroes a 32-byte cache line. + * The address is rounded down to a 32-byte boundary: (addr & ~0x1f). + */ + +#include <stdio.h> +#include <stdint.h> +#include <string.h> +#include <hexagon_protos.h> + +int err; + +#include "hex_test.h" + +static uint8_t buf[128] __attribute__((aligned(32))); + +/* dczeroa with an aligned address */ +static void test_dczeroa_aligned(void) +{ + int i; + + memset(buf, 0xff, sizeof(buf)); + + Q6_dczeroa_A(&buf[32]); + + for (i = 0; i < 32; i++) { + check32(buf[i], 0xff); + } + for (i = 32; i < 64; i++) { + check32(buf[i], 0x00); + } + for (i = 64; i < 96; i++) { + check32(buf[i], 0xff); + } +} + +/* dczeroa with an unaligned address (should round down) */ +static void test_dczeroa_unaligned(void) +{ + int i; + + memset(buf, 0xff, sizeof(buf)); + + /* Address buf+40 rounds down to buf+32 */ + Q6_dczeroa_A(&buf[40]); + + for (i = 0; i < 32; i++) { + check32(buf[i], 0xff); + } + for (i = 32; i < 64; i++) { + check32(buf[i], 0x00); + } + for (i = 64; i < 96; i++) { + check32(buf[i], 0xff); + } +} + +/* dczeroa at the start of the buffer */ +static void test_dczeroa_start(void) +{ + int i; + + memset(buf, 0xff, sizeof(buf)); + + Q6_dczeroa_A(&buf[0]); + + for (i = 0; i < 32; i++) { + check32(buf[i], 0x00); + } + for (i = 32; i < 64; i++) { + check32(buf[i], 0xff); + } +} + +int main(void) +{ + test_dczeroa_aligned(); + test_dczeroa_unaligned(); + test_dczeroa_start(); + + puts(err ? "FAIL" : "PASS"); + return err ? 1 : 0; +} diff --git a/tests/tcg/hexagon/meson.build b/tests/tcg/hexagon/meson.build index aa176e56883..fcf0bd38f26 100644 --- a/tests/tcg/hexagon/meson.build +++ b/tests/tcg/hexagon/meson.build @@ -74,6 +74,7 @@ tests += { 'test_clobber.S': {'cflags': asmflags}, 'test_cmp.S': {'cflags': asmflags}, 'test_cond_branch.c': {'cflags': cflags}, + 'test_dczeroa.c': {'cflags': cflags}, 'test_dotnew.S': {'cflags': asmflags}, 'test_ext.S': {'cflags': asmflags}, 'test_fibonacci.S': {'cflags': asmflags}, -- 2.34.1
