aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorThomas Huth <thuth@redhat.com>2022-10-12 20:27:55 +0200
committerThomas Huth <thuth@redhat.com>2022-10-28 08:34:58 +0200
commit9e3eb3b29a73c35adbbe60b0fd3c8feb6c680d55 (patch)
tree93f85527df927b0c173dbb145e8d03618f5895dc /tests
parentf7d81a351d6122440f9190adba69da3f81b7b186 (diff)
downloadqemu-9e3eb3b29a73c35adbbe60b0fd3c8feb6c680d55.zip
qemu-9e3eb3b29a73c35adbbe60b0fd3c8feb6c680d55.tar.gz
qemu-9e3eb3b29a73c35adbbe60b0fd3c8feb6c680d55.tar.bz2
tests/tcg/s390x: Add a test for the vistr instruction
This test can be used to verify that the change in the previous commit is indeed fixing the problem with the M3 vs. M4 field mixup. Message-Id: <20221012182755.1014853-4-thuth@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: David Hildenbrand <david@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/tcg/s390x/Makefile.target4
-rw-r--r--tests/tcg/s390x/vistr.c45
2 files changed, 49 insertions, 0 deletions
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
index 29c8af8..07fcc6d 100644
--- a/tests/tcg/s390x/Makefile.target
+++ b/tests/tcg/s390x/Makefile.target
@@ -25,6 +25,10 @@ TESTS+=signals-s390x
TESTS+=branch-relative-long
TESTS+=noexec
+Z13_TESTS=vistr
+$(Z13_TESTS): CFLAGS+=-march=z13 -O2
+TESTS+=$(Z13_TESTS)
+
ifneq ($(CROSS_CC_HAS_Z14),)
Z14_TESTS=vfminmax
vfminmax: LDFLAGS+=-lm
diff --git a/tests/tcg/s390x/vistr.c b/tests/tcg/s390x/vistr.c
new file mode 100644
index 0000000..8e3e987
--- /dev/null
+++ b/tests/tcg/s390x/vistr.c
@@ -0,0 +1,45 @@
+/*
+ * Test the VECTOR ISOLATE STRING (vistr) instruction
+ */
+#include <stdint.h>
+#include <stdio.h>
+#include "vx.h"
+
+static inline void vistr(S390Vector *v1, S390Vector *v2,
+ const uint8_t m3, const uint8_t m5)
+{
+ asm volatile("vistr %[v1], %[v2], %[m3], %[m5]\n"
+ : [v1] "=v" (v1->v)
+ : [v2] "v" (v2->v)
+ , [m3] "i" (m3)
+ , [m5] "i" (m5)
+ : "cc");
+}
+
+int main(int argc, char *argv[])
+{
+ S390Vector vd = {};
+ S390Vector vs16 = {
+ .h[0] = 0x1234, .h[1] = 0x0056, .h[2] = 0x7800, .h[3] = 0x0000,
+ .h[4] = 0x0078, .h[5] = 0x0000, .h[6] = 0x6543, .h[7] = 0x2100
+ };
+ S390Vector vs32 = {
+ .w[0] = 0x12340000, .w[1] = 0x78654300,
+ .w[2] = 0x0, .w[3] = 0x12,
+ };
+
+ vistr(&vd, &vs16, 1, 0);
+ if (vd.h[0] != 0x1234 || vd.h[1] != 0x0056 || vd.h[2] != 0x7800 ||
+ vd.h[3] || vd.h[4] || vd.h[5] || vd.h[6] || vd.h[7]) {
+ puts("ERROR: vitrh failed!");
+ return 1;
+ }
+
+ vistr(&vd, &vs32, 2, 0);
+ if (vd.w[0] != 0x12340000 || vd.w[1] != 0x78654300 || vd.w[2] || vd.w[3]) {
+ puts("ERROR: vitrf failed!");
+ return 1;
+ }
+
+ return 0;
+}