1 #include <math.h>
2 #include <stdio.h>
3 
4 /* Following macros adopted from dfp/math.h from libdfp */
5 #define DEC_INFINITY    __builtin_infd64()
6 #define DEC_NAN         (0.0DF * DEC_INFINITY)
7 
8 /* Following instructions are tested:
9 test data class tests for
10    _Decimal32  - TDCET
11    _Decimal64  - TDCDT
12    _decimal128 - TDCXT
13 test data group tests for
14    _Decimal32  - TDGET
15    _Decimal64  - TDGDT
16    _decimal128 - TDGXT
17 */
18 
19 #define TEST_128(opcode, d, n)                                  \
20   ({                                                            \
21     int match;                                                  \
22     _Decimal128 f = d;                                          \
23     long long num = n;                                          \
24     asm volatile(opcode ", %1,0(%2)\n"                          \
25                  "ipm %0\n"                                     \
26                  "srl %0,28\n"                                  \
27                  : "=d" (match) : "f" (f), "a" (num) : "cc");   \
28     match;                                                      \
29  })
30 
31 #define TEST_64(opcode, d, n)                                   \
32   ({                                                            \
33     int match;                                                  \
34     _Decimal64 f = d;                                           \
35     long long num = n;                                          \
36     asm volatile(opcode ", %1,0(%2)\n"                          \
37                  "ipm %0\n"                                     \
38                  "srl %0,28\n"                                  \
39                  : "=d" (match) : "f" (f), "a" (num) : "cc");   \
40     match;                                                      \
41  })
42 
43 #define TEST_32(opcode, d, n)                                   \
44   ({                                                            \
45     int match;                                                  \
46     _Decimal32 f = d;                                           \
47     long long num = n;                                          \
48     asm volatile(opcode ", %1,0(%2)\n"                          \
49                  "ipm %0\n"                                     \
50                  "srl %0,28\n"                                  \
51                  : "=d" (match) : "f" (f), "a" (num) : "cc");   \
52     match;                                                      \
53  })
54 
main()55 int main()
56 {
57 	int i;
58 
59     /* The right most 12 bits 52:63 of the second operand are set and tested */
60     for (i = 0; i < 12; i++) {
61         /* DFP 128 bit - TDCXT */
62         printf("%d", TEST_128(".insn rxe, 0xed0000000058", +0.0DF, 1UL<<i));
63         printf("%d", TEST_128(".insn rxe, 0xed0000000058", -0.0DF, 1UL<<i));
64         printf("%d", TEST_128(".insn rxe, 0xed0000000058", +2.2DF, 1UL<<i));
65         printf("%d", TEST_128(".insn rxe, 0xed0000000058", -2.2DF, 1UL<<i));
66         printf("%d", TEST_128(".insn rxe, 0xed0000000058",+DEC_INFINITY,1UL<<i));
67         printf("%d", TEST_128(".insn rxe, 0xed0000000058",-DEC_INFINITY,1UL<<i));
68         printf("%d", TEST_128(".insn rxe, 0xed0000000058", +DEC_NAN, 1UL<<i));
69         printf("%d", TEST_128(".insn rxe, 0xed0000000058", -DEC_NAN, 1UL<<i));
70 
71         /* DFP 128 bit - TDGXT */
72         printf("%d", TEST_128(".insn rxe, 0xed0000000059", +0.0DF, 1UL<<i));
73         printf("%d", TEST_128(".insn rxe, 0xed0000000059", -0.0DF, 1UL<<i));
74         printf("%d", TEST_128(".insn rxe, 0xed0000000059", +2.2DF, 1UL<<i));
75         printf("%d", TEST_128(".insn rxe, 0xed0000000059", -2.2DF, 1UL<<i));
76         printf("%d", TEST_128(".insn rxe, 0xed0000000059",+DEC_INFINITY,1UL<<i));
77         printf("%d", TEST_128(".insn rxe, 0xed0000000059",-DEC_INFINITY,1UL<<i));
78         printf("%d", TEST_128(".insn rxe, 0xed0000000059", +DEC_NAN, 1UL<<i));
79         printf("%d", TEST_128(".insn rxe, 0xed0000000059", -DEC_NAN, 1UL<<i));
80 
81         /* DFP 64 bit - TDCDT */
82         printf("%d", TEST_64(".insn rxe, 0xed0000000054", +0.0DF, 1UL<<i));
83         printf("%d", TEST_64(".insn rxe, 0xed0000000054", -0.0DF, 1UL<<i));
84         printf("%d", TEST_64(".insn rxe, 0xed0000000054", +2.2DF, 1UL<<i));
85         printf("%d", TEST_64(".insn rxe, 0xed0000000054", -2.2DF, 1UL<<i));
86         printf("%d", TEST_64(".insn rxe, 0xed0000000054",+DEC_INFINITY,1UL<<i));
87         printf("%d", TEST_64(".insn rxe, 0xed0000000054",-DEC_INFINITY,1UL<<i));
88         printf("%d", TEST_64(".insn rxe, 0xed0000000054", +DEC_NAN, 1UL<<i));
89         printf("%d", TEST_64(".insn rxe, 0xed0000000054", -DEC_NAN, 1UL<<i));
90 
91         /* DFP 64 bit - TDGDT */
92         printf("%d", TEST_64(".insn rxe, 0xed0000000055", +0.0DF, 1UL<<i));
93         printf("%d", TEST_64(".insn rxe, 0xed0000000055", -0.0DF, 1UL<<i));
94         printf("%d", TEST_64(".insn rxe, 0xed0000000055", +2.2DF, 1UL<<i));
95         printf("%d", TEST_64(".insn rxe, 0xed0000000055", -2.2DF, 1UL<<i));
96         printf("%d", TEST_64(".insn rxe, 0xed0000000055",+DEC_INFINITY,1UL<<i));
97         printf("%d", TEST_64(".insn rxe, 0xed0000000055",-DEC_INFINITY,1UL<<i));
98         printf("%d", TEST_64(".insn rxe, 0xed0000000055", +DEC_NAN, 1UL<<i));
99         printf("%d", TEST_64(".insn rxe, 0xed0000000055", -DEC_NAN, 1UL<<i));
100 
101         /* DFP 32 bit - TDCET */
102         printf("%d", TEST_32(".insn rxe, 0xed0000000050", +0.0DF, 1UL<<i));
103         printf("%d", TEST_32(".insn rxe, 0xed0000000050", -0.0DF, 1UL<<i));
104         printf("%d", TEST_32(".insn rxe, 0xed0000000050", +2.2DF, 1UL<<i));
105         printf("%d", TEST_32(".insn rxe, 0xed0000000050", -2.2DF, 1UL<<i));
106         printf("%d", TEST_32(".insn rxe, 0xed0000000050",+DEC_INFINITY,1UL<<i));
107         printf("%d", TEST_32(".insn rxe, 0xed0000000050",-DEC_INFINITY,1UL<<i));
108         printf("%d", TEST_32(".insn rxe, 0xed0000000050", +DEC_NAN, 1UL<<i));
109         printf("%d", TEST_32(".insn rxe, 0xed0000000050", -DEC_NAN, 1UL<<i));
110 
111         /* DFP 32 bit - TDGET */
112         printf("%d", TEST_32(".insn rxe, 0xed0000000051", +0.0DF, 1UL<<i));
113         printf("%d", TEST_32(".insn rxe, 0xed0000000051", -0.0DF, 1UL<<i));
114         printf("%d", TEST_32(".insn rxe, 0xed0000000051", +2.2DF, 1UL<<i));
115         printf("%d", TEST_32(".insn rxe, 0xed0000000051", -2.2DF, 1UL<<i));
116         printf("%d", TEST_32(".insn rxe, 0xed0000000051",+DEC_INFINITY,1UL<<i));
117         printf("%d", TEST_32(".insn rxe, 0xed0000000051",-DEC_INFINITY,1UL<<i));
118         printf("%d", TEST_32(".insn rxe, 0xed0000000051", +DEC_NAN, 1UL<<i));
119         printf("%d", TEST_32(".insn rxe, 0xed0000000051", -DEC_NAN, 1UL<<i));
120 
121         printf("\n");
122 
123 	}
124 	return 0;
125 }
126