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