1 #include <stdio.h>
2 #include <sys/types.h>
3 #include "opcodes.h"
4 #include "dfp_utils.h"
5 
6 /* Following macros adopted from dfp/math.h from libdfp */
7 #define DEC_INFINITY    __builtin_infd64()
8 #define DEC_NAN         (0.0DF * DEC_INFINITY)
9 
10 /* Test DFP value and exponent comparison for  64/128-bit. */
11 
12 #define CMP_DFP(insn, op1, op2, type, cc)                               \
13   ({                                                                    \
14   register type d1 asm("f0") =  op1;                                    \
15   register type d2 asm("f1") =  op2;                                    \
16   /* cc = d1 (cmp) d2    */                                             \
17   asm volatile(insn(0,1)                                                \
18                "ipm %0\n\t"                                             \
19                "srl %0,28\n\t"                                          \
20                :"=d" (cc)                                               \
21                :"f"(d1), "f"(d2)                                        \
22                );                                                       \
23   cc;                                                                   \
24 })
25 
26 
27 #define COMPARE(insn, v1, v2, type)                                     \
28   {                                                                     \
29     int cc;                                                             \
30     CMP_DFP(insn, v1, v2, type, cc);                                    \
31     DFP_VAL_PRINT(v1, type);                                            \
32     switch (cc) {                                                       \
33     case 0:                                                             \
34       printf(" == ");                                                   \
35       break;                                                            \
36     case 1:                                                             \
37       printf(" < ");                                                    \
38       break;                                                            \
39     case 2:                                                             \
40       printf(" > ");                                                    \
41       break;                                                            \
42     case 3:                                                             \
43       printf(" <> ");                                                   \
44       break;                                                            \
45     }                                                                   \
46     DFP_VAL_PRINT(v2, type);                                            \
47     printf(" (cc == %d)\n", cc);                                        \
48 }
49 
main(void)50 int main(void)
51 {
52    _Decimal64 d64_1, d64_2;
53    _Decimal128 d128_1, d128_2;
54 
55    /* compare 8 bytes DFP value */
56    printf("cdtr:\n");
57    d64_1 = 5.000005DD;
58    d64_2 = 50000000000000000.000005DD;
59    COMPARE(CDTR, d64_1, d64_1, _Decimal64);
60    COMPARE(CDTR, d64_1, d64_2, _Decimal64);
61    COMPARE(CDTR, d64_2, d64_1, _Decimal64);
62 
63    /* compare NAN and INF operands */
64    d64_1 = DEC_INFINITY;
65    d64_2 = DEC_NAN;
66    COMPARE(CDTR, d64_1, d64_2, _Decimal64);
67    COMPARE(CDTR, d64_1, d64_1, _Decimal64);
68    COMPARE(CDTR, d64_2, d64_2, _Decimal64);
69 
70    /* compare 16 bytes DFP value */
71    printf("cxtr:\n");
72    d128_1 = 5.00005DL;
73    d128_2 = 5000000000000000.5DL;
74    COMPARE(CXTR, d128_1, d128_1, _Decimal128);
75    COMPARE(CXTR, d128_1, d128_2, _Decimal128);
76    COMPARE(CXTR, d128_2, d128_1, _Decimal128);
77 
78    /* compare NAN and INF operands */
79    d128_1 = DEC_INFINITY;
80    d128_2 = DEC_NAN;
81    COMPARE(CXTR, d128_1, d128_2, _Decimal128);
82    COMPARE(CXTR, d128_1, d128_1, _Decimal128);
83    COMPARE(CXTR, d128_2, d128_2, _Decimal128);
84 
85    /* compare exponents of 8 bytes DFP value */
86    printf("cedtr:\n");
87    d64_1 = 5.000005DD;
88    d64_2 = 50000000000000000.000005DD;
89    COMPARE(CEDTR, d64_1, d64_1, _Decimal64);
90    COMPARE(CEDTR, d64_1, d64_2, _Decimal64);
91    COMPARE(CEDTR, d64_2, d64_1, _Decimal64);
92 
93    /* compare NAN and INF operands */
94    d64_1 = DEC_INFINITY;
95    d64_2 = DEC_NAN;
96    COMPARE(CEDTR, d64_1, d64_2, _Decimal64);
97    COMPARE(CEDTR, d64_1, d64_1, _Decimal64);
98    COMPARE(CEDTR, d64_2, d64_2, _Decimal64);
99 
100    /* compare exponents of 16 bytes DFP value */
101    printf("cextr:\n");
102    d128_1 = 5.00005DL;
103    d128_2 = 5000000000000000.5DL;
104    COMPARE(CEXTR, d128_1, d128_1, _Decimal128);
105    COMPARE(CEXTR, d128_1, d128_2, _Decimal128);
106    COMPARE(CEXTR, d128_2, d128_1, _Decimal128);
107 
108    /* compare NAN and INF operands */
109    d128_1 = DEC_INFINITY;
110    d128_2 = DEC_NAN;
111    COMPARE(CEXTR, d128_1, d128_2, _Decimal128);
112    COMPARE(CEXTR, d128_1, d128_1, _Decimal128);
113    COMPARE(CEXTR, d128_2, d128_2, _Decimal128);
114 
115    return 0;
116 }
117