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