tests/tcg/s390x: Add clst.c
Add a basic test to prevent regressions. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Message-Id: <20221025213008.2209006-2-iii@linux.ibm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
29b8de001f
commit
c432198ab0
@ -25,6 +25,7 @@ TESTS+=signals-s390x
|
||||
TESTS+=branch-relative-long
|
||||
TESTS+=noexec
|
||||
TESTS+=div
|
||||
TESTS+=clst
|
||||
|
||||
Z13_TESTS=vistr
|
||||
$(Z13_TESTS): CFLAGS+=-march=z13 -O2
|
||||
|
82
tests/tcg/s390x/clst.c
Normal file
82
tests/tcg/s390x/clst.c
Normal file
@ -0,0 +1,82 @@
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
static int clst(char sep, const char **s1, const char **s2)
|
||||
{
|
||||
const char *r1 = *s1;
|
||||
const char *r2 = *s2;
|
||||
int cc;
|
||||
|
||||
do {
|
||||
register int r0 asm("r0") = sep;
|
||||
|
||||
asm("clst %[r1],%[r2]\n"
|
||||
"ipm %[cc]\n"
|
||||
"srl %[cc],28"
|
||||
: [r1] "+r" (r1), [r2] "+r" (r2), "+r" (r0), [cc] "=r" (cc)
|
||||
:
|
||||
: "cc");
|
||||
*s1 = r1;
|
||||
*s2 = r2;
|
||||
} while (cc == 3);
|
||||
|
||||
return cc;
|
||||
}
|
||||
|
||||
static const struct test {
|
||||
const char *name;
|
||||
char sep;
|
||||
const char *s1;
|
||||
const char *s2;
|
||||
int exp_cc;
|
||||
int exp_off;
|
||||
} tests[] = {
|
||||
{
|
||||
.name = "cc0",
|
||||
.sep = 0,
|
||||
.s1 = "aa",
|
||||
.s2 = "aa",
|
||||
.exp_cc = 0,
|
||||
.exp_off = 0,
|
||||
},
|
||||
{
|
||||
.name = "cc1",
|
||||
.sep = 1,
|
||||
.s1 = "a\x01",
|
||||
.s2 = "aa\x01",
|
||||
.exp_cc = 1,
|
||||
.exp_off = 1,
|
||||
},
|
||||
{
|
||||
.name = "cc2",
|
||||
.sep = 2,
|
||||
.s1 = "abc\x02",
|
||||
.s2 = "abb\x02",
|
||||
.exp_cc = 2,
|
||||
.exp_off = 2,
|
||||
},
|
||||
};
|
||||
|
||||
int main(void)
|
||||
{
|
||||
const struct test *t;
|
||||
const char *s1, *s2;
|
||||
size_t i;
|
||||
int cc;
|
||||
|
||||
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
|
||||
t = &tests[i];
|
||||
s1 = t->s1;
|
||||
s2 = t->s2;
|
||||
cc = clst(t->sep, &s1, &s2);
|
||||
if (cc != t->exp_cc ||
|
||||
s1 != t->s1 + t->exp_off ||
|
||||
s2 != t->s2 + t->exp_off) {
|
||||
fprintf(stderr, "%s\n", t->name);
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue
Block a user