qemu/tests/tcg/s390x/clst.c
Ilya Leoshkevich c432198ab0 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>
2023-02-04 06:19:42 -10:00

83 lines
1.6 KiB
C

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