Disassemble the tests and count the SVE or RVV memory access. Delete the
binary when the check fails otherwise a subsequent run will not run the
check and silently succeed.
CHECK memory-rvv contains 7 vector loads and 7 stores
CHECK memory-sve contains 20 vector loads and 17 stores
This is a coarse check and could be improved by checking specific
functions, and using something more precise than an opcode grep.
However, it would have caught the bug fixed in "tests/tcg/multiarch: Fix
vectorisation of memory test", which makes it worthwhile.
Skipped when no cross objdump was found.
Signed-off-by: Joel Stanley <[email protected]>
---
tests/tcg/Makefile.target | 8 ++++++++
tests/tcg/aarch64/Makefile.softmmu-target | 1 +
tests/tcg/riscv64/Makefile.softmmu-target | 1 +
3 files changed, 10 insertions(+)
diff --git a/tests/tcg/Makefile.target b/tests/tcg/Makefile.target
index d4dd0fec650d..a5b694d2f21c 100644
--- a/tests/tcg/Makefile.target
+++ b/tests/tcg/Makefile.target
@@ -79,6 +79,14 @@ conditional-diff-out =
\
$(call diff-out,$1,$2), \
$(call skip-test,"$1 check","no reference"))
+# Check an ELF for vector load ($1) and store ($2) patterns.
+# Deleted on failure so the check runs again on the next make.
+check-vectorised = $(if $(OBJDUMP), \
+ $(call quiet-command, \
+ ld=$$($(OBJDUMP) -d $@ | grep -cE '[[:space:]]$1'); \
+ st=$$($(OBJDUMP) -d $@ | grep -cE '[[:space:]]$2'); \
+ printf " %-7s %s\n" CHECK "$@ contains $$ld vector loads and $$st
stores"; \
+ test "$$ld" -gt 0 && test "$$st" -gt 0 || { rm -f $@; exit 1; }))
# Tests we are building
TESTS=
diff --git a/tests/tcg/aarch64/Makefile.softmmu-target
b/tests/tcg/aarch64/Makefile.softmmu-target
index 196a2afa50ee..99ad1a2799d7 100644
--- a/tests/tcg/aarch64/Makefile.softmmu-target
+++ b/tests/tcg/aarch64/Makefile.softmmu-target
@@ -50,6 +50,7 @@ memory: CFLAGS+=-DCHECK_UNALIGNED=1
memory-sve: memory.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS)
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS) boot.o
+ $(call check-vectorised,ld1[bhwds],st1[bhwd])
memory-sve: private CFLAGS+=-DCHECK_UNALIGNED=1 -march=armv8.1-a+sve -O3
diff --git a/tests/tcg/riscv64/Makefile.softmmu-target
b/tests/tcg/riscv64/Makefile.softmmu-target
index 301a6e6e5700..5262007e39a5 100644
--- a/tests/tcg/riscv64/Makefile.softmmu-target
+++ b/tests/tcg/riscv64/Makefile.softmmu-target
@@ -79,6 +79,7 @@ memory: private CFLAGS += -DCHECK_UNALIGNED=1
memory-rvv: memory.c $(LINK_SCRIPT) $(CRT_OBJS) $(MINILIB_OBJS)
$(call quiet-command, \
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $< -o $@ $(LDFLAGS) $(CRT_OBJS), CC,
$@)
+ $(call check-vectorised,vle,vse[0-9])
memory-rvv: private CFLAGS += -DCHECK_UNALIGNED=1 -march=rv64gcv -O3
run-memory-rvv: QEMU_CPU = rv64,v=true
--
2.47.3