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