/* ===-- multc3.c - Implement __multc3 -------------------------------------===
 *
 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 * See https://llvm.org/LICENSE.txt for license information.
 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 *
 * ===----------------------------------------------------------------------===
 *
 * This file implements __multc3 for the compiler_rt library.
 *
 * ===----------------------------------------------------------------------===
 */

#include "int_lib.h"
#include "int_math.h"

/* Returns: the product of a + ib and c + id */

COMPILER_RT_ABI long double _Complex
__multc3(long double a, long double b, long double c, long double d)
{
    long double ac = a * c;
    long double bd = b * d;
    long double ad = a * d;
    long double bc = b * c;
    long double _Complex z;
    __real__ z = ac - bd;
    __imag__ z = ad + bc;
    if (crt_isnan(__real__ z) && crt_isnan(__imag__ z)) {
        int recalc = 0;
        if (crt_isinf(a) || crt_isinf(b)) {
            a = crt_copysignl(crt_isinf(a) ? 1 : 0, a);
            b = crt_copysignl(crt_isinf(b) ? 1 : 0, b);
            if (crt_isnan(c))
                c = crt_copysignl(0, c);
            if (crt_isnan(d))
                d = crt_copysignl(0, d);
            recalc = 1;
        }
        if (crt_isinf(c) || crt_isinf(d)) {
            c = crt_copysignl(crt_isinf(c) ? 1 : 0, c);
            d = crt_copysignl(crt_isinf(d) ? 1 : 0, d);
            if (crt_isnan(a))
                a = crt_copysignl(0, a);
            if (crt_isnan(b))
                b = crt_copysignl(0, b);
            recalc = 1;
        }
        if (!recalc && (crt_isinf(ac) || crt_isinf(bd) ||
                          crt_isinf(ad) || crt_isinf(bc))) {
            if (crt_isnan(a))
                a = crt_copysignl(0, a);
            if (crt_isnan(b))
                b = crt_copysignl(0, b);
            if (crt_isnan(c))
                c = crt_copysignl(0, c);
            if (crt_isnan(d))
                d = crt_copysignl(0, d);
            recalc = 1;
        }
        if (recalc) {
            __real__ z = CRT_INFINITY * (a * c - b * d);
            __imag__ z = CRT_INFINITY * (a * d + b * c);
        }
    }
    return z;
}
