aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/tcg/s390x/Makefile.target2
-rw-r--r--tests/tcg/s390x/exrl-trt.c48
-rw-r--r--tests/tcg/s390x/exrl-trtr.c48
3 files changed, 98 insertions, 0 deletions
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
index c800a582e5..7de4376f52 100644
--- a/tests/tcg/s390x/Makefile.target
+++ b/tests/tcg/s390x/Makefile.target
@@ -3,3 +3,5 @@ CFLAGS+=-march=zEC12 -m64
TESTS+=hello-s390x
TESTS+=csst
TESTS+=ipm
+TESTS+=exrl-trt
+TESTS+=exrl-trtr
diff --git a/tests/tcg/s390x/exrl-trt.c b/tests/tcg/s390x/exrl-trt.c
new file mode 100644
index 0000000000..3c5323aecb
--- /dev/null
+++ b/tests/tcg/s390x/exrl-trt.c
@@ -0,0 +1,48 @@
+#include <stdint.h>
+#include <unistd.h>
+
+int main(void)
+{
+ char op1[] = "hello";
+ char op2[256];
+ uint64_t r1 = 0xffffffffffffffffull;
+ uint64_t r2 = 0xffffffffffffffffull;
+ uint64_t cc;
+ int i;
+
+ for (i = 0; i < 256; i++) {
+ if (i == 0) {
+ op2[i] = 0xaa;
+ } else {
+ op2[i] = 0;
+ }
+ }
+ asm volatile(
+ " j 2f\n"
+ "1: trt 0(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" (5),
+ [op2] "r" (&op2)
+ : "r1", "r2", "cc");
+ cc = (cc >> 28) & 3;
+ if (cc != 2) {
+ write(1, "bad cc\n", 7);
+ return 1;
+ }
+ if ((char *)r1 != &op1[5]) {
+ write(1, "bad r1\n", 7);
+ return 1;
+ }
+ if (r2 != 0xffffffffffffffaaull) {
+ write(1, "bad r2\n", 7);
+ return 1;
+ }
+ return 0;
+}
diff --git a/tests/tcg/s390x/exrl-trtr.c b/tests/tcg/s390x/exrl-trtr.c
new file mode 100644
index 0000000000..c33153ad7e
--- /dev/null
+++ b/tests/tcg/s390x/exrl-trtr.c
@@ -0,0 +1,48 @@
+#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;
+}