qemu/tests/tcg/s390x/exrl-trtr.c
Pavel Zbitskiy ad8c851d2e target/s390x: add EX support for TRT and TRTR
Improves "b213c9f5: target/s390x: Implement TRTR" by introducing the
intermediate functions, which are compatible with dx_helper type.

Signed-off-by: Pavel Zbitskiy <pavel.zbitskiy@gmail.com>
Message-Id: <20180821025104.19604-6-pavel.zbitskiy@gmail.com>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
2018-08-28 17:37:01 +02:00

49 lines
1.0 KiB
C

#include <stdint.h>
#include <unistd.h>
int main(void)
{
char op1[] = {0, 1, 2, 3};
char op2[256];
uint64_t r1 = 0xffffffffffffffffull;
uint64_t r2 = 0xffffffffffffffffull;
uint64_t cc;
int i;
for (i = 0; i < 256; i++) {
if (i == 1) {
op2[i] = 0xbb;
} else {
op2[i] = 0;
}
}
asm volatile(
" j 2f\n"
"1: trtr 3(1,%[op1]),0(%[op2])\n"
"2: exrl %[op1_len],1b\n"
" lgr %[r1],%%r1\n"
" lgr %[r2],%%r2\n"
" ipm %[cc]\n"
: [r1] "+r" (r1),
[r2] "+r" (r2),
[cc] "=r" (cc)
: [op1] "r" (&op1),
[op1_len] "r" (3),
[op2] "r" (&op2)
: "r1", "r2", "cc");
cc = (cc >> 28) & 3;
if (cc != 1) {
write(1, "bad cc\n", 7);
return 1;
}
if ((char *)r1 != &op1[1]) {
write(1, "bad r1\n", 7);
return 1;
}
if (r2 != 0xffffffffffffffbbull) {
write(1, "bad r2\n", 7);
return 1;
}
return 0;
}