mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user