#include #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; }