[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 07/12] tests/tcg/s390x: Test CONVERT TO BINARY
From: |
Thomas Huth |
Subject: |
[PULL 07/12] tests/tcg/s390x: Test CONVERT TO BINARY |
Date: |
Tue, 6 Feb 2024 11:43:42 +0100 |
From: Ilya Leoshkevich <iii@linux.ibm.com>
Check the CVB's, CVBY's, and CVBG's corner cases.
Co-developed-by: Pavel Zbitskiy <pavel.zbitskiy@gmail.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Tested-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Message-ID: <20240205205830.6425-5-iii@linux.ibm.com>
Signed-off-by: Thomas Huth <thuth@redhat.com>
---
tests/tcg/s390x/cvb.c | 102 ++++++++++++++++++++++++++++++++
tests/tcg/s390x/Makefile.target | 1 +
2 files changed, 103 insertions(+)
create mode 100644 tests/tcg/s390x/cvb.c
diff --git a/tests/tcg/s390x/cvb.c b/tests/tcg/s390x/cvb.c
new file mode 100644
index 0000000000..e1735f6b81
--- /dev/null
+++ b/tests/tcg/s390x/cvb.c
@@ -0,0 +1,102 @@
+/*
+ * Test the CONVERT TO BINARY instruction.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+#include <assert.h>
+#include <signal.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+static int signum;
+
+static void signal_handler(int n)
+{
+ signum = n;
+}
+
+#define FAIL 0x1234567887654321
+#define OK32(x) (0x1234567800000000 | (uint32_t)(x))
+
+static int64_t cvb(uint64_t x)
+{
+ int64_t ret = FAIL;
+
+ signum = -1;
+ asm("cvb %[ret],%[x]" : [ret] "+r" (ret) : [x] "R" (x));
+
+ return ret;
+}
+
+static int64_t cvby(uint64_t x)
+{
+ int64_t ret = FAIL;
+
+ signum = -1;
+ asm("cvby %[ret],%[x]" : [ret] "+r" (ret) : [x] "T" (x));
+
+ return ret;
+}
+
+static int64_t cvbg(__uint128_t x)
+{
+ int64_t ret = FAIL;
+
+ signum = -1;
+ asm("cvbg %[ret],%[x]" : [ret] "+r" (ret) : [x] "T" (x));
+
+ return ret;
+}
+
+int main(void)
+{
+ __uint128_t m = (((__uint128_t)0x9223372036854775) << 16) | 0x8070;
+ struct sigaction act;
+ int err;
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = signal_handler;
+ err = sigaction(SIGFPE, &act, NULL);
+ assert(err == 0);
+ err = sigaction(SIGILL, &act, NULL);
+ assert(err == 0);
+
+ assert(cvb(0xc) == OK32(0) && signum == -1);
+ assert(cvb(0x1c) == OK32(1) && signum == -1);
+ assert(cvb(0x25594c) == OK32(25594) && signum == -1);
+ assert(cvb(0x1d) == OK32(-1) && signum == -1);
+ assert(cvb(0x2147483647c) == OK32(0x7fffffff) && signum == -1);
+ assert(cvb(0x2147483648d) == OK32(-0x80000000) && signum == -1);
+ assert(cvb(0x7) == FAIL && signum == SIGILL);
+ assert(cvb(0x2147483648c) == OK32(0x80000000) && signum == SIGFPE);
+ assert(cvb(0x3000000000c) == OK32(0xb2d05e00) && signum == SIGFPE);
+ assert(cvb(0x2147483649d) == OK32(0x7fffffff) && signum == SIGFPE);
+ assert(cvb(0x3000000000d) == OK32(0x4d2fa200) && signum == SIGFPE);
+
+ assert(cvby(0xc) == OK32(0));
+ assert(cvby(0x1c) == OK32(1));
+ assert(cvby(0x25594c) == OK32(25594));
+ assert(cvby(0x1d) == OK32(-1));
+ assert(cvby(0x2147483647c) == OK32(0x7fffffff));
+ assert(cvby(0x2147483648d) == OK32(-0x80000000));
+ assert(cvby(0x7) == FAIL && signum == SIGILL);
+ assert(cvby(0x2147483648c) == OK32(0x80000000) && signum == SIGFPE);
+ assert(cvby(0x3000000000c) == OK32(0xb2d05e00) && signum == SIGFPE);
+ assert(cvby(0x2147483649d) == OK32(0x7fffffff) && signum == SIGFPE);
+ assert(cvby(0x3000000000d) == OK32(0x4d2fa200) && signum == SIGFPE);
+
+ assert(cvbg(0xc) == 0);
+ assert(cvbg(0x1c) == 1);
+ assert(cvbg(0x25594c) == 25594);
+ assert(cvbg(0x1d) == -1);
+ assert(cvbg(m + 0xc) == 0x7fffffffffffffff);
+ assert(cvbg(m + 0x1d) == -0x8000000000000000);
+ assert(cvbg(0x7) == FAIL && signum == SIGILL);
+ assert(cvbg(m + 0x1c) == FAIL && signum == SIGFPE);
+ assert(cvbg(m + 0x2d) == FAIL && signum == SIGFPE);
+ assert(cvbg(((__uint128_t)1 << 80) + 0xc) == FAIL && signum == SIGFPE);
+ assert(cvbg(((__uint128_t)1 << 80) + 0xd) == FAIL && signum == SIGFPE);
+
+ return EXIT_SUCCESS;
+}
diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target
index 04e4bddd83..e2aba2ec27 100644
--- a/tests/tcg/s390x/Makefile.target
+++ b/tests/tcg/s390x/Makefile.target
@@ -46,6 +46,7 @@ TESTS+=laalg
TESTS+=add-logical-with-carry
TESTS+=lae
TESTS+=cvd
+TESTS+=cvb
cdsg: CFLAGS+=-pthread
cdsg: LDFLAGS+=-pthread
--
2.43.0
- [PULL 00/12] s390x, tests and misc. patches, Thomas Huth, 2024/02/06
- [PULL 01/12] hw/scsi/lsi53c895a: add missing decrement of reentrancy counter, Thomas Huth, 2024/02/06
- [PULL 02/12] target/ppc/cpu-models: Rename power5+ and power7+ for new QOM naming rules, Thomas Huth, 2024/02/06
- [PULL 03/12] docs/about: Deprecate the old "power5+" and "power7+" CPU names, Thomas Huth, 2024/02/06
- [PULL 04/12] target/s390x: Emulate CVDG, Thomas Huth, 2024/02/06
- [PULL 06/12] tests/tcg/s390x: Test CONVERT TO DECIMAL, Thomas Huth, 2024/02/06
- [PULL 05/12] target/s390x: Emulate CVB, CVBY and CVBG, Thomas Huth, 2024/02/06
- [PULL 07/12] tests/tcg/s390x: Test CONVERT TO BINARY,
Thomas Huth <=
- [PULL 08/12] target/s390x: Prefer fast cpu_env() over slower CPU QOM cast macro, Thomas Huth, 2024/02/06
- [PULL 11/12] test-util-filemonitor: Adapt to the FreeBSD inotify rename semantics, Thomas Huth, 2024/02/06
- [PULL 09/12] tests/vm: Set UseDNS=no in the sshd configuration, Thomas Huth, 2024/02/06
- [PULL 10/12] tests/vm/freebsd: Reload the sshd configuration, Thomas Huth, 2024/02/06
- [PULL 12/12] meson: Link with libinotify on FreeBSD, Thomas Huth, 2024/02/06
- Re: [PULL 00/12] s390x, tests and misc. patches, Peter Maydell, 2024/02/08