]>
git.proxmox.com Git - rustc.git/blob - src/compiler-rt/test/builtins/Unit/divdc3_test.c
1 //===-- divdc3_test.c - Test __divdc3 -------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file tests __divdc3 for the compiler_rt library.
12 //===----------------------------------------------------------------------===//
19 // Returns: the quotient of (a + ib) / (c + id)
21 COMPILER_RT_ABI
double _Complex
22 __divdc3(double __a
, double __b
, double __c
, double __d
);
24 enum {zero
, non_zero
, inf
, NaN
, non_zero_nan
};
27 classify(double _Complex x
)
31 if (isinf(creal(x
)) || isinf(cimag(x
)))
33 if (isnan(creal(x
)) && isnan(cimag(x
)))
50 int test__divdc3(double a
, double b
, double c
, double d
)
52 double _Complex r
= __divdc3(a
, b
, c
, d
);
53 // printf("test__divdc3(%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
;
58 __real__ dividend
= a
;
59 __imag__ dividend
= b
;
63 switch (classify(dividend
))
66 switch (classify(divisor
))
69 if (classify(r
) != NaN
)
73 if (classify(r
) != zero
)
77 if (classify(r
) != zero
)
81 if (classify(r
) != NaN
)
85 if (classify(r
) != NaN
)
91 switch (classify(divisor
))
94 if (classify(r
) != inf
)
98 if (classify(r
) != non_zero
)
101 double _Complex z
= (a
* c
+ b
* d
) / (c
* c
+ d
* d
)
102 + (b
* c
- a
* d
) / (c
* c
+ d
* d
) * _Complex_I
;
103 if (cabs((r
-z
)/r
) > 1.e
-6)
108 if (classify(r
) != zero
)
112 if (classify(r
) != NaN
)
116 if (classify(r
) != NaN
)
122 switch (classify(divisor
))
125 if (classify(r
) != inf
)
129 if (classify(r
) != inf
)
133 if (classify(r
) != NaN
)
137 if (classify(r
) != NaN
)
141 if (classify(r
) != NaN
)
147 switch (classify(divisor
))
150 if (classify(r
) != NaN
)
154 if (classify(r
) != NaN
)
158 if (classify(r
) != NaN
)
162 if (classify(r
) != NaN
)
166 if (classify(r
) != NaN
)
172 switch (classify(divisor
))
175 if (classify(r
) != inf
)
179 if (classify(r
) != NaN
)
183 if (classify(r
) != NaN
)
187 if (classify(r
) != NaN
)
191 if (classify(r
) != NaN
)
236 {-INFINITY
, -INFINITY
},
245 {INFINITY
, -INFINITY
},
344 {-INFINITY
, INFINITY
},
359 const unsigned N
= sizeof(x
) / sizeof(x
[0]);
361 for (i
= 0; i
< N
; ++i
)
363 for (j
= 0; j
< N
; ++j
)
365 if (test__divdc3(x
[i
][0], x
[i
][1], x
[j
][0], x
[j
][1]))