| /* test data class tests for float, double, long double: TCEB, TCDB, TCXB */ |
| #include <math.h> |
| #include <stdio.h> |
| |
| static int tcxb(long double f, long long num) |
| { |
| int match; |
| |
| asm volatile(" tcxb %1,0(%2)\n" |
| "ipm %0\n" |
| "srl %0,28\n" |
| : "=d" (match) |
| : "f" (f), "a" (num) |
| : "cc"); |
| return match; |
| } |
| |
| static int tcdb(double f, long long num) |
| { |
| int match; |
| |
| asm volatile(" tcdb %1,0(%2)\n" |
| "ipm %0\n" |
| "srl %0,28\n" |
| : "=d" (match) |
| : "f" (f), "a" (num) |
| : "cc"); |
| return match; |
| } |
| |
| static int tceb(float f, long long num) |
| { |
| int match; |
| |
| asm volatile(" tceb %1,0(%2)\n" |
| "ipm %0\n" |
| "srl %0,28\n" |
| : "=d" (match) |
| : "f" (f), "a" (num) |
| : "cc"); |
| return match; |
| } |
| |
| int main() |
| { |
| int i; |
| |
| for (i = 0; i < 64; i++) { |
| if (sizeof (long double) == 16) { |
| /* long double 128 bit */ |
| printf("%d", tcxb(+0.0l, 1UL<<i)); |
| printf("%d", tcxb(-0.0l, 1UL<<i)); |
| printf("%d", tcxb(+2.2l, 1UL<<i)); |
| printf("%d", tcxb(-2.2l, 1UL<<i)); |
| printf("%d", tcxb(+INFINITY, 1UL<<i)); |
| printf("%d", tcxb(-INFINITY, 1UL<<i)); |
| printf("%d", tcxb(+NAN, 1UL<<i)); |
| printf("%d", tcxb(-NAN, 1UL<<i)); |
| } else { |
| /* long double 64 bit */ |
| printf("%d", tcdb(+0.0l, 1UL<<i)); |
| printf("%d", tcdb(-0.0l, 1UL<<i)); |
| printf("%d", tcdb(+2.2l, 1UL<<i)); |
| printf("%d", tcdb(-2.2l, 1UL<<i)); |
| printf("%d", tcdb(+INFINITY, 1UL<<i)); |
| printf("%d", tcdb(-INFINITY, 1UL<<i)); |
| printf("%d", tcdb(+NAN, 1UL<<i)); |
| printf("%d", tcdb(-NAN, 1UL<<i)); |
| } |
| /* double 64 bit */ |
| printf("%d", tcdb(+0.0, 1UL<<i)); |
| printf("%d", tcdb(-0.0, 1UL<<i)); |
| printf("%d", tcdb(+2.2, 1UL<<i)); |
| printf("%d", tcdb(-2.2, 1UL<<i)); |
| printf("%d", tcdb(+INFINITY, 1UL<<i)); |
| printf("%d", tcdb(-INFINITY, 1UL<<i)); |
| printf("%d", tcdb(+NAN, 1UL<<i)); |
| printf("%d", tcdb(-NAN, 1UL<<i)); |
| |
| |
| /* float 32 bit */ |
| printf("%d", tceb(+0.0f, 1UL<<i)); |
| printf("%d", tceb(-0.0f, 1UL<<i)); |
| printf("%d", tceb(+2.2f, 1UL<<i)); |
| printf("%d", tceb(-2.2f, 1UL<<i)); |
| printf("%d", tceb(+INFINITY, 1UL<<i)); |
| printf("%d", tceb(-INFINITY, 1UL<<i)); |
| printf("%d", tceb(+NAN, 1UL<<i)); |
| printf("%d", tceb(-NAN, 1UL<<i)); |
| |
| printf("\n"); |
| |
| } |
| return 0; |
| } |