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