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>
This commit is contained in:
Thomas Huth 2022-10-12 20:27:55 +02:00
parent f7d81a351d
commit 9e3eb3b29a
2 changed files with 49 additions and 0 deletions

View file

@ -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

45
tests/tcg/s390x/vistr.c Normal file
View file

@ -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;
}