xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/test/Unit/divtc3_test.c (revision b9829059e8a75f40496c2d279251f331078ac82e)
1*b9829059Sjoerg //===-- divtc3_test.c - Test __divtc3 -------------------------------------===//
2*b9829059Sjoerg //
3*b9829059Sjoerg //                     The LLVM Compiler Infrastructure
4*b9829059Sjoerg //
5*b9829059Sjoerg // This file is dual licensed under the MIT and the University of Illinois Open
6*b9829059Sjoerg // Source Licenses. See LICENSE.TXT for details.
7*b9829059Sjoerg //
8*b9829059Sjoerg //===----------------------------------------------------------------------===//
9*b9829059Sjoerg //
10*b9829059Sjoerg // This file tests __divtc3 for the compiler_rt library.
11*b9829059Sjoerg //
12*b9829059Sjoerg //===----------------------------------------------------------------------===//
13*b9829059Sjoerg 
14*b9829059Sjoerg #if _ARCH_PPC
15*b9829059Sjoerg 
16*b9829059Sjoerg #include "int_lib.h"
17*b9829059Sjoerg #include <math.h>
18*b9829059Sjoerg #include <complex.h>
19*b9829059Sjoerg #include <stdio.h>
20*b9829059Sjoerg 
21*b9829059Sjoerg // Returns: the quotient of (a + ib) / (c + id)
22*b9829059Sjoerg 
23*b9829059Sjoerg long double _Complex
24*b9829059Sjoerg __divtc3(long double __a, long double __b, long double __c, long double __d);
25*b9829059Sjoerg 
26*b9829059Sjoerg enum {zero, non_zero, inf, NaN, non_zero_nan};
27*b9829059Sjoerg 
28*b9829059Sjoerg int
classify(long double _Complex x)29*b9829059Sjoerg classify(long double _Complex x)
30*b9829059Sjoerg {
31*b9829059Sjoerg     if (x == 0)
32*b9829059Sjoerg         return zero;
33*b9829059Sjoerg     if (isinf(creall(x)) || isinf(cimagl(x)))
34*b9829059Sjoerg         return inf;
35*b9829059Sjoerg     if (isnan(creall(x)) && isnan(cimagl(x)))
36*b9829059Sjoerg         return NaN;
37*b9829059Sjoerg     if (isnan(creall(x)))
38*b9829059Sjoerg     {
39*b9829059Sjoerg         if (cimagl(x) == 0)
40*b9829059Sjoerg             return NaN;
41*b9829059Sjoerg         return non_zero_nan;
42*b9829059Sjoerg     }
43*b9829059Sjoerg     if (isnan(cimagl(x)))
44*b9829059Sjoerg     {
45*b9829059Sjoerg         if (creall(x) == 0)
46*b9829059Sjoerg             return NaN;
47*b9829059Sjoerg         return non_zero_nan;
48*b9829059Sjoerg     }
49*b9829059Sjoerg     return non_zero;
50*b9829059Sjoerg }
51*b9829059Sjoerg 
test__divtc3(long double a,long double b,long double c,long double d)52*b9829059Sjoerg int test__divtc3(long double a, long double b, long double c, long double d)
53*b9829059Sjoerg {
54*b9829059Sjoerg     long double _Complex r = __divtc3(a, b, c, d);
55*b9829059Sjoerg //      printf("test__divtc3(%Lf, %Lf, %Lf, %Lf) = %Lf + I%Lf\n",
56*b9829059Sjoerg //              a, b, c, d, creall(r), cimagl(r));
57*b9829059Sjoerg 
58*b9829059Sjoerg 	long double _Complex dividend;
59*b9829059Sjoerg 	long double _Complex divisor;
60*b9829059Sjoerg 
61*b9829059Sjoerg 	__real__ dividend = a;
62*b9829059Sjoerg 	__imag__ dividend = b;
63*b9829059Sjoerg 	__real__ divisor = c;
64*b9829059Sjoerg 	__imag__ divisor = d;
65*b9829059Sjoerg 
66*b9829059Sjoerg     switch (classify(dividend))
67*b9829059Sjoerg     {
68*b9829059Sjoerg     case zero:
69*b9829059Sjoerg         switch (classify(divisor))
70*b9829059Sjoerg         {
71*b9829059Sjoerg         case zero:
72*b9829059Sjoerg             if (classify(r) != NaN)
73*b9829059Sjoerg                 return 1;
74*b9829059Sjoerg             break;
75*b9829059Sjoerg         case non_zero:
76*b9829059Sjoerg             if (classify(r) != zero)
77*b9829059Sjoerg                 return 1;
78*b9829059Sjoerg             break;
79*b9829059Sjoerg         case inf:
80*b9829059Sjoerg             if (classify(r) != zero)
81*b9829059Sjoerg                 return 1;
82*b9829059Sjoerg             break;
83*b9829059Sjoerg         case NaN:
84*b9829059Sjoerg             if (classify(r) != NaN)
85*b9829059Sjoerg                 return 1;
86*b9829059Sjoerg             break;
87*b9829059Sjoerg         case non_zero_nan:
88*b9829059Sjoerg             if (classify(r) != NaN)
89*b9829059Sjoerg                 return 1;
90*b9829059Sjoerg             break;
91*b9829059Sjoerg         }
92*b9829059Sjoerg         break;
93*b9829059Sjoerg     case non_zero:
94*b9829059Sjoerg         switch (classify(divisor))
95*b9829059Sjoerg         {
96*b9829059Sjoerg         case zero:
97*b9829059Sjoerg             if (classify(r) != inf)
98*b9829059Sjoerg                 return 1;
99*b9829059Sjoerg             break;
100*b9829059Sjoerg         case non_zero:
101*b9829059Sjoerg             if (classify(r) != non_zero)
102*b9829059Sjoerg                 return 1;
103*b9829059Sjoerg             {
104*b9829059Sjoerg             long double _Complex z = (a * c + b * d) / (c * c + d * d)
105*b9829059Sjoerg                                    + (b * c - a * d) / (c * c + d * d) * _Complex_I;
106*b9829059Sjoerg             if (cabs((r - z)/r) > 1.e-6)
107*b9829059Sjoerg                 return 1;
108*b9829059Sjoerg             }
109*b9829059Sjoerg             break;
110*b9829059Sjoerg         case inf:
111*b9829059Sjoerg             if (classify(r) != zero)
112*b9829059Sjoerg                 return 1;
113*b9829059Sjoerg             break;
114*b9829059Sjoerg         case NaN:
115*b9829059Sjoerg             if (classify(r) != NaN)
116*b9829059Sjoerg                 return 1;
117*b9829059Sjoerg             break;
118*b9829059Sjoerg         case non_zero_nan:
119*b9829059Sjoerg             if (classify(r) != NaN)
120*b9829059Sjoerg                 return 1;
121*b9829059Sjoerg             break;
122*b9829059Sjoerg         }
123*b9829059Sjoerg         break;
124*b9829059Sjoerg     case inf:
125*b9829059Sjoerg         switch (classify(divisor))
126*b9829059Sjoerg         {
127*b9829059Sjoerg         case zero:
128*b9829059Sjoerg             if (classify(r) != inf)
129*b9829059Sjoerg                 return 1;
130*b9829059Sjoerg             break;
131*b9829059Sjoerg         case non_zero:
132*b9829059Sjoerg             if (classify(r) != inf)
133*b9829059Sjoerg                 return 1;
134*b9829059Sjoerg             break;
135*b9829059Sjoerg         case inf:
136*b9829059Sjoerg             if (classify(r) != NaN)
137*b9829059Sjoerg                 return 1;
138*b9829059Sjoerg             break;
139*b9829059Sjoerg         case NaN:
140*b9829059Sjoerg             if (classify(r) != NaN)
141*b9829059Sjoerg                 return 1;
142*b9829059Sjoerg             break;
143*b9829059Sjoerg         case non_zero_nan:
144*b9829059Sjoerg             if (classify(r) != NaN)
145*b9829059Sjoerg                 return 1;
146*b9829059Sjoerg             break;
147*b9829059Sjoerg         }
148*b9829059Sjoerg         break;
149*b9829059Sjoerg     case NaN:
150*b9829059Sjoerg         switch (classify(divisor))
151*b9829059Sjoerg         {
152*b9829059Sjoerg         case zero:
153*b9829059Sjoerg             if (classify(r) != NaN)
154*b9829059Sjoerg                 return 1;
155*b9829059Sjoerg             break;
156*b9829059Sjoerg         case non_zero:
157*b9829059Sjoerg             if (classify(r) != NaN)
158*b9829059Sjoerg                 return 1;
159*b9829059Sjoerg             break;
160*b9829059Sjoerg         case inf:
161*b9829059Sjoerg             if (classify(r) != NaN)
162*b9829059Sjoerg                 return 1;
163*b9829059Sjoerg             break;
164*b9829059Sjoerg         case NaN:
165*b9829059Sjoerg             if (classify(r) != NaN)
166*b9829059Sjoerg                 return 1;
167*b9829059Sjoerg             break;
168*b9829059Sjoerg         case non_zero_nan:
169*b9829059Sjoerg             if (classify(r) != NaN)
170*b9829059Sjoerg                 return 1;
171*b9829059Sjoerg             break;
172*b9829059Sjoerg         }
173*b9829059Sjoerg         break;
174*b9829059Sjoerg     case non_zero_nan:
175*b9829059Sjoerg         switch (classify(divisor))
176*b9829059Sjoerg         {
177*b9829059Sjoerg         case zero:
178*b9829059Sjoerg             if (classify(r) != inf)
179*b9829059Sjoerg                 return 1;
180*b9829059Sjoerg             break;
181*b9829059Sjoerg         case non_zero:
182*b9829059Sjoerg             if (classify(r) != NaN)
183*b9829059Sjoerg                 return 1;
184*b9829059Sjoerg             break;
185*b9829059Sjoerg         case inf:
186*b9829059Sjoerg             if (classify(r) != NaN)
187*b9829059Sjoerg                 return 1;
188*b9829059Sjoerg             break;
189*b9829059Sjoerg         case NaN:
190*b9829059Sjoerg             if (classify(r) != NaN)
191*b9829059Sjoerg                 return 1;
192*b9829059Sjoerg             break;
193*b9829059Sjoerg         case non_zero_nan:
194*b9829059Sjoerg             if (classify(r) != NaN)
195*b9829059Sjoerg                 return 1;
196*b9829059Sjoerg             break;
197*b9829059Sjoerg         }
198*b9829059Sjoerg         break;
199*b9829059Sjoerg     }
200*b9829059Sjoerg 
201*b9829059Sjoerg     return 0;
202*b9829059Sjoerg }
203*b9829059Sjoerg 
204*b9829059Sjoerg long double x[][2] =
205*b9829059Sjoerg {
206*b9829059Sjoerg     { 1.e-6,  1.e-6},
207*b9829059Sjoerg     {-1.e-6,  1.e-6},
208*b9829059Sjoerg     {-1.e-6, -1.e-6},
209*b9829059Sjoerg     { 1.e-6, -1.e-6},
210*b9829059Sjoerg 
211*b9829059Sjoerg     { 1.e+6,  1.e-6},
212*b9829059Sjoerg     {-1.e+6,  1.e-6},
213*b9829059Sjoerg     {-1.e+6, -1.e-6},
214*b9829059Sjoerg     { 1.e+6, -1.e-6},
215*b9829059Sjoerg 
216*b9829059Sjoerg     { 1.e-6,  1.e+6},
217*b9829059Sjoerg     {-1.e-6,  1.e+6},
218*b9829059Sjoerg     {-1.e-6, -1.e+6},
219*b9829059Sjoerg     { 1.e-6, -1.e+6},
220*b9829059Sjoerg 
221*b9829059Sjoerg     { 1.e+6,  1.e+6},
222*b9829059Sjoerg     {-1.e+6,  1.e+6},
223*b9829059Sjoerg     {-1.e+6, -1.e+6},
224*b9829059Sjoerg     { 1.e+6, -1.e+6},
225*b9829059Sjoerg 
226*b9829059Sjoerg     {NAN, NAN},
227*b9829059Sjoerg     {-INFINITY, NAN},
228*b9829059Sjoerg     {-2, NAN},
229*b9829059Sjoerg     {-1, NAN},
230*b9829059Sjoerg     {-0.5, NAN},
231*b9829059Sjoerg     {-0., NAN},
232*b9829059Sjoerg     {+0., NAN},
233*b9829059Sjoerg     {0.5, NAN},
234*b9829059Sjoerg     {1, NAN},
235*b9829059Sjoerg     {2, NAN},
236*b9829059Sjoerg     {INFINITY, NAN},
237*b9829059Sjoerg 
238*b9829059Sjoerg     {NAN, -INFINITY},
239*b9829059Sjoerg     {-INFINITY, -INFINITY},
240*b9829059Sjoerg     {-2, -INFINITY},
241*b9829059Sjoerg     {-1, -INFINITY},
242*b9829059Sjoerg     {-0.5, -INFINITY},
243*b9829059Sjoerg     {-0., -INFINITY},
244*b9829059Sjoerg     {+0., -INFINITY},
245*b9829059Sjoerg     {0.5, -INFINITY},
246*b9829059Sjoerg     {1, -INFINITY},
247*b9829059Sjoerg     {2, -INFINITY},
248*b9829059Sjoerg     {INFINITY, -INFINITY},
249*b9829059Sjoerg 
250*b9829059Sjoerg     {NAN, -2},
251*b9829059Sjoerg     {-INFINITY, -2},
252*b9829059Sjoerg     {-2, -2},
253*b9829059Sjoerg     {-1, -2},
254*b9829059Sjoerg     {-0.5, -2},
255*b9829059Sjoerg     {-0., -2},
256*b9829059Sjoerg     {+0., -2},
257*b9829059Sjoerg     {0.5, -2},
258*b9829059Sjoerg     {1, -2},
259*b9829059Sjoerg     {2, -2},
260*b9829059Sjoerg     {INFINITY, -2},
261*b9829059Sjoerg 
262*b9829059Sjoerg     {NAN, -1},
263*b9829059Sjoerg     {-INFINITY, -1},
264*b9829059Sjoerg     {-2, -1},
265*b9829059Sjoerg     {-1, -1},
266*b9829059Sjoerg     {-0.5, -1},
267*b9829059Sjoerg     {-0., -1},
268*b9829059Sjoerg     {+0., -1},
269*b9829059Sjoerg     {0.5, -1},
270*b9829059Sjoerg     {1, -1},
271*b9829059Sjoerg     {2, -1},
272*b9829059Sjoerg     {INFINITY, -1},
273*b9829059Sjoerg 
274*b9829059Sjoerg     {NAN, -0.5},
275*b9829059Sjoerg     {-INFINITY, -0.5},
276*b9829059Sjoerg     {-2, -0.5},
277*b9829059Sjoerg     {-1, -0.5},
278*b9829059Sjoerg     {-0.5, -0.5},
279*b9829059Sjoerg     {-0., -0.5},
280*b9829059Sjoerg     {+0., -0.5},
281*b9829059Sjoerg     {0.5, -0.5},
282*b9829059Sjoerg     {1, -0.5},
283*b9829059Sjoerg     {2, -0.5},
284*b9829059Sjoerg     {INFINITY, -0.5},
285*b9829059Sjoerg 
286*b9829059Sjoerg     {NAN, -0.},
287*b9829059Sjoerg     {-INFINITY, -0.},
288*b9829059Sjoerg     {-2, -0.},
289*b9829059Sjoerg     {-1, -0.},
290*b9829059Sjoerg     {-0.5, -0.},
291*b9829059Sjoerg     {-0., -0.},
292*b9829059Sjoerg     {+0., -0.},
293*b9829059Sjoerg     {0.5, -0.},
294*b9829059Sjoerg     {1, -0.},
295*b9829059Sjoerg     {2, -0.},
296*b9829059Sjoerg     {INFINITY, -0.},
297*b9829059Sjoerg 
298*b9829059Sjoerg     {NAN, 0.},
299*b9829059Sjoerg     {-INFINITY, 0.},
300*b9829059Sjoerg     {-2, 0.},
301*b9829059Sjoerg     {-1, 0.},
302*b9829059Sjoerg     {-0.5, 0.},
303*b9829059Sjoerg     {-0., 0.},
304*b9829059Sjoerg     {+0., 0.},
305*b9829059Sjoerg     {0.5, 0.},
306*b9829059Sjoerg     {1, 0.},
307*b9829059Sjoerg     {2, 0.},
308*b9829059Sjoerg     {INFINITY, 0.},
309*b9829059Sjoerg 
310*b9829059Sjoerg     {NAN, 0.5},
311*b9829059Sjoerg     {-INFINITY, 0.5},
312*b9829059Sjoerg     {-2, 0.5},
313*b9829059Sjoerg     {-1, 0.5},
314*b9829059Sjoerg     {-0.5, 0.5},
315*b9829059Sjoerg     {-0., 0.5},
316*b9829059Sjoerg     {+0., 0.5},
317*b9829059Sjoerg     {0.5, 0.5},
318*b9829059Sjoerg     {1, 0.5},
319*b9829059Sjoerg     {2, 0.5},
320*b9829059Sjoerg     {INFINITY, 0.5},
321*b9829059Sjoerg 
322*b9829059Sjoerg     {NAN, 1},
323*b9829059Sjoerg     {-INFINITY, 1},
324*b9829059Sjoerg     {-2, 1},
325*b9829059Sjoerg     {-1, 1},
326*b9829059Sjoerg     {-0.5, 1},
327*b9829059Sjoerg     {-0., 1},
328*b9829059Sjoerg     {+0., 1},
329*b9829059Sjoerg     {0.5, 1},
330*b9829059Sjoerg     {1, 1},
331*b9829059Sjoerg     {2, 1},
332*b9829059Sjoerg     {INFINITY, 1},
333*b9829059Sjoerg 
334*b9829059Sjoerg     {NAN, 2},
335*b9829059Sjoerg     {-INFINITY, 2},
336*b9829059Sjoerg     {-2, 2},
337*b9829059Sjoerg     {-1, 2},
338*b9829059Sjoerg     {-0.5, 2},
339*b9829059Sjoerg     {-0., 2},
340*b9829059Sjoerg     {+0., 2},
341*b9829059Sjoerg     {0.5, 2},
342*b9829059Sjoerg     {1, 2},
343*b9829059Sjoerg     {2, 2},
344*b9829059Sjoerg     {INFINITY, 2},
345*b9829059Sjoerg 
346*b9829059Sjoerg     {NAN, INFINITY},
347*b9829059Sjoerg     {-INFINITY, INFINITY},
348*b9829059Sjoerg     {-2, INFINITY},
349*b9829059Sjoerg     {-1, INFINITY},
350*b9829059Sjoerg     {-0.5, INFINITY},
351*b9829059Sjoerg     {-0., INFINITY},
352*b9829059Sjoerg     {+0., INFINITY},
353*b9829059Sjoerg     {0.5, INFINITY},
354*b9829059Sjoerg     {1, INFINITY},
355*b9829059Sjoerg     {2, INFINITY},
356*b9829059Sjoerg     {INFINITY, INFINITY}
357*b9829059Sjoerg 
358*b9829059Sjoerg };
359*b9829059Sjoerg 
360*b9829059Sjoerg #endif
361*b9829059Sjoerg 
main()362*b9829059Sjoerg int main()
363*b9829059Sjoerg {
364*b9829059Sjoerg #if _ARCH_PPC
365*b9829059Sjoerg     const unsigned N = sizeof(x) / sizeof(x[0]);
366*b9829059Sjoerg     unsigned i, j;
367*b9829059Sjoerg     for (i = 0; i < N; ++i)
368*b9829059Sjoerg     {
369*b9829059Sjoerg         for (j = 0; j < N; ++j)
370*b9829059Sjoerg         {
371*b9829059Sjoerg             if (test__divtc3(x[i][0], x[i][1], x[j][0], x[j][1]))
372*b9829059Sjoerg                 return 1;
373*b9829059Sjoerg         }
374*b9829059Sjoerg     }
375*b9829059Sjoerg 
376*b9829059Sjoerg //	printf("No errors found.\n");
377*b9829059Sjoerg 
378*b9829059Sjoerg #else
379*b9829059Sjoerg     printf("skipped\n");
380*b9829059Sjoerg #endif
381*b9829059Sjoerg     return 0;
382*b9829059Sjoerg }
383