1 #include <stdio.h>
2 #include "opcodes.h"
3 #include "dfp_utils.h"
4
5 volatile _Decimal64 d64_1, d64_2, result_64;
6 volatile _Decimal128 d128_1, d128_2, result_128;
7
8 #define DFP_BINOP(insn, op1, op2, type, round, cc) \
9 ({ \
10 register type d1 asm("f0") = op1; \
11 register type d2 asm("f1") = op2; \
12 /* d1 = d1 (op) d2 */ \
13 asm volatile(insn(1,round,0,0) \
14 "ipm %1\n\t" \
15 "srl %1,28\n\t" \
16 :"+f" (d1), "=d" (cc) \
17 :"f"(d2) \
18 ); \
19 d1; \
20 })
21
main()22 int main() {
23 int cc;
24
25 printf("Decimal floating point arithmetic\n");
26
27 /* 64-bit ADD */
28 printf("64-bit ADD\n");
29 /* case 1: cc = 2 */
30 d64_1 = 3.14DD;
31 d64_2 = 0.005DD;
32 result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc);
33 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
34 /* case 2: cc = 1 */
35 d64_1 = -3.14DD;
36 d64_2 = 0.005DD;
37 result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc);
38 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
39 /* case 2: cc = 0 */
40 d64_1 = 3.14DD;
41 d64_2 = -d64_1;
42 result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 3, cc);
43 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
44
45
46 /* 64-bit SUBTRACT */
47 printf("64-bit SUBTRACT\n");
48 /* case 1: cc = 2 */
49 d64_1 = 3.14DD;
50 d64_2 = 0.005DD;
51 result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 4, cc);
52 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
53 /* case 2: cc = 1 */
54 d64_1 = -3.14DD;
55 d64_2 = 0.005DD;
56 result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc);
57 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
58 /* case 3: cc = 0 */
59 d64_1 = 3.14DD;
60 d64_2 = d64_1;
61 result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc);
62 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
63
64 /* 64-bit MULTIPLY */
65 printf("64-bit MULTIPLY\n");
66 /* case 1: cc = 2 */
67 d64_1 = 3.14DD;
68 d64_2 = 7.DD;
69 result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 6, cc);
70 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
71 /* case 2: cc = 1 */
72 d64_1 = -3.14DD;
73 d64_2 = 7.DD;
74 result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc);
75 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
76 /* case 3: cc = 0 */
77 d64_1 = -3.14DD;
78 d64_2 = 0.DD;
79 result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc);
80 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
81
82 /* 64-bit DIVIDE */
83 printf("64-bit DIVIDE\n");
84 /* case 1: cc = 2 */
85 d64_1 = 22.DD;
86 d64_2 = 7.DD;
87 result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, d, cc);
88 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
89 /* case 2: cc = 1 */
90 d64_1 = -22.DD;
91 d64_2 = 7.DD;
92 result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc);
93 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
94 /* case 3: cc = 0 */
95 d64_1 = 0.DD;
96 d64_2 = 7.DD;
97 result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc);
98 DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
99
100 /* 128-bit ADD */
101 printf("128-bit ADD\n");
102 /* case 1: cc = 2 */
103 d128_1 = 3.14DL;
104 d128_2 = 0.005DL;
105 result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc);
106 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
107 /* case 2: cc = 1 */
108 d128_1 = -3.14DL;
109 d128_2 = 0.005DL;
110 result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc);
111 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
112 /* case 3: cc = 0 */
113 d128_1 = 3.14DL;
114 d128_2 = -d128_1;
115 result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 3, cc);
116 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
117
118 /* 128-bit SUBTRACT */
119 printf("128-bit SUBTRACT\n");
120 /* case 1: cc = 2 */
121 d128_1 = 3.14DL;
122 d128_2 = 0.005DL;
123 result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 4, cc);
124 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
125 /* case 2: cc = 1 */
126 d128_1 = -3.14DL;
127 d128_2 = 0.005DL;
128 result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc);
129 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
130 /* case 3: cc = 0 */
131 d128_1 = 3.14DL;
132 d128_2 = d128_1;
133 result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc);
134 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
135
136 /* 128-bit MULTIPLY */
137 printf("128-bit MULTIPLY\n");
138 /* case 1: cc = 2 */
139 d128_1 = 3.14DL;
140 d128_2 = 7.DL;
141 result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 6, cc);
142 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
143 /* case 2: cc = 1 */
144 d128_1 = -3.14DL;
145 d128_2 = 7.DL;
146 result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc);
147 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
148 /* case 3: cc = 0 */
149 d128_1 = 3.14DL;
150 d128_2 = 0.DL;
151 result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc);
152 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
153
154 /* 128-bit DIVIDE */
155 printf("128-bit DIVIDE\n");
156 /* case 1: cc = 2 */
157 d128_1 = 22.DL;
158 d128_2 = 7.DL;
159 result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, d, cc);
160 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
161 /* case 2: cc = 1 */
162 d128_1 = -22.DL;
163 d128_2 = 7.DL;
164 result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc);
165 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
166 /* case 3: cc = 0 */
167 d128_1 = 0.DL;
168 d128_2 = 7.DL;
169 result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc);
170 DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
171
172 return 0;
173 }
174