11.1Sjoerg//===-- divxc3_test.c - Test __divxc3 -------------------------------------===//
21.1Sjoerg//
31.1Sjoerg//                     The LLVM Compiler Infrastructure
41.1Sjoerg//
51.1Sjoerg// This file is dual licensed under the MIT and the University of Illinois Open
61.1Sjoerg// Source Licenses. See LICENSE.TXT for details.
71.1Sjoerg//
81.1Sjoerg//===----------------------------------------------------------------------===//
91.1Sjoerg//
101.1Sjoerg// This file tests __divxc3 for the compiler_rt library.
111.1Sjoerg//
121.1Sjoerg//===----------------------------------------------------------------------===//
131.1Sjoerg
141.1Sjoerg#if !_ARCH_PPC
151.1Sjoerg
161.1Sjoerg#include "int_lib.h"
171.1Sjoerg#include <math.h>
181.1Sjoerg#include <complex.h>
191.1Sjoerg#include <stdio.h>
201.1Sjoerg
211.1Sjoerg// Returns: the quotient of (a + ib) / (c + id)
221.1Sjoerg
231.1Sjoerglong double _Complex
241.1Sjoerg__divxc3(long double __a, long double __b, long double __c, long double __d);
251.1Sjoerg
261.1Sjoergenum {zero, non_zero, inf, NaN, non_zero_nan};
271.1Sjoerg
281.1Sjoergint
291.1Sjoergclassify(long double _Complex x)
301.1Sjoerg{
311.1Sjoerg    if (x == 0)
321.1Sjoerg        return zero;
331.1Sjoerg    if (isinf(creall(x)) || isinf(cimagl(x)))
341.1Sjoerg        return inf;
351.1Sjoerg    if (isnan(creall(x)) && isnan(cimagl(x)))
361.1Sjoerg        return NaN;
371.1Sjoerg    if (isnan(creall(x)))
381.1Sjoerg    {
391.1Sjoerg        if (cimagl(x) == 0)
401.1Sjoerg            return NaN;
411.1Sjoerg        return non_zero_nan;
421.1Sjoerg    }
431.1Sjoerg    if (isnan(cimagl(x)))
441.1Sjoerg    {
451.1Sjoerg        if (creall(x) == 0)
461.1Sjoerg            return NaN;
471.1Sjoerg        return non_zero_nan;
481.1Sjoerg    }
491.1Sjoerg    return non_zero;
501.1Sjoerg}
511.1Sjoerg
521.1Sjoergint test__divxc3(long double a, long double b, long double c, long double d)
531.1Sjoerg{
541.1Sjoerg    long double _Complex r = __divxc3(a, b, c, d);
551.1Sjoerg//     printf("test__divxc3(%Lf, %Lf, %Lf, %Lf) = %Lf + I%Lf\n",
561.1Sjoerg//             a, b, c, d, creall(r), cimagl(r));
571.1Sjoerg	long double _Complex dividend;
581.1Sjoerg	long double _Complex divisor;
591.1Sjoerg
601.1Sjoerg	__real__ dividend = a;
611.1Sjoerg	__imag__ dividend = b;
621.1Sjoerg	__real__ divisor = c;
631.1Sjoerg	__imag__ divisor = d;
641.1Sjoerg
651.1Sjoerg    switch (classify(dividend))
661.1Sjoerg    {
671.1Sjoerg    case zero:
681.1Sjoerg        switch (classify(divisor))
691.1Sjoerg        {
701.1Sjoerg        case zero:
711.1Sjoerg            if (classify(r) != NaN)
721.1Sjoerg                return 1;
731.1Sjoerg            break;
741.1Sjoerg        case non_zero:
751.1Sjoerg            if (classify(r) != zero)
761.1Sjoerg                return 1;
771.1Sjoerg            break;
781.1Sjoerg        case inf:
791.1Sjoerg            if (classify(r) != zero)
801.1Sjoerg                return 1;
811.1Sjoerg            break;
821.1Sjoerg        case NaN:
831.1Sjoerg            if (classify(r) != NaN)
841.1Sjoerg                return 1;
851.1Sjoerg            break;
861.1Sjoerg        case non_zero_nan:
871.1Sjoerg            if (classify(r) != NaN)
881.1Sjoerg                return 1;
891.1Sjoerg            break;
901.1Sjoerg        }
911.1Sjoerg        break;
921.1Sjoerg    case non_zero:
931.1Sjoerg        switch (classify(divisor))
941.1Sjoerg        {
951.1Sjoerg        case zero:
961.1Sjoerg            if (classify(r) != inf)
971.1Sjoerg                return 1;
981.1Sjoerg            break;
991.1Sjoerg        case non_zero:
1001.1Sjoerg            if (classify(r) != non_zero)
1011.1Sjoerg                return 1;
1021.1Sjoerg            {
1031.1Sjoerg            long double _Complex z = (a * c + b * d) / (c * c + d * d)
1041.1Sjoerg                                   + (b * c - a * d) / (c * c + d * d) * _Complex_I;
1051.1Sjoerg            if (cabs((r - z)/r) > 1.e-6)
1061.1Sjoerg                return 1;
1071.1Sjoerg            }
1081.1Sjoerg            break;
1091.1Sjoerg        case inf:
1101.1Sjoerg            if (classify(r) != zero)
1111.1Sjoerg                return 1;
1121.1Sjoerg            break;
1131.1Sjoerg        case NaN:
1141.1Sjoerg            if (classify(r) != NaN)
1151.1Sjoerg                return 1;
1161.1Sjoerg            break;
1171.1Sjoerg        case non_zero_nan:
1181.1Sjoerg            if (classify(r) != NaN)
1191.1Sjoerg                return 1;
1201.1Sjoerg            break;
1211.1Sjoerg        }
1221.1Sjoerg        break;
1231.1Sjoerg    case inf:
1241.1Sjoerg        switch (classify(divisor))
1251.1Sjoerg        {
1261.1Sjoerg        case zero:
1271.1Sjoerg            if (classify(r) != inf)
1281.1Sjoerg                return 1;
1291.1Sjoerg            break;
1301.1Sjoerg        case non_zero:
1311.1Sjoerg            if (classify(r) != inf)
1321.1Sjoerg                return 1;
1331.1Sjoerg            break;
1341.1Sjoerg        case inf:
1351.1Sjoerg            if (classify(r) != NaN)
1361.1Sjoerg                return 1;
1371.1Sjoerg            break;
1381.1Sjoerg        case NaN:
1391.1Sjoerg            if (classify(r) != NaN)
1401.1Sjoerg                return 1;
1411.1Sjoerg            break;
1421.1Sjoerg        case non_zero_nan:
1431.1Sjoerg            if (classify(r) != NaN)
1441.1Sjoerg                return 1;
1451.1Sjoerg            break;
1461.1Sjoerg        }
1471.1Sjoerg        break;
1481.1Sjoerg    case NaN:
1491.1Sjoerg        switch (classify(divisor))
1501.1Sjoerg        {
1511.1Sjoerg        case zero:
1521.1Sjoerg            if (classify(r) != NaN)
1531.1Sjoerg                return 1;
1541.1Sjoerg            break;
1551.1Sjoerg        case non_zero:
1561.1Sjoerg            if (classify(r) != NaN)
1571.1Sjoerg                return 1;
1581.1Sjoerg            break;
1591.1Sjoerg        case inf:
1601.1Sjoerg            if (classify(r) != NaN)
1611.1Sjoerg                return 1;
1621.1Sjoerg            break;
1631.1Sjoerg        case NaN:
1641.1Sjoerg            if (classify(r) != NaN)
1651.1Sjoerg                return 1;
1661.1Sjoerg            break;
1671.1Sjoerg        case non_zero_nan:
1681.1Sjoerg            if (classify(r) != NaN)
1691.1Sjoerg                return 1;
1701.1Sjoerg            break;
1711.1Sjoerg        }
1721.1Sjoerg        break;
1731.1Sjoerg    case non_zero_nan:
1741.1Sjoerg        switch (classify(divisor))
1751.1Sjoerg        {
1761.1Sjoerg        case zero:
1771.1Sjoerg            if (classify(r) != inf)
1781.1Sjoerg                return 1;
1791.1Sjoerg            break;
1801.1Sjoerg        case non_zero:
1811.1Sjoerg            if (classify(r) != NaN)
1821.1Sjoerg                return 1;
1831.1Sjoerg            break;
1841.1Sjoerg        case inf:
1851.1Sjoerg            if (classify(r) != NaN)
1861.1Sjoerg                return 1;
1871.1Sjoerg            break;
1881.1Sjoerg        case NaN:
1891.1Sjoerg            if (classify(r) != NaN)
1901.1Sjoerg                return 1;
1911.1Sjoerg            break;
1921.1Sjoerg        case non_zero_nan:
1931.1Sjoerg            if (classify(r) != NaN)
1941.1Sjoerg                return 1;
1951.1Sjoerg            break;
1961.1Sjoerg        }
1971.1Sjoerg        break;
1981.1Sjoerg    }
1991.1Sjoerg
2001.1Sjoerg    return 0;
2011.1Sjoerg}
2021.1Sjoerg
2031.1Sjoerglong double x[][2] =
2041.1Sjoerg{
2051.1Sjoerg    { 1.e-6,  1.e-6},
2061.1Sjoerg    {-1.e-6,  1.e-6},
2071.1Sjoerg    {-1.e-6, -1.e-6},
2081.1Sjoerg    { 1.e-6, -1.e-6},
2091.1Sjoerg
2101.1Sjoerg    { 1.e+6,  1.e-6},
2111.1Sjoerg    {-1.e+6,  1.e-6},
2121.1Sjoerg    {-1.e+6, -1.e-6},
2131.1Sjoerg    { 1.e+6, -1.e-6},
2141.1Sjoerg
2151.1Sjoerg    { 1.e-6,  1.e+6},
2161.1Sjoerg    {-1.e-6,  1.e+6},
2171.1Sjoerg    {-1.e-6, -1.e+6},
2181.1Sjoerg    { 1.e-6, -1.e+6},
2191.1Sjoerg
2201.1Sjoerg    { 1.e+6,  1.e+6},
2211.1Sjoerg    {-1.e+6,  1.e+6},
2221.1Sjoerg    {-1.e+6, -1.e+6},
2231.1Sjoerg    { 1.e+6, -1.e+6},
2241.1Sjoerg
2251.1Sjoerg    {NAN, NAN},
2261.1Sjoerg    {-INFINITY, NAN},
2271.1Sjoerg    {-2, NAN},
2281.1Sjoerg    {-1, NAN},
2291.1Sjoerg    {-0.5, NAN},
2301.1Sjoerg    {-0., NAN},
2311.1Sjoerg    {+0., NAN},
2321.1Sjoerg    {0.5, NAN},
2331.1Sjoerg    {1, NAN},
2341.1Sjoerg    {2, NAN},
2351.1Sjoerg    {INFINITY, NAN},
2361.1Sjoerg
2371.1Sjoerg    {NAN, -INFINITY},
2381.1Sjoerg    {-INFINITY, -INFINITY},
2391.1Sjoerg    {-2, -INFINITY},
2401.1Sjoerg    {-1, -INFINITY},
2411.1Sjoerg    {-0.5, -INFINITY},
2421.1Sjoerg    {-0., -INFINITY},
2431.1Sjoerg    {+0., -INFINITY},
2441.1Sjoerg    {0.5, -INFINITY},
2451.1Sjoerg    {1, -INFINITY},
2461.1Sjoerg    {2, -INFINITY},
2471.1Sjoerg    {INFINITY, -INFINITY},
2481.1Sjoerg
2491.1Sjoerg    {NAN, -2},
2501.1Sjoerg    {-INFINITY, -2},
2511.1Sjoerg    {-2, -2},
2521.1Sjoerg    {-1, -2},
2531.1Sjoerg    {-0.5, -2},
2541.1Sjoerg    {-0., -2},
2551.1Sjoerg    {+0., -2},
2561.1Sjoerg    {0.5, -2},
2571.1Sjoerg    {1, -2},
2581.1Sjoerg    {2, -2},
2591.1Sjoerg    {INFINITY, -2},
2601.1Sjoerg
2611.1Sjoerg    {NAN, -1},
2621.1Sjoerg    {-INFINITY, -1},
2631.1Sjoerg    {-2, -1},
2641.1Sjoerg    {-1, -1},
2651.1Sjoerg    {-0.5, -1},
2661.1Sjoerg    {-0., -1},
2671.1Sjoerg    {+0., -1},
2681.1Sjoerg    {0.5, -1},
2691.1Sjoerg    {1, -1},
2701.1Sjoerg    {2, -1},
2711.1Sjoerg    {INFINITY, -1},
2721.1Sjoerg
2731.1Sjoerg    {NAN, -0.5},
2741.1Sjoerg    {-INFINITY, -0.5},
2751.1Sjoerg    {-2, -0.5},
2761.1Sjoerg    {-1, -0.5},
2771.1Sjoerg    {-0.5, -0.5},
2781.1Sjoerg    {-0., -0.5},
2791.1Sjoerg    {+0., -0.5},
2801.1Sjoerg    {0.5, -0.5},
2811.1Sjoerg    {1, -0.5},
2821.1Sjoerg    {2, -0.5},
2831.1Sjoerg    {INFINITY, -0.5},
2841.1Sjoerg
2851.1Sjoerg    {NAN, -0.},
2861.1Sjoerg    {-INFINITY, -0.},
2871.1Sjoerg    {-2, -0.},
2881.1Sjoerg    {-1, -0.},
2891.1Sjoerg    {-0.5, -0.},
2901.1Sjoerg    {-0., -0.},
2911.1Sjoerg    {+0., -0.},
2921.1Sjoerg    {0.5, -0.},
2931.1Sjoerg    {1, -0.},
2941.1Sjoerg    {2, -0.},
2951.1Sjoerg    {INFINITY, -0.},
2961.1Sjoerg
2971.1Sjoerg    {NAN, 0.},
2981.1Sjoerg    {-INFINITY, 0.},
2991.1Sjoerg    {-2, 0.},
3001.1Sjoerg    {-1, 0.},
3011.1Sjoerg    {-0.5, 0.},
3021.1Sjoerg    {-0., 0.},
3031.1Sjoerg    {+0., 0.},
3041.1Sjoerg    {0.5, 0.},
3051.1Sjoerg    {1, 0.},
3061.1Sjoerg    {2, 0.},
3071.1Sjoerg    {INFINITY, 0.},
3081.1Sjoerg
3091.1Sjoerg    {NAN, 0.5},
3101.1Sjoerg    {-INFINITY, 0.5},
3111.1Sjoerg    {-2, 0.5},
3121.1Sjoerg    {-1, 0.5},
3131.1Sjoerg    {-0.5, 0.5},
3141.1Sjoerg    {-0., 0.5},
3151.1Sjoerg    {+0., 0.5},
3161.1Sjoerg    {0.5, 0.5},
3171.1Sjoerg    {1, 0.5},
3181.1Sjoerg    {2, 0.5},
3191.1Sjoerg    {INFINITY, 0.5},
3201.1Sjoerg
3211.1Sjoerg    {NAN, 1},
3221.1Sjoerg    {-INFINITY, 1},
3231.1Sjoerg    {-2, 1},
3241.1Sjoerg    {-1, 1},
3251.1Sjoerg    {-0.5, 1},
3261.1Sjoerg    {-0., 1},
3271.1Sjoerg    {+0., 1},
3281.1Sjoerg    {0.5, 1},
3291.1Sjoerg    {1, 1},
3301.1Sjoerg    {2, 1},
3311.1Sjoerg    {INFINITY, 1},
3321.1Sjoerg
3331.1Sjoerg    {NAN, 2},
3341.1Sjoerg    {-INFINITY, 2},
3351.1Sjoerg    {-2, 2},
3361.1Sjoerg    {-1, 2},
3371.1Sjoerg    {-0.5, 2},
3381.1Sjoerg    {-0., 2},
3391.1Sjoerg    {+0., 2},
3401.1Sjoerg    {0.5, 2},
3411.1Sjoerg    {1, 2},
3421.1Sjoerg    {2, 2},
3431.1Sjoerg    {INFINITY, 2},
3441.1Sjoerg
3451.1Sjoerg    {NAN, INFINITY},
3461.1Sjoerg    {-INFINITY, INFINITY},
3471.1Sjoerg    {-2, INFINITY},
3481.1Sjoerg    {-1, INFINITY},
3491.1Sjoerg    {-0.5, INFINITY},
3501.1Sjoerg    {-0., INFINITY},
3511.1Sjoerg    {+0., INFINITY},
3521.1Sjoerg    {0.5, INFINITY},
3531.1Sjoerg    {1, INFINITY},
3541.1Sjoerg    {2, INFINITY},
3551.1Sjoerg    {INFINITY, INFINITY}
3561.1Sjoerg
3571.1Sjoerg};
3581.1Sjoerg
3591.1Sjoerg#endif
3601.1Sjoerg
3611.1Sjoergint main()
3621.1Sjoerg{
3631.1Sjoerg#if !_ARCH_PPC
3641.1Sjoerg    const unsigned N = sizeof(x) / sizeof(x[0]);
3651.1Sjoerg    unsigned i, j;
3661.1Sjoerg    for (i = 0; i < N; ++i)
3671.1Sjoerg    {
3681.1Sjoerg        for (j = 0; j < N; ++j)
3691.1Sjoerg        {
3701.1Sjoerg            if (test__divxc3(x[i][0], x[i][1], x[j][0], x[j][1]))
3711.1Sjoerg                return 1;
3721.1Sjoerg        }
3731.1Sjoerg    }
3741.1Sjoerg
3751.1Sjoerg#else
3761.1Sjoerg    printf("skipped\n");
3771.1Sjoerg#endif
3781.1Sjoerg    return 0;
3791.1Sjoerg}
380