mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
117 lines
4.7 KiB
C
117 lines
4.7 KiB
C
#include <stdio.h>
|
|
#include <sys/types.h>
|
|
#include "opcodes.h"
|
|
#include "dfp_utils.h"
|
|
|
|
/* Following macros adopted from dfp/math.h from libdfp */
|
|
#define DEC_INFINITY __builtin_infd64()
|
|
#define DEC_NAN (0.0DF * DEC_INFINITY)
|
|
|
|
/* Test DFP value and exponent comparison for 64/128-bit. */
|
|
|
|
#define CMP_DFP(insn, op1, op2, type, cc) \
|
|
({ \
|
|
register type d1 asm("f0") = op1; \
|
|
register type d2 asm("f1") = op2; \
|
|
/* cc = d1 (cmp) d2 */ \
|
|
asm volatile(insn(0,1) \
|
|
"ipm %0\n\t" \
|
|
"srl %0,28\n\t" \
|
|
:"=d" (cc) \
|
|
:"f"(d1), "f"(d2) \
|
|
); \
|
|
cc; \
|
|
})
|
|
|
|
|
|
#define COMPARE(insn, v1, v2, type) \
|
|
{ \
|
|
int cc; \
|
|
CMP_DFP(insn, v1, v2, type, cc); \
|
|
DFP_VAL_PRINT(v1, type); \
|
|
switch (cc) { \
|
|
case 0: \
|
|
printf(" == "); \
|
|
break; \
|
|
case 1: \
|
|
printf(" < "); \
|
|
break; \
|
|
case 2: \
|
|
printf(" > "); \
|
|
break; \
|
|
case 3: \
|
|
printf(" <> "); \
|
|
break; \
|
|
} \
|
|
DFP_VAL_PRINT(v2, type); \
|
|
printf(" (cc == %d)\n", cc); \
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
_Decimal64 d64_1, d64_2;
|
|
_Decimal128 d128_1, d128_2;
|
|
|
|
/* compare 8 bytes DFP value */
|
|
printf("cdtr:\n");
|
|
d64_1 = 5.000005DD;
|
|
d64_2 = 50000000000000000.000005DD;
|
|
COMPARE(CDTR, d64_1, d64_1, _Decimal64);
|
|
COMPARE(CDTR, d64_1, d64_2, _Decimal64);
|
|
COMPARE(CDTR, d64_2, d64_1, _Decimal64);
|
|
|
|
/* compare NAN and INF operands */
|
|
d64_1 = DEC_INFINITY;
|
|
d64_2 = DEC_NAN;
|
|
COMPARE(CDTR, d64_1, d64_2, _Decimal64);
|
|
COMPARE(CDTR, d64_1, d64_1, _Decimal64);
|
|
COMPARE(CDTR, d64_2, d64_2, _Decimal64);
|
|
|
|
/* compare 16 bytes DFP value */
|
|
printf("cxtr:\n");
|
|
d128_1 = 5.00005DL;
|
|
d128_2 = 5000000000000000.5DL;
|
|
COMPARE(CXTR, d128_1, d128_1, _Decimal128);
|
|
COMPARE(CXTR, d128_1, d128_2, _Decimal128);
|
|
COMPARE(CXTR, d128_2, d128_1, _Decimal128);
|
|
|
|
/* compare NAN and INF operands */
|
|
d128_1 = DEC_INFINITY;
|
|
d128_2 = DEC_NAN;
|
|
COMPARE(CXTR, d128_1, d128_2, _Decimal128);
|
|
COMPARE(CXTR, d128_1, d128_1, _Decimal128);
|
|
COMPARE(CXTR, d128_2, d128_2, _Decimal128);
|
|
|
|
/* compare exponents of 8 bytes DFP value */
|
|
printf("cedtr:\n");
|
|
d64_1 = 5.000005DD;
|
|
d64_2 = 50000000000000000.000005DD;
|
|
COMPARE(CEDTR, d64_1, d64_1, _Decimal64);
|
|
COMPARE(CEDTR, d64_1, d64_2, _Decimal64);
|
|
COMPARE(CEDTR, d64_2, d64_1, _Decimal64);
|
|
|
|
/* compare NAN and INF operands */
|
|
d64_1 = DEC_INFINITY;
|
|
d64_2 = DEC_NAN;
|
|
COMPARE(CEDTR, d64_1, d64_2, _Decimal64);
|
|
COMPARE(CEDTR, d64_1, d64_1, _Decimal64);
|
|
COMPARE(CEDTR, d64_2, d64_2, _Decimal64);
|
|
|
|
/* compare exponents of 16 bytes DFP value */
|
|
printf("cextr:\n");
|
|
d128_1 = 5.00005DL;
|
|
d128_2 = 5000000000000000.5DL;
|
|
COMPARE(CEXTR, d128_1, d128_1, _Decimal128);
|
|
COMPARE(CEXTR, d128_1, d128_2, _Decimal128);
|
|
COMPARE(CEXTR, d128_2, d128_1, _Decimal128);
|
|
|
|
/* compare NAN and INF operands */
|
|
d128_1 = DEC_INFINITY;
|
|
d128_2 = DEC_NAN;
|
|
COMPARE(CEXTR, d128_1, d128_2, _Decimal128);
|
|
COMPARE(CEXTR, d128_1, d128_1, _Decimal128);
|
|
COMPARE(CEXTR, d128_2, d128_2, _Decimal128);
|
|
|
|
return 0;
|
|
}
|