| #include <stdio.h> |
| #include "opcodes.h" |
| #include "dfp_utils.h" |
| |
| volatile _Decimal64 d64_1, d64_2, result_64; |
| volatile _Decimal128 d128_1, d128_2, result_128; |
| |
| #define DFP_BINOP(insn, op1, op2, type, round, cc) \ |
| ({ \ |
| register type d1 asm("f0") = op1; \ |
| register type d2 asm("f1") = op2; \ |
| /* d1 = d1 (op) d2 */ \ |
| asm volatile(insn(1,round,0,0) \ |
| "ipm %1\n\t" \ |
| "srl %1,28\n\t" \ |
| :"+f" (d1), "=d" (cc) \ |
| :"f"(d2) \ |
| ); \ |
| d1; \ |
| }) |
| |
| int main() { |
| int cc; |
| |
| printf("Decimal floating point arithmetic\n"); |
| |
| /* 64-bit ADD */ |
| printf("64-bit ADD\n"); |
| /* case 1: cc = 2 */ |
| d64_1 = 3.14DD; |
| d64_2 = 0.005DD; |
| result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc); |
| /* case 2: cc = 1 */ |
| d64_1 = -3.14DD; |
| d64_2 = 0.005DD; |
| result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc); |
| /* case 2: cc = 0 */ |
| d64_1 = 3.14DD; |
| d64_2 = -d64_1; |
| result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 3, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc); |
| |
| |
| /* 64-bit SUBTRACT */ |
| printf("64-bit SUBTRACT\n"); |
| /* case 1: cc = 2 */ |
| d64_1 = 3.14DD; |
| d64_2 = 0.005DD; |
| result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 4, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc); |
| /* case 2: cc = 1 */ |
| d64_1 = -3.14DD; |
| d64_2 = 0.005DD; |
| result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc); |
| /* case 3: cc = 0 */ |
| d64_1 = 3.14DD; |
| d64_2 = d64_1; |
| result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc); |
| |
| /* 64-bit MULTIPLY */ |
| printf("64-bit MULTIPLY\n"); |
| /* case 1: cc = 2 */ |
| d64_1 = 3.14DD; |
| d64_2 = 7.DD; |
| result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 6, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc); |
| /* case 2: cc = 1 */ |
| d64_1 = -3.14DD; |
| d64_2 = 7.DD; |
| result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc); |
| /* case 3: cc = 0 */ |
| d64_1 = -3.14DD; |
| d64_2 = 0.DD; |
| result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc); |
| |
| /* 64-bit DIVIDE */ |
| printf("64-bit DIVIDE\n"); |
| /* case 1: cc = 2 */ |
| d64_1 = 22.DD; |
| d64_2 = 7.DD; |
| result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, d, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc); |
| /* case 2: cc = 1 */ |
| d64_1 = -22.DD; |
| d64_2 = 7.DD; |
| result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc); |
| /* case 3: cc = 0 */ |
| d64_1 = 0.DD; |
| d64_2 = 7.DD; |
| result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc); |
| DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc); |
| |
| /* 128-bit ADD */ |
| printf("128-bit ADD\n"); |
| /* case 1: cc = 2 */ |
| d128_1 = 3.14DL; |
| d128_2 = 0.005DL; |
| result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc); |
| /* case 2: cc = 1 */ |
| d128_1 = -3.14DL; |
| d128_2 = 0.005DL; |
| result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc); |
| /* case 3: cc = 0 */ |
| d128_1 = 3.14DL; |
| d128_2 = -d128_1; |
| result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 3, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc); |
| |
| /* 128-bit SUBTRACT */ |
| printf("128-bit SUBTRACT\n"); |
| /* case 1: cc = 2 */ |
| d128_1 = 3.14DL; |
| d128_2 = 0.005DL; |
| result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 4, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc); |
| /* case 2: cc = 1 */ |
| d128_1 = -3.14DL; |
| d128_2 = 0.005DL; |
| result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc); |
| /* case 3: cc = 0 */ |
| d128_1 = 3.14DL; |
| d128_2 = d128_1; |
| result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc); |
| |
| /* 128-bit MULTIPLY */ |
| printf("128-bit MULTIPLY\n"); |
| /* case 1: cc = 2 */ |
| d128_1 = 3.14DL; |
| d128_2 = 7.DL; |
| result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 6, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc); |
| /* case 2: cc = 1 */ |
| d128_1 = -3.14DL; |
| d128_2 = 7.DL; |
| result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc); |
| /* case 3: cc = 0 */ |
| d128_1 = 3.14DL; |
| d128_2 = 0.DL; |
| result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc); |
| |
| /* 128-bit DIVIDE */ |
| printf("128-bit DIVIDE\n"); |
| /* case 1: cc = 2 */ |
| d128_1 = 22.DL; |
| d128_2 = 7.DL; |
| result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, d, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc); |
| /* case 2: cc = 1 */ |
| d128_1 = -22.DL; |
| d128_2 = 7.DL; |
| result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc); |
| /* case 3: cc = 0 */ |
| d128_1 = 0.DL; |
| d128_2 = 7.DL; |
| result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc); |
| DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc); |
| |
| return 0; |
| } |