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 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