1 /* Check reciprocal estimate functions for accuracy.  */
2 
3 #ifdef __LP64__
4 typedef unsigned long uns64_t;
5 #define UNUM64(x) x ## L
6 
7 #else
8 typedef unsigned long long uns64_t;
9 #define UNUM64(x) x ## LL
10 #endif
11 
12 typedef unsigned int uns32_t;
13 
14 #define TNAME2(x) #x
15 #define TNAME(x) TNAME2(x)
16 
17 /*
18  * Float functions.
19  */
20 
21 #define TYPE float
22 #define NAME(PREFIX) PREFIX ## _float
23 #define UNS_TYPE uns32_t
24 #define UNS_ABS __builtin_abs
25 #define EXP_SIZE 8
26 #define MAN_SIZE 23
27 #define FABS __builtin_fabsf
28 #define FMAX __builtin_fmaxf
29 #define FMIN __builtin_fminf
30 #define SQRT __builtin_sqrtf
31 #define RMIN 1.0e-10
32 #define RMAX 1.0e+10
33 #define BDIV 1
34 #define BRSQRT 2
35 #define ASMDIV "fdivs"
36 #define ASMSQRT "fsqrts"
37 
38 #define INIT_DIV							\
39 {									\
40   { 0x4fffffff },	/* 8589934080 */				\
41   { 0x4effffff },	/* 2147483520 */				\
42   { 0x40ffffff },	/* 7.99999952316284 */				\
43   { 0x3fffffff },	/* 1.99999988079071 */				\
44   { 0x417fffff },	/* 15.9999990463257 */				\
45   { 0x42ffffff },	/* 127.999992370605 */				\
46   { 0x3dffffff },	/* 0.124999992549419 */				\
47   { 0x3effffff },	/* 0.499999970197678 */				\
48 }
49 
50 #define INIT_RSQRT							\
51 {									\
52   { 0x457ffffe },	/* 4096 - small amount */			\
53   { 0x4c7fffff },	/* 6.71089e+07 */				\
54   { 0x3d7fffff },	/* 0.0625 - small amount */			\
55   { 0x307ffffe },	/* 9.31322e-10 */				\
56   { 0x4c7ffffe },	/* 6.71089e+07 */				\
57   { 0x397ffffe },	/* 0.000244141 */				\
58   { 0x2e7fffff },	/* 5.82077e-11 */				\
59   { 0x2f7fffff },	/* 2.32831e-10 */				\
60 }
61 
62 
63 #include "recip-test2.h"
64 
65 /*
66  * Double functions.
67  */
68 
69 #undef TYPE
70 #undef NAME
71 #undef UNS_TYPE
72 #undef UNS_ABS
73 #undef EXP_SIZE
74 #undef MAN_SIZE
75 #undef FABS
76 #undef FMAX
77 #undef FMIN
78 #undef SQRT
79 #undef RMIN
80 #undef RMAX
81 #undef BDIV
82 #undef BRSQRT
83 #undef ASMDIV
84 #undef ASMSQRT
85 #undef INIT_DIV
86 #undef INIT_RSQRT
87 
88 #define TYPE double
89 #define NAME(PREFIX) PREFIX ## _double
90 #define UNS_TYPE uns64_t
91 #define UNS_ABS __builtin_imaxabs
92 #define EXP_SIZE 11
93 #define MAN_SIZE 52
94 #define FABS __builtin_fabs
95 #define FMAX __builtin_fmax
96 #define FMIN __builtin_fmin
97 #define SQRT __builtin_sqrt
98 #define RMIN 1.0e-100
99 #define RMAX 1.0e+100
100 #define BDIV 1
101 #define BRSQRT 2
102 #define ASMDIV "fdiv"
103 #define ASMSQRT "fsqrt"
104 
105 #define INIT_DIV							\
106 {									\
107   { UNUM64 (0x2b57be53f2a2f3a0) },	/* 6.78462e-100 */		\
108   { UNUM64 (0x2b35f8e8ea553e52) },	/* 1.56963e-100 */		\
109   { UNUM64 (0x2b5b9d861d2fe4fb) },	/* 7.89099e-100 */		\
110   { UNUM64 (0x2b45dc44a084e682) },	/* 3.12327e-100 */		\
111   { UNUM64 (0x2b424ce16945d777) },	/* 2.61463e-100 */		\
112   { UNUM64 (0x2b20b5023d496b50) },	/* 5.96749e-101 */		\
113   { UNUM64 (0x2b61170547f57caa) },	/* 9.76678e-100 */		\
114   { UNUM64 (0x2b543b9d498aac37) },	/* 5.78148e-100 */		\
115 }
116 
117 #define INIT_RSQRT							\
118 {									\
119   { UNUM64 (0x2b616f2d8cbbc646) },	/* 9.96359e-100 */		\
120   { UNUM64 (0x2b5c4db2da0a011d) },	/* 8.08764e-100 */		\
121   { UNUM64 (0x2b55a82d5735b262) },	/* 6.1884e-100 */		\
122   { UNUM64 (0x2b50b52908258cb8) },	/* 4.77416e-100 */		\
123   { UNUM64 (0x2b363989a4fb29af) },	/* 1.58766e-100 */		\
124   { UNUM64 (0x2b508b9f6f4180a9) },	/* 4.7278e-100 */		\
125   { UNUM64 (0x2b4f7a1d48accb40) },	/* 4.49723e-100 */		\
126   { UNUM64 (0x2b1146a37372a81f) },	/* 3.08534e-101 */		\
127   { UNUM64 (0x2b33f876a8c48050) },	/* 1.42663e-100 */		\
128 }
129 
130 #include "recip-test2.h"
131 
132 int
main(int argc,char * argv[])133 main (int argc __attribute__((__unused__)),
134       char *argv[] __attribute__((__unused__)))
135 {
136   srand48 (1);
137   run_float ();
138 
139 #ifdef VERBOSE
140   printf ("\n");
141 #endif
142 
143   run_double ();
144 
145   if (error_count_float != 0 || error_count_double != 0)
146     abort ();
147 
148   return 0;
149 }
150