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