#include <math.h> #include <stdio.h> /* Following macros adopted from dfp/math.h from libdfp */ #define DEC_INFINITY __builtin_infd64() #define DEC_NAN (0.0DF * DEC_INFINITY) /* Following instructions are tested: test data class tests for _Decimal32 - TDCET _Decimal64 - TDCDT _decimal128 - TDCXT test data group tests for _Decimal32 - TDGET _Decimal64 - TDGDT _decimal128 - TDGXT */ #define TEST_128(opcode, d, n) \ ({ \ int match; \ _Decimal128 f = d; \ long long num = n; \ asm volatile(opcode ", %1,0(%2)\n" \ "ipm %0\n" \ "srl %0,28\n" \ : "=d" (match) : "f" (f), "a" (num) : "cc"); \ match; \ }) #define TEST_64(opcode, d, n) \ ({ \ int match; \ _Decimal64 f = d; \ long long num = n; \ asm volatile(opcode ", %1,0(%2)\n" \ "ipm %0\n" \ "srl %0,28\n" \ : "=d" (match) : "f" (f), "a" (num) : "cc"); \ match; \ }) #define TEST_32(opcode, d, n) \ ({ \ int match; \ _Decimal32 f = d; \ long long num = n; \ asm volatile(opcode ", %1,0(%2)\n" \ "ipm %0\n" \ "srl %0,28\n" \ : "=d" (match) : "f" (f), "a" (num) : "cc"); \ match; \ }) int main() { int i; /* The right most 12 bits 52:63 of the second operand are set and tested */ for (i = 0; i < 12; i++) { /* DFP 128 bit - TDCXT */ printf("%d", TEST_128(".insn rxe, 0xed0000000058", +0.0DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058", -0.0DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058", +2.2DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058", -2.2DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058", +DEC_NAN, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000058", -DEC_NAN, 1UL<<i)); /* DFP 128 bit - TDGXT */ printf("%d", TEST_128(".insn rxe, 0xed0000000059", +0.0DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059", -0.0DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059", +2.2DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059", -2.2DF, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059", +DEC_NAN, 1UL<<i)); printf("%d", TEST_128(".insn rxe, 0xed0000000059", -DEC_NAN, 1UL<<i)); /* DFP 64 bit - TDCDT */ printf("%d", TEST_64(".insn rxe, 0xed0000000054", +0.0DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054", -0.0DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054", +2.2DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054", -2.2DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054", +DEC_NAN, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000054", -DEC_NAN, 1UL<<i)); /* DFP 64 bit - TDGDT */ printf("%d", TEST_64(".insn rxe, 0xed0000000055", +0.0DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055", -0.0DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055", +2.2DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055", -2.2DF, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055", +DEC_NAN, 1UL<<i)); printf("%d", TEST_64(".insn rxe, 0xed0000000055", -DEC_NAN, 1UL<<i)); /* DFP 32 bit - TDCET */ printf("%d", TEST_32(".insn rxe, 0xed0000000050", +0.0DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050", -0.0DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050", +2.2DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050", -2.2DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050", +DEC_NAN, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000050", -DEC_NAN, 1UL<<i)); /* DFP 32 bit - TDGET */ printf("%d", TEST_32(".insn rxe, 0xed0000000051", +0.0DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051", -0.0DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051", +2.2DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051", -2.2DF, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051",+DEC_INFINITY,1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051",-DEC_INFINITY,1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051", +DEC_NAN, 1UL<<i)); printf("%d", TEST_32(".insn rxe, 0xed0000000051", -DEC_NAN, 1UL<<i)); printf("\n"); } return 0; }