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