1 /* test data class tests for float, double, long double:  TCEB, TCDB, TCXB */
2 #include <math.h>
3 #include <stdio.h>
4 
tcxb(long double f,long long num)5 static int tcxb(long double f, long long num)
6 {
7 	int match;
8 
9 	asm volatile("	tcxb %1,0(%2)\n"
10 			"ipm %0\n"
11 			"srl %0,28\n"
12 			: "=d" (match)
13 			: "f" (f), "a" (num)
14 			: "cc");
15 	return match;
16 }
17 
tcdb(double f,long long num)18 static int tcdb(double f, long long num)
19 {
20 	int match;
21 
22 	asm volatile("	tcdb %1,0(%2)\n"
23 			"ipm %0\n"
24 			"srl %0,28\n"
25 			: "=d" (match)
26 			: "f" (f), "a" (num)
27 			: "cc");
28 	return match;
29 }
30 
tceb(float f,long long num)31 static int tceb(float f, long long num)
32 {
33 	int match;
34 
35 	asm volatile("	tceb %1,0(%2)\n"
36 			"ipm %0\n"
37 			"srl %0,28\n"
38 			: "=d" (match)
39 			: "f" (f), "a" (num)
40 			: "cc");
41 	return match;
42 }
43 
main()44 int main()
45 {
46 	int i;
47 
48 	for (i = 0; i < 64; i++) {
49 		if (sizeof (long double) == 16) {
50 			/* long double 128 bit */
51 			printf("%d", tcxb(+0.0l,	1UL<<i));
52 			printf("%d", tcxb(-0.0l,	1UL<<i));
53 			printf("%d", tcxb(+2.2l,	1UL<<i));
54 			printf("%d", tcxb(-2.2l,	1UL<<i));
55 			printf("%d", tcxb(+INFINITY,	1UL<<i));
56 			printf("%d", tcxb(-INFINITY,	1UL<<i));
57 			printf("%d", tcxb(+NAN,		1UL<<i));
58 			printf("%d", tcxb(-NAN,		1UL<<i));
59 		} else {
60 			/* long double 64 bit */
61 			printf("%d", tcdb(+0.0l,	1UL<<i));
62 			printf("%d", tcdb(-0.0l,	1UL<<i));
63 			printf("%d", tcdb(+2.2l,	1UL<<i));
64 			printf("%d", tcdb(-2.2l,	1UL<<i));
65 			printf("%d", tcdb(+INFINITY,	1UL<<i));
66 			printf("%d", tcdb(-INFINITY,	1UL<<i));
67 			printf("%d", tcdb(+NAN,		1UL<<i));
68 			printf("%d", tcdb(-NAN,		1UL<<i));
69 		}
70 		/* double 64 bit */
71 		printf("%d", tcdb(+0.0,		1UL<<i));
72 		printf("%d", tcdb(-0.0,		1UL<<i));
73 		printf("%d", tcdb(+2.2,		1UL<<i));
74 		printf("%d", tcdb(-2.2,		1UL<<i));
75 		printf("%d", tcdb(+INFINITY,	1UL<<i));
76 		printf("%d", tcdb(-INFINITY,	1UL<<i));
77 		printf("%d", tcdb(+NAN,		1UL<<i));
78 		printf("%d", tcdb(-NAN,		1UL<<i));
79 
80 
81 		/* float 32 bit */
82 		printf("%d", tceb(+0.0f,	1UL<<i));
83 		printf("%d", tceb(-0.0f,	1UL<<i));
84 		printf("%d", tceb(+2.2f,	1UL<<i));
85 		printf("%d", tceb(-2.2f,	1UL<<i));
86 		printf("%d", tceb(+INFINITY,	1UL<<i));
87 		printf("%d", tceb(-INFINITY,	1UL<<i));
88 		printf("%d", tceb(+NAN,		1UL<<i));
89 		printf("%d", tceb(-NAN,		1UL<<i));
90 
91 		printf("\n");
92 
93 	}
94 	return 0;
95 }
96