--- /dev/null
+#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;
+
+ d64_1 = 5.000005DD;
+ d64_2 = 50000000000000000.000005DD;
+
+ // compare 8 bytes DFP value
+ printf("cdtr:\n");
+ 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);
+
+#if 0 //fixs390: enable it when Iop_ExtractD64 is available
+ // compare exponents of 8 bytes DFP value
+ printf("cedtr:\n");
+ COMPARE(CEDTR, d64_1, d64_1, _Decimal64);
+ COMPARE(CEDTR, d64_1, d64_2, _Decimal64);
+ COMPARE(CEDTR, d64_2, d64_1, _Decimal64);
+#endif
+ d128_1 = 5.00005DL;
+ d128_2 = 5000000000000000.5DL;
+
+ // compare 16 bytes DFP value
+ printf("cxtr:\n");
+ 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);
+
+#if 0 //fixs390: enable it when Iop_ExtractD128 is available
+ // compare exponents of 16 bytes DFP value
+ printf("cextr:\n");
+ COMPARE(CEXTR, d128_1, d128_1, _Decimal128);
+ COMPARE(CEXTR, d128_1, d128_2, _Decimal128);
+ COMPARE(CEXTR, d128_2, d128_1, _Decimal128);
+#endif
+
+ return 0;
+}
--- /dev/null
+#include <stdio.h>
+#include <sys/types.h>
+#include "dfp_utils.h"
+
+volatile _Decimal32 d32_1, d32_2;
+volatile _Decimal64 d64_1, d64_2;
+volatile _Decimal128 d128_1, d128_2;
+
+int main(void)
+{
+ d64_1 = 5.000005DD;
+ d64_2 = 60000.4DD;
+ d32_1 = 3.000002DF;
+ d32_2 = 500000.000005DF;
+ d128_1 = 100000000.000028DL;
+
+ d64_1 = (_Decimal64) d32_1; //Exercise LDETR (load lengthened)
+ printf("D32 -> D64 : ");
+ DFP_VAL_PRINT(d32_1, _Decimal32);
+ printf(" -> ");
+ DFP_VAL_PRINT(d64_1, _Decimal64);
+
+ d128_2 = (_Decimal128) d64_2; //Exercise LXDTR (load lengthened)
+ printf("\nD64 -> D128 : ");
+ DFP_VAL_PRINT(d64_2, _Decimal64);
+ printf(" -> ");
+ DFP_VAL_PRINT(d128_2, _Decimal128);
+
+ d32_2 = (_Decimal32) d64_2; //Exercise LEDTR (load rounded)
+ printf("\nD64 -> D32 : ");
+ DFP_VAL_PRINT(d64_2, _Decimal64);
+ printf(" -> ");
+ DFP_VAL_PRINT(d32_2, _Decimal32);
+
+ d64_2 = (_Decimal64) d128_1; //Exercise LDXTR (load rounded)
+ printf("\nD128 -> D64 : ");
+ DFP_VAL_PRINT(d128_1, _Decimal128);
+ printf(" -> ");
+ DFP_VAL_PRINT(d64_2, _Decimal64);
+ printf("\n");
+
+ return 0;
+}