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