1 #include <math.h> 2 #include <stdio.h> 3 4 /* Following macros adopted from dfp/math.h from libdfp */ 5 #define DEC_INFINITY __builtin_infd64() 6 #define DEC_NAN (0.0DF * DEC_INFINITY) 7 8 /* Following instructions are tested: 9 test data class tests for 10 _Decimal32 - TDCET 11 _Decimal64 - TDCDT 12 _decimal128 - TDCXT 13 test data group tests for 14 _Decimal32 - TDGET 15 _Decimal64 - TDGDT 16 _decimal128 - TDGXT 17 */ 18 19 #define TEST_128(opcode, d, n) \ 20 ({ \ 21 int match; \ 22 _Decimal128 f = d; \ 23 long long num = n; \ 24 asm volatile(opcode ", %1,0(%2)\n" \ 25 "ipm %0\n" \ 26 "srl %0,28\n" \ 27 : "=d" (match) : "f" (f), "a" (num) : "cc"); \ 28 match; \ 29 }) 30 31 #define TEST_64(opcode, d, n) \ 32 ({ \ 33 int match; \ 34 _Decimal64 f = d; \ 35 long long num = n; \ 36 asm volatile(opcode ", %1,0(%2)\n" \ 37 "ipm %0\n" \ 38 "srl %0,28\n" \ 39 : "=d" (match) : "f" (f), "a" (num) : "cc"); \ 40 match; \ 41 }) 42 43 #define TEST_32(opcode, d, n) \ 44 ({ \ 45 int match; \ 46 _Decimal32 f = d; \ 47 long long num = n; \ 48 asm volatile(opcode ", %1,0(%2)\n" \ 49 "ipm %0\n" \ 50 "srl %0,28\n" \ 51 : "=d" (match) : "f" (f), "a" (num) : "cc"); \ 52 match; \ 53 }) 54 55 int main() 56 { 57 int i; 58 59 /* The right most 12 bits 52:63 of the second operand are set and tested */ 60 for (i = 0; i < 12; i++) { 61 /* DFP 128 bit - TDCXT */ 62 printf("%d", TEST_128(".insn rxe, 0xed0000000058", +0.0DF, 1UL<<i)); 63 printf("%d", TEST_128(".insn rxe, 0xed0000000058", -0.0DF, 1UL<<i)); 64 printf("%d", TEST_128(".insn rxe, 0xed0000000058", +2.2DF, 1UL<<i)); 65 printf("%d", TEST_128(".insn rxe, 0xed0000000058", -2.2DF, 1UL<<i)); 66 printf("%d", TEST_128(".insn rxe, 0xed0000000058",+DEC_INFINITY,1UL<<i)); 67 printf("%d", TEST_128(".insn rxe, 0xed0000000058",-DEC_INFINITY,1UL<<i)); 68 printf("%d", TEST_128(".insn rxe, 0xed0000000058", +DEC_NAN, 1UL<<i)); 69 printf("%d", TEST_128(".insn rxe, 0xed0000000058", -DEC_NAN, 1UL<<i)); 70 71 /* DFP 128 bit - TDGXT */ 72 printf("%d", TEST_128(".insn rxe, 0xed0000000059", +0.0DF, 1UL<<i)); 73 printf("%d", TEST_128(".insn rxe, 0xed0000000059", -0.0DF, 1UL<<i)); 74 printf("%d", TEST_128(".insn rxe, 0xed0000000059", +2.2DF, 1UL<<i)); 75 printf("%d", TEST_128(".insn rxe, 0xed0000000059", -2.2DF, 1UL<<i)); 76 printf("%d", TEST_128(".insn rxe, 0xed0000000059",+DEC_INFINITY,1UL<<i)); 77 printf("%d", TEST_128(".insn rxe, 0xed0000000059",-DEC_INFINITY,1UL<<i)); 78 printf("%d", TEST_128(".insn rxe, 0xed0000000059", +DEC_NAN, 1UL<<i)); 79 printf("%d", TEST_128(".insn rxe, 0xed0000000059", -DEC_NAN, 1UL<<i)); 80 81 /* DFP 64 bit - TDCDT */ 82 printf("%d", TEST_64(".insn rxe, 0xed0000000054", +0.0DF, 1UL<<i)); 83 printf("%d", TEST_64(".insn rxe, 0xed0000000054", -0.0DF, 1UL<<i)); 84 printf("%d", TEST_64(".insn rxe, 0xed0000000054", +2.2DF, 1UL<<i)); 85 printf("%d", TEST_64(".insn rxe, 0xed0000000054", -2.2DF, 1UL<<i)); 86 printf("%d", TEST_64(".insn rxe, 0xed0000000054",+DEC_INFINITY,1UL<<i)); 87 printf("%d", TEST_64(".insn rxe, 0xed0000000054",-DEC_INFINITY,1UL<<i)); 88 printf("%d", TEST_64(".insn rxe, 0xed0000000054", +DEC_NAN, 1UL<<i)); 89 printf("%d", TEST_64(".insn rxe, 0xed0000000054", -DEC_NAN, 1UL<<i)); 90 91 /* DFP 64 bit - TDGDT */ 92 printf("%d", TEST_64(".insn rxe, 0xed0000000055", +0.0DF, 1UL<<i)); 93 printf("%d", TEST_64(".insn rxe, 0xed0000000055", -0.0DF, 1UL<<i)); 94 printf("%d", TEST_64(".insn rxe, 0xed0000000055", +2.2DF, 1UL<<i)); 95 printf("%d", TEST_64(".insn rxe, 0xed0000000055", -2.2DF, 1UL<<i)); 96 printf("%d", TEST_64(".insn rxe, 0xed0000000055",+DEC_INFINITY,1UL<<i)); 97 printf("%d", TEST_64(".insn rxe, 0xed0000000055",-DEC_INFINITY,1UL<<i)); 98 printf("%d", TEST_64(".insn rxe, 0xed0000000055", +DEC_NAN, 1UL<<i)); 99 printf("%d", TEST_64(".insn rxe, 0xed0000000055", -DEC_NAN, 1UL<<i)); 100 101 /* DFP 32 bit - TDCET */ 102 printf("%d", TEST_32(".insn rxe, 0xed0000000050", +0.0DF, 1UL<<i)); 103 printf("%d", TEST_32(".insn rxe, 0xed0000000050", -0.0DF, 1UL<<i)); 104 printf("%d", TEST_32(".insn rxe, 0xed0000000050", +2.2DF, 1UL<<i)); 105 printf("%d", TEST_32(".insn rxe, 0xed0000000050", -2.2DF, 1UL<<i)); 106 printf("%d", TEST_32(".insn rxe, 0xed0000000050",+DEC_INFINITY,1UL<<i)); 107 printf("%d", TEST_32(".insn rxe, 0xed0000000050",-DEC_INFINITY,1UL<<i)); 108 printf("%d", TEST_32(".insn rxe, 0xed0000000050", +DEC_NAN, 1UL<<i)); 109 printf("%d", TEST_32(".insn rxe, 0xed0000000050", -DEC_NAN, 1UL<<i)); 110 111 /* DFP 32 bit - TDGET */ 112 printf("%d", TEST_32(".insn rxe, 0xed0000000051", +0.0DF, 1UL<<i)); 113 printf("%d", TEST_32(".insn rxe, 0xed0000000051", -0.0DF, 1UL<<i)); 114 printf("%d", TEST_32(".insn rxe, 0xed0000000051", +2.2DF, 1UL<<i)); 115 printf("%d", TEST_32(".insn rxe, 0xed0000000051", -2.2DF, 1UL<<i)); 116 printf("%d", TEST_32(".insn rxe, 0xed0000000051",+DEC_INFINITY,1UL<<i)); 117 printf("%d", TEST_32(".insn rxe, 0xed0000000051",-DEC_INFINITY,1UL<<i)); 118 printf("%d", TEST_32(".insn rxe, 0xed0000000051", +DEC_NAN, 1UL<<i)); 119 printf("%d", TEST_32(".insn rxe, 0xed0000000051", -DEC_NAN, 1UL<<i)); 120 121 printf("\n"); 122 123 } 124 return 0; 125 } 126