--- /dev/null
+#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;
+}