1 /* ===-- divxc3.c - Implement __divxc3 -------------------------------------===
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 implements __divxc3 for the compiler_rt library.
19 /* Returns: the quotient of (a + ib) / (c + id) */
22 __divxc3(long double __a
, long double __b
, long double __c
, long double __d
)
25 long double __logbw
= crt_logbl(crt_fmaxl(crt_fabsl(__c
), crt_fabsl(__d
)));
26 if (crt_isfinite(__logbw
))
28 __ilogbw
= (int)__logbw
;
29 __c
= crt_scalbnl(__c
, -__ilogbw
);
30 __d
= crt_scalbnl(__d
, -__ilogbw
);
32 long double __denom
= __c
* __c
+ __d
* __d
;
33 long double _Complex z
;
34 __real__ z
= crt_scalbnl((__a
* __c
+ __b
* __d
) / __denom
, -__ilogbw
);
35 __imag__ z
= crt_scalbnl((__b
* __c
- __a
* __d
) / __denom
, -__ilogbw
);
36 if (crt_isnan(__real__ z
) && crt_isnan(__imag__ z
))
38 if ((__denom
== 0) && (!crt_isnan(__a
) || !crt_isnan(__b
)))
40 __real__ z
= crt_copysignl(CRT_INFINITY
, __c
) * __a
;
41 __imag__ z
= crt_copysignl(CRT_INFINITY
, __c
) * __b
;
43 else if ((crt_isinf(__a
) || crt_isinf(__b
)) &&
44 crt_isfinite(__c
) && crt_isfinite(__d
))
46 __a
= crt_copysignl(crt_isinf(__a
) ? 1 : 0, __a
);
47 __b
= crt_copysignl(crt_isinf(__b
) ? 1 : 0, __b
);
48 __real__ z
= CRT_INFINITY
* (__a
* __c
+ __b
* __d
);
49 __imag__ z
= CRT_INFINITY
* (__b
* __c
- __a
* __d
);
51 else if (crt_isinf(__logbw
) && __logbw
> 0 &&
52 crt_isfinite(__a
) && crt_isfinite(__b
))
54 __c
= crt_copysignl(crt_isinf(__c
) ? 1 : 0, __c
);
55 __d
= crt_copysignl(crt_isinf(__d
) ? 1 : 0, __d
);
56 __real__ z
= 0 * (__a
* __c
+ __b
* __d
);
57 __imag__ z
= 0 * (__b
* __c
- __a
* __d
);