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