]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
s390: Add testcase for "test data class/group" insns.
authorFlorian Krohm <florian@eich-krohm.de>
Fri, 28 Dec 2012 15:54:23 +0000 (15:54 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Fri, 28 Dec 2012 15:54:23 +0000 (15:54 +0000)
Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com).
This is part of fixing BZ 307113.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13214

none/tests/s390x/Makefile.am
none/tests/s390x/dfptest.c [new file with mode: 0644]
none/tests/s390x/dfptest.stderr.exp [new file with mode: 0644]
none/tests/s390x/dfptest.stdout.exp [new file with mode: 0644]
none/tests/s390x/dfptest.vgtest [new file with mode: 0644]

index 9577b3fcb047f6d99ae99390de09311035b1546f..9ad60c178845b2de61c9ac8f076ee5f49bc179ba 100644 (file)
@@ -19,7 +19,7 @@ INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \
             spechelper-icm-1  spechelper-icm-2 spechelper-tmll \
             spechelper-tm laa
 if BUILD_DFP_TESTS
-  INSN_TESTS += dfp-1 dfp-2 dfp-3 dfp-4
+  INSN_TESTS += dfp-1 dfp-2 dfp-3 dfp-4 dfptest
 endif
 
 check_PROGRAMS = $(INSN_TESTS) \
@@ -38,7 +38,8 @@ EXTRA_DIST = \
        dfp-1.stderr.exp dfp-1.stdout.exp dfp-1.vgtest \
        dfp-2.stderr.exp dfp-2.stdout.exp dfp-2.vgtest \
        dfp-3.stderr.exp dfp-3.stdout.exp dfp-3.vgtest \
-       dfp-4.stderr.exp dfp-4.stdout.exp dfp-4.vgtest
+       dfp-4.stderr.exp dfp-4.stdout.exp dfp-4.vgtest \
+       dfptest.stderr.exp dfptest.stdout.exp dfptest.vgtest
 
 AM_CFLAGS    += @FLAG_M64@
 AM_CXXFLAGS  += @FLAG_M64@
diff --git a/none/tests/s390x/dfptest.c b/none/tests/s390x/dfptest.c
new file mode 100644 (file)
index 0000000..f1b383a
--- /dev/null
@@ -0,0 +1,125 @@
+#include <math.h>
+#include <stdio.h>
+
+/* Following macros adopted from dfp/math.h from libdfp */
+#define DEC_INFINITY    __builtin_infd64()
+#define DEC_NAN         (0.0DF * DEC_INFINITY)
+
+/* Following instructions are tested:
+test data class tests for
+   _Decimal32  - TDCET
+   _Decimal64  - TDCDT
+   _decimal128 - TDCXT
+test data group tests for
+   _Decimal32  - TDGET
+   _Decimal64  - TDGDT
+   _decimal128 - TDGXT
+*/
+
+#define TEST_128(opcode, d, n)                                  \
+  ({                                                            \
+    int match;                                                  \
+    _Decimal128 f = d;                                          \
+    long long num = n;                                          \
+    asm volatile(opcode ", %1,0(%2)\n"                          \
+                 "ipm %0\n"                                     \
+                 "srl %0,28\n"                                  \
+                 : "=d" (match) : "f" (f), "a" (num) : "cc");   \
+    match;                                                      \
+ })
+
+#define TEST_64(opcode, d, n)                                   \
+  ({                                                            \
+    int match;                                                  \
+    _Decimal64 f = d;                                           \
+    long long num = n;                                          \
+    asm volatile(opcode ", %1,0(%2)\n"                          \
+                 "ipm %0\n"                                     \
+                 "srl %0,28\n"                                  \
+                 : "=d" (match) : "f" (f), "a" (num) : "cc");   \
+    match;                                                      \
+ })
+
+#define TEST_32(opcode, d, n)                                   \
+  ({                                                            \
+    int match;                                                  \
+    _Decimal32 f = d;                                           \
+    long long num = n;                                          \
+    asm volatile(opcode ", %1,0(%2)\n"                          \
+                 "ipm %0\n"                                     \
+                 "srl %0,28\n"                                  \
+                 : "=d" (match) : "f" (f), "a" (num) : "cc");   \
+    match;                                                      \
+ })
+
+int main()
+{
+       int i;
+
+    /* The right most 12 bits 52:63 of the second operand are set and tested */
+    for (i = 0; i < 12; i++) {
+        /* DFP 128 bit - TDCXT */
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", +0.0DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", -0.0DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", +2.2DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", -2.2DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000058", -DEC_NAN, 1UL<<i));
+
+        /* DFP 128 bit - TDGXT */
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", +0.0DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", -0.0DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", +2.2DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", -2.2DF, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_128(".insn rxe, 0xed0000000059", -DEC_NAN, 1UL<<i));
+
+        /* DFP 64 bit - TDCDT */
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", +0.0DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", -0.0DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", +2.2DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", -2.2DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000054", -DEC_NAN, 1UL<<i));
+
+        /* DFP 64 bit - TDGDT */
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", +0.0DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", -0.0DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", +2.2DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", -2.2DF, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_64(".insn rxe, 0xed0000000055", -DEC_NAN, 1UL<<i));
+
+        /* DFP 32 bit - TDCET */
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", +0.0DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", -0.0DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", +2.2DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", -2.2DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000050", -DEC_NAN, 1UL<<i));
+
+        /* DFP 32 bit - TDGET */
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", +0.0DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", -0.0DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", +2.2DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", -2.2DF, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051",+DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051",-DEC_INFINITY,1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", +DEC_NAN, 1UL<<i));
+        printf("%d", TEST_32(".insn rxe, 0xed0000000051", -DEC_NAN, 1UL<<i));
+
+        printf("\n");
+
+       }
+       return 0;
+}
diff --git a/none/tests/s390x/dfptest.stderr.exp b/none/tests/s390x/dfptest.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/dfptest.stdout.exp b/none/tests/s390x/dfptest.stdout.exp
new file mode 100644 (file)
index 0000000..15fd7b5
--- /dev/null
@@ -0,0 +1,12 @@
+000000000000010100000000000001010000000000000101
+000000000000101000000000000010100000000000001010
+000000010000000000000001000000000000000100000000
+000000100000000000000010000000000000001000000000
+000001000001000000000100000100000000010000010000
+000010000010000000001000001000000000100000100000
+000100000000000000010000000000000001000000000000
+001000000000000000100000000000000010000000000000
+000000000000000000000000000000000000000000000000
+000000000000000000000000000000000000000000000000
+010000000100000001000000010000000100000001000000
+100000001000000010000000100000001000000010000000
diff --git a/none/tests/s390x/dfptest.vgtest b/none/tests/s390x/dfptest.vgtest
new file mode 100644 (file)
index 0000000..a6f1291
--- /dev/null
@@ -0,0 +1,2 @@
+prog: dfptest
+prereq: test -e dfptest && ../../../tests/s390x_features s390x-dfp