/* 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; }