mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
174 lines
6.1 KiB
C
174 lines
6.1 KiB
C
#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;
|
|
}
|