1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623
|
.file "libm_lgamma.s"
// Copyright (c) 2002 - 2005, Intel Corporation
// All rights reserved.
//
// Contributed 2002 by the Intel Numerics Group, Intel Corporation
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// * The name of Intel Corporation may not be used to endorse or promote
// products derived from this software without specific prior written
// permission.
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,INCLUDING,BUT NOT
// LIMITED TO,THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR ITS
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT,INDIRECT,INCIDENTAL,SPECIAL,
// EXEMPLARY,OR CONSEQUENTIAL DAMAGES (INCLUDING,BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,DATA,OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY,WHETHER IN CONTRACT,STRICT LIABILITY OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE,EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Intel Corporation is the author of this code,and requests that all
// problem reports or change requests be submitted to it directly at
// http://www.intel.com/software/products/opensource/libraries/num.htm.
//
//*********************************************************************
//
// History:
// 01/10/02 Initial version
// 01/25/02 Corrected error tag numbers
// 02/04/02 Added support of SIGN(GAMMA(x)) calculation
// 05/20/02 Cleaned up namespace and sf0 syntax
// 09/15/02 Fixed bug on the branch lgamma_negrecursion
// 10/21/02 Now it returns SIGN(GAMMA(x))=-1 for negative zero
// 02/10/03 Reordered header: .section, .global, .proc, .align
// 07/22/03 Reformatted some data tables
// 03/31/05 Reformatted delimiters between data tables
//
//*********************************************************************
//
//*********************************************************************
//
// Function: __libm_lgamma(double x, int* signgam, int szsigngam)
// computes the principle value of the logarithm of the GAMMA function
// of x. Signum of GAMMA(x) is stored to memory starting at the address
// specified by the signgam.
//
//*********************************************************************
//
// Resources Used:
//
// Floating-Point Registers: f6-f15
// f32-f122
//
// General Purpose Registers:
// r8-r11
// r14-r31
// r32-r36
// r37-r40 (Used to pass arguments to error handling routine)
//
// Predicate Registers: p6-p15
//
//*********************************************************************
//
// IEEE Special Conditions:
//
// __libm_lgamma(+inf) = +inf
// __libm_lgamma(-inf) = QNaN
// __libm_lgamma(+/-0) = +inf
// __libm_lgamma(x<0, x - integer) = +inf
// __libm_lgamma(SNaN) = QNaN
// __libm_lgamma(QNaN) = QNaN
//
//*********************************************************************
//
// Overview
//
// The method consists of three cases.
//
// If 512 <= x < OVERFLOW_BOUNDARY use case lgamma_pstirling;
// else if 1 < x < 512 use case lgamma_regular;
// else if -17 < x < 1 use case lgamma_negrecursion;
// else if -512 < x < -17 use case lgamma_negpoly;
// else if x < -512 use case lgamma_negstirling;
// else if x is close to negative
// roots of ln(GAMMA(x)) use case lgamma_negroots;
//
//
// Case 512 <= x < OVERFLOW_BOUNDARY
// ---------------------------------
// Here we use algorithm based on the Stirling formula:
// ln(GAMMA(x)) = ln(sqrt(2*Pi)) + (x-0.5)ln(x) - x + (W2 + W4/x^2)/x
//
// Case 1 < x < 512
// ----------------
// To calculate GAMMA(x) on this interval we use polynomial approximation
// on following intervals [0.875; 1.25), [1.25; 1.75), [1.75, 2.25),
// [2.25; 4), [2^i; 2^(i+1)), i=2..8
//
// Following variants of approximation and argument reduction are used:
// 1. [0.875; 1.25)
// ln(GAMMA(x)) ~ (x-1.0)*P17(x-1.0)
//
// 2. [1.25; 1.75)
// ln(GAMMA(x)) ~ (x-LocalMinimun)*P17(x-LocalMinimun)
//
// 3. [1.75, 2.25)
// ln(GAMMA(x)) ~ (x-2.0)*P17(x-2.0)
//
// 4. [2.25; 4)
// ln(GAMMA(x)) ~ P22(x)
//
// 5. [2^i; 2^(i+1)), i=2..8
// ln(GAMMA(x)) ~ P22((x-2^i)/2^i)
//
// Case -17 < x < 1
// ----------------
// Here we use the recursive formula:
// ln(GAMMA(x)) = ln(GAMMA(x+1)) - ln(x)
//
// Using this formula we reduce argument to base interval [1.0; 2.0]
//
// Case -512 < x < -17
// --------------------
// Here we use the formula:
// ln(GAMMA(-x)) = ln(Pi/(x*GAMMA(x)*sin(Pi*x))) =
// = -ln(x) - ln((GAMMA(x)) - ln(sin(Pi*r)/(Pi*r)) - ln(|r|)
// where r = x - rounded_to_nearest(x), i.e |r| <= 0.5 and
// ln(sin(Pi*r)/(Pi*r)) is approximated by 14-degree polynomial of r^2
//
//
// Case x < -512
// -------------
// Here we use algorithm based on the Stirling formula:
// ln(GAMMA(-x)) = -ln(sqrt(2*Pi)) + (-x-0.5)ln(x) + x - (W2 + W4/x^2)/x -
// - ln(sin(Pi*r)/(Pi*r)) - ln(|r|)
// where r = x - rounded_to_nearest(x).
//
// Neighbourhoods of negative roots
// --------------------------------
// Here we use polynomial approximation
// ln(GAMMA(x-x0)) = ln(GAMMA(x0)) + (x-x0)*P14(x-x0),
// where x0 is a root of ln(GAMMA(x)) rounded to nearest double
// precision number.
//
//*********************************************************************
FR_X = f10
FR_Y = f1 // __libm_lgamma is single argument function
FR_RESULT = f8
FR_B11 = f6
FR_B10 = f7
FR_int_N = f9
FR_N = f10
FR_P5 = f11
FR_P4 = f12
FR_P3 = f13
FR_P2 = f14
FR_NormX = f15
FR_Ln2 = f32
FR_C01 = f33
FR_A17 = f33
FR_C00 = f34
FR_Xp2 = f34
FR_A00 = f34
FR_A16 = f34
FR_C11 = f35
FR_A15 = f35
FR_C10 = f36
FR_Xp3 = f36
FR_A14 = f36
FR_B1 = f36
FR_C21 = f37
FR_A13 = f37
FR_PR01 = f37
FR_C20 = f38
FR_Xp6 = f38
FR_A12 = f38
FR_C31 = f39
FR_Xp7 = f39
FR_B0 = f39
FR_A11 = f39
FR_C30 = f40
FR_Xp8 = f40
FR_A10 = f40
FR_PR00 = f40
FR_C41 = f41
FR_Xp9 = f41
FR_A9 = f41
FR_PR11 = f41
FR_C40 = f42
FR_A8 = f42
FR_C51 = f43
FR_Xp11 = f43
FR_A7 = f43
FR_C50 = f44
FR_C = f44
FR_Xp12 = f44
FR_A6 = f44
FR_Xm2 = f45
FR_Xp13 = f45
FR_A5 = f45
FR_PR10 = f45
FR_C61 = f46
FR_Xp14 = f46
FR_A4 = f46
FR_PR21 = f46
FR_C60 = f47
FR_Xp15 = f47
FR_A3 = f47
FR_PR20 = f47
FR_C71 = f48
FR_Xp16 = f48
FR_A2 = f48
FR_PR31 = f48
FR_C70 = f49
FR_Xp17 = f49
FR_A1 = f49
FR_PR30 = f49
FR_C81 = f50
FR_B17 = f50
FR_A0 = f50
FR_C80 = f51
FR_B16 = f51
FR_C91 = f52
FR_B15 = f52
FR_C90 = f53
FR_B14 = f53
FR_CA1 = f54
FR_B13 = f54
FR_CA0 = f55
FR_B12 = f55
FR_CN = f56
FR_Qlo = f56
FR_PRN = f56
FR_B7 = f57
FR_B6 = f58
FR_Qhi = f59
FR_x = f60
FR_x2 = f61
FR_TpNxLn2 = f62
FR_W2 = f63
FR_x4 = f64
FR_r4 = f64
FR_x8 = f65
FR_r8 = f65
FR_r05 = f66
FR_Xm05 = f66
FR_B5 = f66
FR_LnSqrt2Pi = f67
FR_B4 = f67
FR_InvX = f68
FR_B3 = f68
FR_InvX2 = f69
FR_B2 = f69
FR_W4 = f70
FR_OvfBound = f71
FR_05 = f72
FR_LocalMin = f73
FR_tmp = f73
FR_LnX = f74
FR_Xf = f75
FR_InvXf = f76
FR_rf = f77
FR_rf2 = f78
FR_P54f = f79
FR_P32f = f80
FR_rf3 = f81
FR_P10f = f82
FR_TpNxLn2f = f83
FR_Nf = f84
FR_LnXf = f85
FR_int_Nf = f86
FR_Tf = f87
FR_Xf2 = f88
FR_Xp10 = f89
FR_w3 = f90
FR_S28 = f90
FR_w2 = f91
FR_S26 = f91
FR_w6 = f92
FR_S24 = f92
FR_w4 = f93
FR_S22 = f93
FR_w = f94
FR_S20 = f94
FR_Q8 = f95
FR_S18 = f95
FR_Q7 = f96
FR_S16 = f96
FR_Q4 = f97
FR_S14 = f97
FR_Q3 = f98
FR_S12 = f98
FR_Q6 = f99
FR_S10 = f99
FR_Q5 = f100
FR_S8 = f100
FR_Q2 = f101
FR_S6 = f101
FR_Root = f101
FR_S4 = f102
FR_Q1 = f102
FR_S2 = f103
FR_Xp1 = f104
FR_Xf4 = f105
FR_Xf8 = f106
FR_Xfr = f107
FR_Xf6 = f108
FR_Ntrunc = f109
FR_B9 = f110
FR_2 = f110
FR_B8 = f111
FR_3 = f111
FR_5 = f112
FR_Xp4 = f113
FR_Xp5 = f114
FR_P54 = f115
FR_P32 = f116
FR_P10 = f117
FR_r = f118
FR_r2 = f119
FR_r3 = f120
FR_T = f121
FR_int_Ntrunc = f122
//===================================
GR_TAG = r8
GR_ExpMask = r8
GR_ExpBias = r9
GR_ad_Roots = r9
GR_Expf = r10
GR_Arg = r10
GR_SignExp = r11
GR_ArgXfr = r11
GR_Exp = r14
GR_Arg125 = r14
GR_RootInd = r14
GR_ArgAsIs = r15
GR_Arg175 = r15
GR_Sig = r16
GR_Ind = r17
GR_ad_Dx = r17
GR_ad_1 = r18
GR_SignExp_w = r19
GR_2_25 = r19
GR_Arg025 = r19
GR_Arg15 = r19
GR_Arg17 = r19
GR_Exp_w = r19//21
GR_ad_2 = r20
GR_2xDx = r21
GR_SignOfGamma = r21
GR_fff9 = r22
GR_Offs = r22
GR_ad_Co7 = r23
GR_Arg075 = r23
GR_Arg0875 = r23
GR_ad_T = r24
GR_ad_Root = r24
GR_Ind = r24
GR_ad_Co = r25
GR_ad_Ce = r26
GR_ad_Ce7 = r27
GR_Arg05 = r27
GR_Offs7 = r28
GR_ArgXfrAsIs = r28
GR_ExpOf2 = r29
GR_ad_LnT = r29
GR_Dx = r29
GR_ExpOf256 = r30
GR_0x30033 = r30
GR_Root = r30
GR_PseudoRoot = r30
GR_ad_Data = r31
GR_ad_SignGam = r31
GR_SAVE_B0 = r33
GR_SAVE_PFS = r34
GR_SAVE_GP = r35
GR_SAVE_SP = r36
GR_Parameter_X = r37
GR_Parameter_Y = r38
GR_Parameter_RESULT = r39
GR_Parameter_TAG = r40
// Data tables
//==============================================================
RODATA
.align 16
LOCAL_OBJECT_START(lgamma_data)
// polynomial approximation of ln(GAMMA(x)), 2.25 <= x < 512
// [2.25; 4)
data8 0xF888E8D7892718A2,0xC001 // C01
data8 0xF62F273BA12A4639,0x3FFD // C11
data8 0xA93AC50A37EC8D38,0xBFFC // C21
data8 0xB4CC43D2C161E057,0xBFFF // C31
data8 0xC6AC672F0C1392C7,0xC000 // C41
data8 0xA292B9AE3276942E,0xC001 // C51
data8 0xE554E4CCCA6C7B7B,0xC001 // C61
data8 0x92F0F55FBC87F860,0xC002 // C71
data8 0xAF60D0112843F6C1,0xC002 // C81
data8 0xC5956500FA3D92E7,0xC002 // C91
data8 0xD3B22CCBD8587750,0xC002 // CA1
data8 0xD888B6CF34159B54,0x4001 // C00
data8 0xBCB79C8329FD9F44,0x3FFE // C10
data8 0xCB8896FAD69C455D,0x4000 // C20
data8 0xE510A424639EBF5E,0x4001 // C30
data8 0xC65ED41B097486B3,0x4002 // C40
// [4; 8)
data8 0x9F1F3C822D03080E,0xC001 // C01
data8 0x941CACFA9C0FA8A6,0xC001 // C11
data8 0xFE34336391D99CB7,0xC000 // C21
data8 0xC40BAEAA165F81A1,0xC000 // C31
data8 0xFE3AE166E9B4DE8F,0xBFFF // C41
data8 0xD744F91AF7DAF873,0xBFFE // C51
data8 0x87871851E9C32D02,0x3FFD // C61
data8 0x9C93C03C502E808F,0x3FFF // C71
data8 0xF78BED07501D6A8E,0x3FFF // C81
data8 0x92FE41BA8BEADF70,0x4000 // C91
data8 0xA021878E1903A2C6,0x3FFF // CA1
data8 0xC85EFAC379FAFEE2,0x4001 // C00
data8 0xC10D7AAB7CEC7FF2,0x4001 // C10
data8 0xB3537BDF603E454C,0x4001 // C20
data8 0xA0D44E3D5BBE44C4,0x4001 // C30
data8 0x8B9C229B6241E7B3,0x4001 // C40
// [8; 16)
data8 0xD16AB33AEC220DF6,0x3FFF // C01
data8 0x987483646E150BCD,0x4000 // C11
data8 0x80C10A24C863999B,0x4000 // C21
data8 0xA39A8EB6F8AACE75,0x3FFF // C31
data8 0x93E04A1379BEC764,0x3FFD // C41
data8 0xD9F59C4BD3A69BD1,0xBFFE // C51
data8 0x82094EC891179B1A,0xC000 // C61
data8 0xC90CFE3A24F70659,0xC000 // C71
data8 0x827984EA7C155184,0xC001 // C81
data8 0x981BFDF79D1E0D80,0xC001 // C91
data8 0xA37209A8B97D230D,0xC001 // CA1
data8 0xAA1989737D6BA66D,0x3FFE // C00
data8 0xDBC013A351630AF8,0x3FFF // C10
data8 0x8B8D47698299389D,0x4000 // C20
data8 0xACCDD1315DE06EB0,0x4000 // C30
data8 0xD3414A5AC81BBB2D,0x4000 // C40
// [16; 32)
data8 0xECB2B0BE75C5F995,0x3FFF // C01
data8 0x9DD28BD6DBC96500,0x4000 // C11
data8 0x8521431B99C6244F,0x4000 // C21
data8 0xA95F92612B8413C3,0x3FFF // C31
data8 0x9C76E643B22D9544,0x3FFD // C41
data8 0xDD90EA99417C8038,0xBFFE // C51
data8 0x84EA6B6D32E5F906,0xC000 // C61
data8 0xCDBFE499E05AA622,0xC000 // C71
data8 0x8594A7DE35427100,0xC001 // C81
data8 0x9BC1CB2C10DC702F,0xC001 // C91
data8 0xA7602268762666B0,0xC001 // CA1
data8 0xDA082BCC6BDB8F7B,0x3FFE // C00
data8 0xEEBFE1C99322B85E,0x3FFF // C10
data8 0x96FED4C785361946,0x4000 // C20
data8 0xB9E3A7207C16B2FE,0x4000 // C30
data8 0xE1E8170CED48E2C7,0x4000 // C40
// [32; 64)
data8 0xFD481EB9AEDD53E7,0x3FFF // C01
data8 0xA216FB66AC8C53E1,0x4000 // C11
data8 0x885FF935787553BA,0x4000 // C21
data8 0xAD471CD89A313327,0x3FFF // C31
data8 0x9FF13FBA139D21E0,0x3FFD // C41
data8 0xE25E1663A6EE0266,0xBFFE // C51
data8 0x87BE51DD5D262FA2,0xC000 // C61
data8 0xD211A9D4CCE55696,0xC000 // C71
data8 0x885BEFC29FDED3C9,0xC001 // C81
data8 0x9EFA48E6367A67F6,0xC001 // C91
data8 0xAAD3978FC0791297,0xC001 // CA1
data8 0xF96D210DF37A0AEA,0x3FFE // C00
data8 0xFE11DC6783917C82,0x3FFF // C10
data8 0x9FFCD928291B7DDE,0x4000 // C20
data8 0xC4518F4A80E09AE1,0x4000 // C30
data8 0xEDDFE9E0FD297C63,0x4000 // C40
// [64; 128)
data8 0x840E2E62609B0AD3,0x4000 // C01
data8 0xA5275A0DD0D3DDF8,0x4000 // C11
data8 0x8AADC6ABFC441731,0x4000 // C21
data8 0xB041C6696BE90E50,0x3FFF // C31
data8 0xA4A8C9153F4B037E,0x3FFD // C41
data8 0xE3C6A461A7B86736,0xBFFE // C51
data8 0x89047681C6DE7673,0xC000 // C61
data8 0xD42DF77A480092DF,0xC000 // C71
data8 0x89C25D17F086FB20,0xC001 // C81
data8 0xA09F907D02E34EC7,0xC001 // C91
data8 0xAC998A9CB79805B7,0xC001 // CA1
data8 0x875CC9B69AE964CC,0x3FFF // C00
data8 0x847836BA85DD4C12,0x4000 // C10
data8 0xA5F3CB2B32E74936,0x4000 // C20
data8 0xCAE2197C96CB5A0F,0x4000 // C30
data8 0xF50F7EB60DE5CD09,0x4000 // C40
// [128; 256)
data8 0x87D9065DD1876926,0x4000 // C01
data8 0xA781C28FDAD7CC25,0x4000 // C11
data8 0x8C6A4FCE35A7EC8D,0x4000 // C21
data8 0xB27BA081728354F9,0x3FFF // C31
data8 0xA82FEA7124B0EB2B,0x3FFD // C41
data8 0xE4C996E42ECBF77A,0xBFFE // C51
data8 0x89F1A92C84FA538F,0xC000 // C61
data8 0xD5B6CFF7DB7F6070,0xC000 // C71
data8 0x8AC6B561FAE38B66,0xC001 // C81
data8 0xA1D1505C438D8F46,0xC001 // C91
data8 0xADE2DC1C924FEC81,0xC001 // CA1
data8 0x8EF6CC62A7E0EB5A,0x3FFF // C00
data8 0x88A2FFC0ABCB00C0,0x4000 // C10
data8 0xAA6EA8FCB75B065B,0x4000 // C20
data8 0xCFC4B82B3D5C9363,0x4000 // C30
data8 0xFA60FD85DE861771,0x4000 // C40
// [256; 512)
data8 0x8AAA7CE4ED5C1EFD,0x4000 // C01
data8 0xA9679234FB56F1E1,0x4000 // C11
data8 0x8DCE02287789D841,0x4000 // C21
data8 0xB44328EF30A8DE7E,0x3FFF // C31
data8 0xAB0DC564BFA1AB12,0x3FFD // C41
data8 0xE5882B16FCF2D3CB,0xBFFE // C51
data8 0x8AA7F48993006A86,0xC000 // C61
data8 0xD6E63752D192750D,0xC000 // C71
data8 0x8B90080B17853295,0xC001 // C81
data8 0xA2BDD4253128D1AB,0xC001 // C91
data8 0xAEE1A042F96B8121,0xC001 // CA1
data8 0x94A9C37A42E43BA7,0x3FFF // C00
data8 0x8BFA54E703878F5A,0x4000 // C10
data8 0xADFA426DDF14647B,0x4000 // C20
data8 0xD39C7F7B3958EAF0,0x4000 // C30
data8 0xFE8C3987853C01E3,0x4000 // C40
//
// [2.25; 4)
data8 0x943AF77763601441,0x4003 // C50
data8 0xC8A93F9ECB06E891,0x4003 // C60
data8 0xFC2E5A4AD33DE19D,0x4003 // C70
data8 0x9526B75B38670119,0x4004 // C80
data8 0xA7675879D68B587E,0x4004 // C90
data8 0xB31DFA672D7FB8C0,0x4004 // CA0
data8 0x83A27775D86F9A81,0xBFD7 // CN
// [4; 8)
data8 0xEB8049BA5E79ADA3,0x4000 // C50
data8 0xC20C95EA99037228,0x4000 // C60
data8 0x9D4A8C864053CEB8,0x4000 // C70
data8 0xFC7716544AB0C5C9,0x3FFF // C80
data8 0xC7EB985259EABA5F,0x3FFF // C90
data8 0xC042FB3B4C95096D,0x3FFD // CA0
data8 0xCC2A7F930856177B,0x3FEE // CN
// [8; 16)
data8 0xFE1903679D078C7A,0x4000 // C50
data8 0x957C221AB90171F1,0x4001 // C60
data8 0xAB2C53B2A78F4031,0x4001 // C70
data8 0xBE080AE6063AE387,0x4001 // C80
data8 0xCC019A0311605CB9,0x4001 // C90
data8 0xD3739D85A12C8ADF,0x4001 // CA0
data8 0x81FA4D2B7BD7A82D,0x3FEF // CN
// [16; 32)
data8 0x871F69E2DD221F02,0x4001 // C50
data8 0x9E3EF2D477442A9C,0x4001 // C60
data8 0xB48733582B3C82C5,0x4001 // C70
data8 0xC7DB9B3C25854A2A,0x4001 // C80
data8 0xD628B87975BE898F,0x4001 // C90
data8 0xDDC569C321FF119C,0x4001 // CA0
data8 0xB27B65560DF7ADA7,0x3FEF // CN
// [32; 64)
data8 0x8DE4127349719B22,0x4001 // C50
data8 0xA5C30A7760F5FBB2,0x4001 // C60
data8 0xBCB4096055AA2A4E,0x4001 // C70
data8 0xD08F5F2FB4E7B899,0x4001 // C80
data8 0xDF39ED39DC91F9CF,0x4001 // C90
data8 0xE7063E45322F072E,0x4001 // CA0
data8 0x85A9E11DDDDE67C8,0x3FF0 // CN
// [64; 128)
data8 0x91CA191EB80E8893,0x4001 // C50
data8 0xA9F1D5A55397334A,0x4001 // C60
data8 0xC1222710295094E3,0x4001 // C70
data8 0xD52FFABBA6CBE5C6,0x4001 // C80
data8 0xE3FD9D5282052E1D,0x4001 // C90
data8 0xEBDBE47BB662F3EF,0x4001 // CA0
data8 0xEF889F489D88FD31,0x3FF0 // CN
// [128; 256)
data8 0x94AA029C2286F8D2,0x4001 // C50
data8 0xAD0549E55A72389F,0x4001 // C60
data8 0xC4628899DAF94BA4,0x4001 // C70
data8 0xD89432A4161C72CB,0x4001 // C80
data8 0xE77ABA75E9C38F3A,0x4001 // C90
data8 0xEF65BFFFF71347FF,0x4001 // CA0
data8 0xE2627460064D918D,0x3FF1 // CN
// [256; 512)
data8 0x96E9890D722C2FC1,0x4001 // C50
data8 0xAF6C2236F6A1CEC4,0x4001 // C60
data8 0xC6EBB8C9F987D20D,0x4001 // C70
data8 0xDB38CEFD5EF328CC,0x4001 // C80
data8 0xEA3265DC66C9A0B4,0x4001 // C90
data8 0xF2272D6B368C70B1,0x4001 // CA0
data8 0xDBFF93ECEBCEF1F3,0x3FF2 // CN
//
data8 0x3FDD8B618D5AF8FE // point of local minimum on [1;2]
data8 0x3FE0000000000000 // 0.5
data8 0xBFC5555DA7212371 // P5
data8 0x3FC999A19EEF5826 // P4
data8 0xb17217f7d1cf79ac,0x3ffe // ln(2)
data8 0xEB3F8E4325F5A535,0x3FFE // ln(sqrt(4*arcsin(1)))
//
data8 0xBFCFFFFFFFFEF009 // P3
data8 0x3FD555555554ECB2 // P2
data8 0xBF66C16C16C16C17 // W4=B4/12=-1/360
data8 0x7F5754D9278B51A8 // overflow boundary (first inf result)
data8 0xAAAAAAAAAAAAAAAB,0x3FFB // W2=B2/2=1/12
//
data8 0x3FBC756AC654273B // Q8
data8 0xBFC001A42489AB4D // Q7
data8 0x3FC99999999A169B // Q4
data8 0xBFD00000000019AC // Q3
data8 0x3FC2492479AA0DF8 // Q6
data8 0xBFC5555544986F52 // Q5
data8 0x3FD5555555555555 // Q2
data8 0xBFE0000000000000 // Q1, P1 = -0.5
//
data8 0x80200aaeac44ef38,0x3ff6 // ln(1/frcpa(1+ 0/2^-8))
data8 0xc09090a2c35aa070,0x3ff7 // ln(1/frcpa(1+ 1/2^-8))
data8 0xa0c94fcb41977c75,0x3ff8 // ln(1/frcpa(1+ 2/2^-8))
data8 0xe18b9c263af83301,0x3ff8 // ln(1/frcpa(1+ 3/2^-8))
data8 0x8d35c8d6399c30ea,0x3ff9 // ln(1/frcpa(1+ 4/2^-8))
data8 0xadd4d2ecd601cbb8,0x3ff9 // ln(1/frcpa(1+ 5/2^-8))
data8 0xce95403a192f9f01,0x3ff9 // ln(1/frcpa(1+ 6/2^-8))
data8 0xeb59392cbcc01096,0x3ff9 // ln(1/frcpa(1+ 7/2^-8))
data8 0x862c7d0cefd54c5d,0x3ffa // ln(1/frcpa(1+ 8/2^-8))
data8 0x94aa63c65e70d499,0x3ffa // ln(1/frcpa(1+ 9/2^-8))
data8 0xa54a696d4b62b382,0x3ffa // ln(1/frcpa(1+ 10/2^-8))
data8 0xb3e4a796a5dac208,0x3ffa // ln(1/frcpa(1+ 11/2^-8))
data8 0xc28c45b1878340a9,0x3ffa // ln(1/frcpa(1+ 12/2^-8))
data8 0xd35c55f39d7a6235,0x3ffa // ln(1/frcpa(1+ 13/2^-8))
data8 0xe220f037b954f1f5,0x3ffa // ln(1/frcpa(1+ 14/2^-8))
data8 0xf0f3389b036834f3,0x3ffa // ln(1/frcpa(1+ 15/2^-8))
data8 0xffd3488d5c980465,0x3ffa // ln(1/frcpa(1+ 16/2^-8))
data8 0x87609ce2ed300490,0x3ffb // ln(1/frcpa(1+ 17/2^-8))
data8 0x8ede9321e8c85927,0x3ffb // ln(1/frcpa(1+ 18/2^-8))
data8 0x96639427f2f8e2f4,0x3ffb // ln(1/frcpa(1+ 19/2^-8))
data8 0x9defad3e8f73217b,0x3ffb // ln(1/frcpa(1+ 20/2^-8))
data8 0xa582ebd50097029c,0x3ffb // ln(1/frcpa(1+ 21/2^-8))
data8 0xac06dbe75ab80fee,0x3ffb // ln(1/frcpa(1+ 22/2^-8))
data8 0xb3a78449b2d3ccca,0x3ffb // ln(1/frcpa(1+ 23/2^-8))
data8 0xbb4f79635ab46bb2,0x3ffb // ln(1/frcpa(1+ 24/2^-8))
data8 0xc2fec93a83523f3f,0x3ffb // ln(1/frcpa(1+ 25/2^-8))
data8 0xc99af2eaca4c4571,0x3ffb // ln(1/frcpa(1+ 26/2^-8))
data8 0xd1581106472fa653,0x3ffb // ln(1/frcpa(1+ 27/2^-8))
data8 0xd8002560d4355f2e,0x3ffb // ln(1/frcpa(1+ 28/2^-8))
data8 0xdfcb43b4fe508632,0x3ffb // ln(1/frcpa(1+ 29/2^-8))
data8 0xe67f6dff709d4119,0x3ffb // ln(1/frcpa(1+ 30/2^-8))
data8 0xed393b1c22351280,0x3ffb // ln(1/frcpa(1+ 31/2^-8))
data8 0xf5192bff087bcc35,0x3ffb // ln(1/frcpa(1+ 32/2^-8))
data8 0xfbdf4ff6dfef2fa3,0x3ffb // ln(1/frcpa(1+ 33/2^-8))
data8 0x81559a97f92f9cc7,0x3ffc // ln(1/frcpa(1+ 34/2^-8))
data8 0x84be72bce90266e8,0x3ffc // ln(1/frcpa(1+ 35/2^-8))
data8 0x88bc74113f23def2,0x3ffc // ln(1/frcpa(1+ 36/2^-8))
data8 0x8c2ba3edf6799d11,0x3ffc // ln(1/frcpa(1+ 37/2^-8))
data8 0x8f9dc92f92ea08b1,0x3ffc // ln(1/frcpa(1+ 38/2^-8))
data8 0x9312e8f36efab5a7,0x3ffc // ln(1/frcpa(1+ 39/2^-8))
data8 0x968b08643409ceb6,0x3ffc // ln(1/frcpa(1+ 40/2^-8))
data8 0x9a062cba08a1708c,0x3ffc // ln(1/frcpa(1+ 41/2^-8))
data8 0x9d845b3abf95485c,0x3ffc // ln(1/frcpa(1+ 42/2^-8))
data8 0xa06fd841bc001bb4,0x3ffc // ln(1/frcpa(1+ 43/2^-8))
data8 0xa3f3a74652fbe0db,0x3ffc // ln(1/frcpa(1+ 44/2^-8))
data8 0xa77a8fb2336f20f5,0x3ffc // ln(1/frcpa(1+ 45/2^-8))
data8 0xab0497015d28b0a0,0x3ffc // ln(1/frcpa(1+ 46/2^-8))
data8 0xae91c2be6ba6a615,0x3ffc // ln(1/frcpa(1+ 47/2^-8))
data8 0xb189d1b99aebb20b,0x3ffc // ln(1/frcpa(1+ 48/2^-8))
data8 0xb51cced5de9c1b2c,0x3ffc // ln(1/frcpa(1+ 49/2^-8))
data8 0xb819bee9e720d42f,0x3ffc // ln(1/frcpa(1+ 50/2^-8))
data8 0xbbb2a0947b093a5d,0x3ffc // ln(1/frcpa(1+ 51/2^-8))
data8 0xbf4ec1505811684a,0x3ffc // ln(1/frcpa(1+ 52/2^-8))
data8 0xc2535bacfa8975ff,0x3ffc // ln(1/frcpa(1+ 53/2^-8))
data8 0xc55a3eafad187eb8,0x3ffc // ln(1/frcpa(1+ 54/2^-8))
data8 0xc8ff2484b2c0da74,0x3ffc // ln(1/frcpa(1+ 55/2^-8))
data8 0xcc0b1a008d53ab76,0x3ffc // ln(1/frcpa(1+ 56/2^-8))
data8 0xcfb6203844b3209b,0x3ffc // ln(1/frcpa(1+ 57/2^-8))
data8 0xd2c73949a47a19f5,0x3ffc // ln(1/frcpa(1+ 58/2^-8))
data8 0xd5daae18b49d6695,0x3ffc // ln(1/frcpa(1+ 59/2^-8))
data8 0xd8f08248cf7e8019,0x3ffc // ln(1/frcpa(1+ 60/2^-8))
data8 0xdca7749f1b3e540e,0x3ffc // ln(1/frcpa(1+ 61/2^-8))
data8 0xdfc28e033aaaf7c7,0x3ffc // ln(1/frcpa(1+ 62/2^-8))
data8 0xe2e012a5f91d2f55,0x3ffc // ln(1/frcpa(1+ 63/2^-8))
data8 0xe600064ed9e292a8,0x3ffc // ln(1/frcpa(1+ 64/2^-8))
data8 0xe9226cce42b39f60,0x3ffc // ln(1/frcpa(1+ 65/2^-8))
data8 0xec4749fd97a28360,0x3ffc // ln(1/frcpa(1+ 66/2^-8))
data8 0xef6ea1bf57780495,0x3ffc // ln(1/frcpa(1+ 67/2^-8))
data8 0xf29877ff38809091,0x3ffc // ln(1/frcpa(1+ 68/2^-8))
data8 0xf5c4d0b245cb89be,0x3ffc // ln(1/frcpa(1+ 69/2^-8))
data8 0xf8f3afd6fcdef3aa,0x3ffc // ln(1/frcpa(1+ 70/2^-8))
data8 0xfc2519756be1abc7,0x3ffc // ln(1/frcpa(1+ 71/2^-8))
data8 0xff59119f503e6832,0x3ffc // ln(1/frcpa(1+ 72/2^-8))
data8 0x8147ce381ae0e146,0x3ffd // ln(1/frcpa(1+ 73/2^-8))
data8 0x82e45f06cb1ad0f2,0x3ffd // ln(1/frcpa(1+ 74/2^-8))
data8 0x842f5c7c573cbaa2,0x3ffd // ln(1/frcpa(1+ 75/2^-8))
data8 0x85ce471968c8893a,0x3ffd // ln(1/frcpa(1+ 76/2^-8))
data8 0x876e8305bc04066d,0x3ffd // ln(1/frcpa(1+ 77/2^-8))
data8 0x891012678031fbb3,0x3ffd // ln(1/frcpa(1+ 78/2^-8))
data8 0x8a5f1493d766a05f,0x3ffd // ln(1/frcpa(1+ 79/2^-8))
data8 0x8c030c778c56fa00,0x3ffd // ln(1/frcpa(1+ 80/2^-8))
data8 0x8da85df17e31d9ae,0x3ffd // ln(1/frcpa(1+ 81/2^-8))
data8 0x8efa663e7921687e,0x3ffd // ln(1/frcpa(1+ 82/2^-8))
data8 0x90a22b6875c6a1f8,0x3ffd // ln(1/frcpa(1+ 83/2^-8))
data8 0x91f62cc8f5d24837,0x3ffd // ln(1/frcpa(1+ 84/2^-8))
data8 0x93a06cfc3857d980,0x3ffd // ln(1/frcpa(1+ 85/2^-8))
data8 0x94f66d5e6fd01ced,0x3ffd // ln(1/frcpa(1+ 86/2^-8))
data8 0x96a330156e6772f2,0x3ffd // ln(1/frcpa(1+ 87/2^-8))
data8 0x97fb3582754ea25b,0x3ffd // ln(1/frcpa(1+ 88/2^-8))
data8 0x99aa8259aad1bbf2,0x3ffd // ln(1/frcpa(1+ 89/2^-8))
data8 0x9b0492f6227ae4a8,0x3ffd // ln(1/frcpa(1+ 90/2^-8))
data8 0x9c5f8e199bf3a7a5,0x3ffd // ln(1/frcpa(1+ 91/2^-8))
data8 0x9e1293b9998c1daa,0x3ffd // ln(1/frcpa(1+ 92/2^-8))
data8 0x9f6fa31e0b41f308,0x3ffd // ln(1/frcpa(1+ 93/2^-8))
data8 0xa0cda11eaf46390e,0x3ffd // ln(1/frcpa(1+ 94/2^-8))
data8 0xa22c8f029cfa45aa,0x3ffd // ln(1/frcpa(1+ 95/2^-8))
data8 0xa3e48badb7856b34,0x3ffd // ln(1/frcpa(1+ 96/2^-8))
data8 0xa5459a0aa95849f9,0x3ffd // ln(1/frcpa(1+ 97/2^-8))
data8 0xa6a79c84480cfebd,0x3ffd // ln(1/frcpa(1+ 98/2^-8))
data8 0xa80a946d0fcb3eb2,0x3ffd // ln(1/frcpa(1+ 99/2^-8))
data8 0xa96e831a3ea7b314,0x3ffd // ln(1/frcpa(1+100/2^-8))
data8 0xaad369e3dc544e3b,0x3ffd // ln(1/frcpa(1+101/2^-8))
data8 0xac92e9588952c815,0x3ffd // ln(1/frcpa(1+102/2^-8))
data8 0xadfa035aa1ed8fdc,0x3ffd // ln(1/frcpa(1+103/2^-8))
data8 0xaf6219eae1ad6e34,0x3ffd // ln(1/frcpa(1+104/2^-8))
data8 0xb0cb2e6d8160f753,0x3ffd // ln(1/frcpa(1+105/2^-8))
data8 0xb2354249ad950f72,0x3ffd // ln(1/frcpa(1+106/2^-8))
data8 0xb3a056e98ef4a3b4,0x3ffd // ln(1/frcpa(1+107/2^-8))
data8 0xb50c6dba52c6292a,0x3ffd // ln(1/frcpa(1+108/2^-8))
data8 0xb679882c33876165,0x3ffd // ln(1/frcpa(1+109/2^-8))
data8 0xb78c07429785cedc,0x3ffd // ln(1/frcpa(1+110/2^-8))
data8 0xb8faeb8dc4a77d24,0x3ffd // ln(1/frcpa(1+111/2^-8))
data8 0xba6ad77eb36ae0d6,0x3ffd // ln(1/frcpa(1+112/2^-8))
data8 0xbbdbcc915e9bee50,0x3ffd // ln(1/frcpa(1+113/2^-8))
data8 0xbd4dcc44f8cf12ef,0x3ffd // ln(1/frcpa(1+114/2^-8))
data8 0xbec0d81bf5b531fa,0x3ffd // ln(1/frcpa(1+115/2^-8))
data8 0xc034f19c139186f4,0x3ffd // ln(1/frcpa(1+116/2^-8))
data8 0xc14cb69f7c5e55ab,0x3ffd // ln(1/frcpa(1+117/2^-8))
data8 0xc2c2abbb6e5fd56f,0x3ffd // ln(1/frcpa(1+118/2^-8))
data8 0xc439b2c193e6771e,0x3ffd // ln(1/frcpa(1+119/2^-8))
data8 0xc553acb9d5c67733,0x3ffd // ln(1/frcpa(1+120/2^-8))
data8 0xc6cc96e441272441,0x3ffd // ln(1/frcpa(1+121/2^-8))
data8 0xc8469753eca88c30,0x3ffd // ln(1/frcpa(1+122/2^-8))
data8 0xc962cf3ce072b05c,0x3ffd // ln(1/frcpa(1+123/2^-8))
data8 0xcadeba8771f694aa,0x3ffd // ln(1/frcpa(1+124/2^-8))
data8 0xcc5bc08d1f72da94,0x3ffd // ln(1/frcpa(1+125/2^-8))
data8 0xcd7a3f99ea035c29,0x3ffd // ln(1/frcpa(1+126/2^-8))
data8 0xcef93860c8a53c35,0x3ffd // ln(1/frcpa(1+127/2^-8))
data8 0xd0192f68a7ed23df,0x3ffd // ln(1/frcpa(1+128/2^-8))
data8 0xd19a201127d3c645,0x3ffd // ln(1/frcpa(1+129/2^-8))
data8 0xd2bb92f4061c172c,0x3ffd // ln(1/frcpa(1+130/2^-8))
data8 0xd43e80b2ee8cc8fc,0x3ffd // ln(1/frcpa(1+131/2^-8))
data8 0xd56173601fc4ade4,0x3ffd // ln(1/frcpa(1+132/2^-8))
data8 0xd6e6637efb54086f,0x3ffd // ln(1/frcpa(1+133/2^-8))
data8 0xd80ad9f58f3c8193,0x3ffd // ln(1/frcpa(1+134/2^-8))
data8 0xd991d1d31aca41f8,0x3ffd // ln(1/frcpa(1+135/2^-8))
data8 0xdab7d02231484a93,0x3ffd // ln(1/frcpa(1+136/2^-8))
data8 0xdc40d532cde49a54,0x3ffd // ln(1/frcpa(1+137/2^-8))
data8 0xdd685f79ed8b265e,0x3ffd // ln(1/frcpa(1+138/2^-8))
data8 0xde9094bbc0e17b1d,0x3ffd // ln(1/frcpa(1+139/2^-8))
data8 0xe01c91b78440c425,0x3ffd // ln(1/frcpa(1+140/2^-8))
data8 0xe14658f26997e729,0x3ffd // ln(1/frcpa(1+141/2^-8))
data8 0xe270cdc2391e0d23,0x3ffd // ln(1/frcpa(1+142/2^-8))
data8 0xe3ffce3a2aa64922,0x3ffd // ln(1/frcpa(1+143/2^-8))
data8 0xe52bdb274ed82887,0x3ffd // ln(1/frcpa(1+144/2^-8))
data8 0xe6589852e75d7df6,0x3ffd // ln(1/frcpa(1+145/2^-8))
data8 0xe786068c79937a7d,0x3ffd // ln(1/frcpa(1+146/2^-8))
data8 0xe91903adad100911,0x3ffd // ln(1/frcpa(1+147/2^-8))
data8 0xea481236f7d35bb0,0x3ffd // ln(1/frcpa(1+148/2^-8))
data8 0xeb77d48c692e6b14,0x3ffd // ln(1/frcpa(1+149/2^-8))
data8 0xeca84b83d7297b87,0x3ffd // ln(1/frcpa(1+150/2^-8))
data8 0xedd977f4962aa158,0x3ffd // ln(1/frcpa(1+151/2^-8))
data8 0xef7179a22f257754,0x3ffd // ln(1/frcpa(1+152/2^-8))
data8 0xf0a450d139366ca7,0x3ffd // ln(1/frcpa(1+153/2^-8))
data8 0xf1d7e0524ff9ffdb,0x3ffd // ln(1/frcpa(1+154/2^-8))
data8 0xf30c29036a8b6cae,0x3ffd // ln(1/frcpa(1+155/2^-8))
data8 0xf4412bc411ea8d92,0x3ffd // ln(1/frcpa(1+156/2^-8))
data8 0xf576e97564c8619d,0x3ffd // ln(1/frcpa(1+157/2^-8))
data8 0xf6ad62fa1b5f172f,0x3ffd // ln(1/frcpa(1+158/2^-8))
data8 0xf7e499368b55c542,0x3ffd // ln(1/frcpa(1+159/2^-8))
data8 0xf91c8d10abaffe22,0x3ffd // ln(1/frcpa(1+160/2^-8))
data8 0xfa553f7018c966f3,0x3ffd // ln(1/frcpa(1+161/2^-8))
data8 0xfb8eb13e185d802c,0x3ffd // ln(1/frcpa(1+162/2^-8))
data8 0xfcc8e3659d9bcbed,0x3ffd // ln(1/frcpa(1+163/2^-8))
data8 0xfe03d6d34d487fd2,0x3ffd // ln(1/frcpa(1+164/2^-8))
data8 0xff3f8c7581e9f0ae,0x3ffd // ln(1/frcpa(1+165/2^-8))
data8 0x803e029e280173ae,0x3ffe // ln(1/frcpa(1+166/2^-8))
data8 0x80dca10cc52d0757,0x3ffe // ln(1/frcpa(1+167/2^-8))
data8 0x817ba200632755a1,0x3ffe // ln(1/frcpa(1+168/2^-8))
data8 0x821b05f3b01d6774,0x3ffe // ln(1/frcpa(1+169/2^-8))
data8 0x82bacd623ff19d06,0x3ffe // ln(1/frcpa(1+170/2^-8))
data8 0x835af8c88e7a8f47,0x3ffe // ln(1/frcpa(1+171/2^-8))
data8 0x83c5f8299e2b4091,0x3ffe // ln(1/frcpa(1+172/2^-8))
data8 0x8466cb43f3d87300,0x3ffe // ln(1/frcpa(1+173/2^-8))
data8 0x850803a67c80ca4b,0x3ffe // ln(1/frcpa(1+174/2^-8))
data8 0x85a9a1d11a23b461,0x3ffe // ln(1/frcpa(1+175/2^-8))
data8 0x864ba644a18e6e05,0x3ffe // ln(1/frcpa(1+176/2^-8))
data8 0x86ee1182dcc432f7,0x3ffe // ln(1/frcpa(1+177/2^-8))
data8 0x875a925d7e48c316,0x3ffe // ln(1/frcpa(1+178/2^-8))
data8 0x87fdaa109d23aef7,0x3ffe // ln(1/frcpa(1+179/2^-8))
data8 0x88a129ed4becfaf2,0x3ffe // ln(1/frcpa(1+180/2^-8))
data8 0x89451278ecd7f9cf,0x3ffe // ln(1/frcpa(1+181/2^-8))
data8 0x89b29295f8432617,0x3ffe // ln(1/frcpa(1+182/2^-8))
data8 0x8a572ac5a5496882,0x3ffe // ln(1/frcpa(1+183/2^-8))
data8 0x8afc2d0ce3b2dadf,0x3ffe // ln(1/frcpa(1+184/2^-8))
data8 0x8b6a69c608cfd3af,0x3ffe // ln(1/frcpa(1+185/2^-8))
data8 0x8c101e106e899a83,0x3ffe // ln(1/frcpa(1+186/2^-8))
data8 0x8cb63de258f9d626,0x3ffe // ln(1/frcpa(1+187/2^-8))
data8 0x8d2539c5bd19e2b1,0x3ffe // ln(1/frcpa(1+188/2^-8))
data8 0x8dcc0e064b29e6f1,0x3ffe // ln(1/frcpa(1+189/2^-8))
data8 0x8e734f45d88357ae,0x3ffe // ln(1/frcpa(1+190/2^-8))
data8 0x8ee30cef034a20db,0x3ffe // ln(1/frcpa(1+191/2^-8))
data8 0x8f8b0515686d1d06,0x3ffe // ln(1/frcpa(1+192/2^-8))
data8 0x90336bba039bf32f,0x3ffe // ln(1/frcpa(1+193/2^-8))
data8 0x90a3edd23d1c9d58,0x3ffe // ln(1/frcpa(1+194/2^-8))
data8 0x914d0de2f5d61b32,0x3ffe // ln(1/frcpa(1+195/2^-8))
data8 0x91be0c20d28173b5,0x3ffe // ln(1/frcpa(1+196/2^-8))
data8 0x9267e737c06cd34a,0x3ffe // ln(1/frcpa(1+197/2^-8))
data8 0x92d962ae6abb1237,0x3ffe // ln(1/frcpa(1+198/2^-8))
data8 0x9383fa6afbe2074c,0x3ffe // ln(1/frcpa(1+199/2^-8))
data8 0x942f0421651c1c4e,0x3ffe // ln(1/frcpa(1+200/2^-8))
data8 0x94a14a3845bb985e,0x3ffe // ln(1/frcpa(1+201/2^-8))
data8 0x954d133857f861e7,0x3ffe // ln(1/frcpa(1+202/2^-8))
data8 0x95bfd96468e604c4,0x3ffe // ln(1/frcpa(1+203/2^-8))
data8 0x9632d31cafafa858,0x3ffe // ln(1/frcpa(1+204/2^-8))
data8 0x96dfaabd86fa1647,0x3ffe // ln(1/frcpa(1+205/2^-8))
data8 0x9753261fcbb2a594,0x3ffe // ln(1/frcpa(1+206/2^-8))
data8 0x9800c11b426b996d,0x3ffe // ln(1/frcpa(1+207/2^-8))
data8 0x9874bf4d45ae663c,0x3ffe // ln(1/frcpa(1+208/2^-8))
data8 0x99231f5ee9a74f79,0x3ffe // ln(1/frcpa(1+209/2^-8))
data8 0x9997a18a56bcad28,0x3ffe // ln(1/frcpa(1+210/2^-8))
data8 0x9a46c873a3267e79,0x3ffe // ln(1/frcpa(1+211/2^-8))
data8 0x9abbcfc621eb6cb6,0x3ffe // ln(1/frcpa(1+212/2^-8))
data8 0x9b310cb0d354c990,0x3ffe // ln(1/frcpa(1+213/2^-8))
data8 0x9be14cf9e1b3515c,0x3ffe // ln(1/frcpa(1+214/2^-8))
data8 0x9c5710b8cbb73a43,0x3ffe // ln(1/frcpa(1+215/2^-8))
data8 0x9ccd0abd301f399c,0x3ffe // ln(1/frcpa(1+216/2^-8))
data8 0x9d7e67f3bdce8888,0x3ffe // ln(1/frcpa(1+217/2^-8))
data8 0x9df4ea81a99daa01,0x3ffe // ln(1/frcpa(1+218/2^-8))
data8 0x9e6ba405a54514ba,0x3ffe // ln(1/frcpa(1+219/2^-8))
data8 0x9f1e21c8c7bb62b3,0x3ffe // ln(1/frcpa(1+220/2^-8))
data8 0x9f956593f6b6355c,0x3ffe // ln(1/frcpa(1+221/2^-8))
data8 0xa00ce1092e5498c3,0x3ffe // ln(1/frcpa(1+222/2^-8))
data8 0xa0c08309c4b912c1,0x3ffe // ln(1/frcpa(1+223/2^-8))
data8 0xa1388a8c6faa2afa,0x3ffe // ln(1/frcpa(1+224/2^-8))
data8 0xa1b0ca7095b5f985,0x3ffe // ln(1/frcpa(1+225/2^-8))
data8 0xa22942eb47534a00,0x3ffe // ln(1/frcpa(1+226/2^-8))
data8 0xa2de62326449d0a3,0x3ffe // ln(1/frcpa(1+227/2^-8))
data8 0xa357690f88bfe345,0x3ffe // ln(1/frcpa(1+228/2^-8))
data8 0xa3d0a93f45169a4b,0x3ffe // ln(1/frcpa(1+229/2^-8))
data8 0xa44a22f7ffe65f30,0x3ffe // ln(1/frcpa(1+230/2^-8))
data8 0xa500c5e5b4c1aa36,0x3ffe // ln(1/frcpa(1+231/2^-8))
data8 0xa57ad064eb2ebbc2,0x3ffe // ln(1/frcpa(1+232/2^-8))
data8 0xa5f5152dedf4384e,0x3ffe // ln(1/frcpa(1+233/2^-8))
data8 0xa66f9478856233ec,0x3ffe // ln(1/frcpa(1+234/2^-8))
data8 0xa6ea4e7cca02c32e,0x3ffe // ln(1/frcpa(1+235/2^-8))
data8 0xa765437325341ccf,0x3ffe // ln(1/frcpa(1+236/2^-8))
data8 0xa81e21e6c75b4020,0x3ffe // ln(1/frcpa(1+237/2^-8))
data8 0xa899ab333fe2b9ca,0x3ffe // ln(1/frcpa(1+238/2^-8))
data8 0xa9157039c51ebe71,0x3ffe // ln(1/frcpa(1+239/2^-8))
data8 0xa991713433c2b999,0x3ffe // ln(1/frcpa(1+240/2^-8))
data8 0xaa0dae5cbcc048b3,0x3ffe // ln(1/frcpa(1+241/2^-8))
data8 0xaa8a27ede5eb13ad,0x3ffe // ln(1/frcpa(1+242/2^-8))
data8 0xab06de228a9e3499,0x3ffe // ln(1/frcpa(1+243/2^-8))
data8 0xab83d135dc633301,0x3ffe // ln(1/frcpa(1+244/2^-8))
data8 0xac3fb076adc7fe7a,0x3ffe // ln(1/frcpa(1+245/2^-8))
data8 0xacbd3cbbe47988f1,0x3ffe // ln(1/frcpa(1+246/2^-8))
data8 0xad3b06b1a5dc57c3,0x3ffe // ln(1/frcpa(1+247/2^-8))
data8 0xadb90e94af887717,0x3ffe // ln(1/frcpa(1+248/2^-8))
data8 0xae3754a218f7c816,0x3ffe // ln(1/frcpa(1+249/2^-8))
data8 0xaeb5d9175437afa2,0x3ffe // ln(1/frcpa(1+250/2^-8))
data8 0xaf349c322e9c7cee,0x3ffe // ln(1/frcpa(1+251/2^-8))
data8 0xafb39e30d1768d1c,0x3ffe // ln(1/frcpa(1+252/2^-8))
data8 0xb032df51c2c93116,0x3ffe // ln(1/frcpa(1+253/2^-8))
data8 0xb0b25fd3e6035ad9,0x3ffe // ln(1/frcpa(1+254/2^-8))
data8 0xb1321ff67cba178c,0x3ffe // ln(1/frcpa(1+255/2^-8))
//
data8 0xC7DC2985D3B44557,0x3FCA // A00
//
// polynomial approximation of ln(GAMMA(x)), 1 <= x < 2.25
// [0.875,1.25)
data8 0xBF9A04F7E40C8498,0x3FAB79D8D9380F03 // C17,C16
data8 0xBFB3B63609CA0CBD,0x3FB5564EA1675539 // C13,C12
data8 0xBFBC806766F48C41,0x3FC010B36CDA773A // C9,C8
data8 0xD45CE0BD54BE3D67,0xBFFC // C5
data8 0xCD26AADF559676D0,0xBFFD // C3
data8 0x93C467E37DB0C7A7,0xBFFE // C1
data8 0xBFB10C251723B123,0x3FB2669DAD69A12D // C15,C14
data8 0xBFB748A3CFCE4717,0x3FB9A01DEE29966A // C11,C10
data8 0xBFC2703A1D85497E,0x3FC5B40CB0FD353C // C7,C6
data8 0x8A8991563ECBBA5D,0x3FFD // C4
data8 0xD28D3312983E9844,0x3FFE // C2
data8 0,0 // C0
// [1.25,1.75)
data8 0xBF12680486396DE6,0x3F23C51FC332CD9D // C17,C16
data8 0xBF422633DA3A1496,0x3F4CC70680768857 // C13,C12
data8 0xBF6E2F1A1F804B5D,0x3F78FCE02A032428 // C9,C8
data8 0x864D46FA895985C1,0xBFFA // C5
data8 0x97213C6E35E12043,0xBFFC // C3
data8 0x8A8A42A401D979B7,0x3FC7 // C1
data8 0xBF2E098A8A2332A8,0x3F370E61B73B205C // C15,C14
data8 0xBF56F9849D3BC6CC,0x3F6283126F58D7F4 // C11,C10
data8 0xBF851F9F9516A98F,0x3F9266E797A1433F // C7,C6
data8 0x845A14A6A81B0638,0x3FFB // C4
data8 0xF7B95E4771C55C99,0x3FFD // C2
data8 0xF8CDCDE61C520E0F,0xBFFB // C0
// [1.75,2.25)
data8 0xBEA01D7AFA5D8F52,0x3EB1010986E60253 // C17,C16
data8 0xBEE3CBEDB4C918AA,0x3EF580F6D9D0F72D // C13,C12
data8 0xBF2D3FD4C7F68563,0x3F40B36AF884AE9A // C9,C8
data8 0xF2027E10C7B051EC,0xBFF7 // C5
data8 0x89F000D2ABB03401,0xBFFB // C3
data8 0xD8773039049E70B6,0x3FFD // C1
data8 0xBEC112CD07CFC31A,0x3ED2528A428D30E1 // C15,C14
data8 0xBF078DE5618D8C9F,0x3F1A127AD811A53D // C11,C10
data8 0xBF538AC5C2BF540D,0x3F67ADD6EADB5718 // C7,C6
data8 0xA8991563EC243383,0x3FF9 // C4
data8 0xA51A6625307D3230,0x3FFD // C2
data8 0,0 // C0
//
// polynomial approximation of ln(sin(Pi*x)/(Pi*x)), 9 <= x <= 0.5
data8 0xBFDC1BF0931AE591,0x3FD36D6D6CE263D7 //S28,S26
data8 0xBFBD516F4FD9FB18,0xBFBBE1703F315086 //S20,S18
data8 0xAAB5A3CCEFCD3628,0xBFFC //S12
data8 0x80859B5C318E19A5,0xBFFD //S8
data8 0x8A8991563EC7EB33,0xBFFE //S4
data8 0xBFD23AB9E6CC88AC,0xBF9957F5146FC7AF //S24,S22
data8 0xBFC007B324E23040,0xBFC248DEC29CAC4A //S16,S14
data8 0xCD00EFF2F8F86899,0xBFFC //S10
data8 0xADA06587FACD668B,0xBFFD //S6
data8 0xD28D3312983E98A0,0xBFFF //S2
//
data8 0x8090F777D7942F73,0x4001 // PR01
data8 0xE5B521193CF61E63,0x4000 // PR11
data8 0xC02C000000001939 // (-15;-14)
data8 0x0000000000000233 // (-15;-14)
data8 0xC02A000000016124 // (-14;-13)
data8 0x0000000000002BFB // (-14;-13)
data8 0xC02800000011EED9 // (-13;-12)
data8 0x0000000000025CBB // (-13;-12)
data8 0xC026000000D7322A // (-12;-11)
data8 0x00000000001E1095 // (-12;-11)
data8 0xC0240000093F2777 // (-11;-10)
data8 0x00000000013DD3DC // (-11;-10)
data8 0xC02200005C7768FB // (-10;-9)
data8 0x000000000C9539B9 // (-10;-9)
data8 0xC02000034028B3F9 // (-9;-8)
data8 0x000000007570C565 // (-9;-8)
data8 0xC01C0033FDEDFE1F // (-8;-7)
data8 0x00000007357E670E // (-8;-7)
data8 0xC018016B25897C8D // (-7;-6)
data8 0x000000346DC5D639 // (-7;-6)
data8 0xC014086A57F0B6D9 // (-6;-5)
data8 0x0000010624DD2F1B // (-6;-5)
data8 0xC010284E78599581 // (-5;-4)
data8 0x0000051EB851EB85 // (-5;-4)
data8 0xC009260DBC9E59AF // (-4;-3)
data8 0x000028F5C28F5C29 // (-4;-3)
data8 0xC003A7FC9600F86C // (-3;-2)
data8 0x0000666666666666 // (-3;-2)
data8 0xCC15879606130890,0x4000 // PR21
data8 0xB42FE3281465E1CC,0x4000 // PR31
//
data8 0x828185F0B95C9916,0x4001 // PR00
//
data8 0xD4D3C819E4E5654B,0x4000 // PR10
data8 0xA82FBBA4FCC75298,0x4000 // PR20
data8 0xC02DFFFFFFFFFE52 // (-15;-14)
data8 0x000000000000001C // (-15;-14)
data8 0xC02BFFFFFFFFE6C7 // (-14;-13)
data8 0x00000000000001A6 // (-14;-13)
data8 0xC029FFFFFFFE9EDC // (-13;-12)
data8 0x0000000000002BFB // (-13;-12)
data8 0xC027FFFFFFEE1127 // (-12;-11)
data8 0x000000000001EEC8 // (-12;-11)
data8 0xC025FFFFFF28CDD4 // (-11;-10)
data8 0x00000000001E1095 // (-11;-10)
data8 0xC023FFFFF6C0D7C0 // (-10;-9)
data8 0x000000000101B2B3 // (-10;-9)
data8 0xC021FFFFA3884BD0 // (-9;-8)
data8 0x000000000D6BF94D // (-9;-8)
data8 0xC01FFFF97F8159CF // (-8;-7)
data8 0x00000000C9539B89 // (-8;-7)
data8 0xC01BFFCBF76B86F0 // (-7;-6)
data8 0x00000007357E670E // (-7;-6)
data8 0xC017FE92F591F40D // (-6;-5)
data8 0x000000346DC5D639 // (-6;-5)
data8 0xC013F7577A6EEAFD // (-5;-4)
data8 0x00000147AE147AE1 // (-5;-4)
data8 0xC00FA471547C2FE5 // (-4;-3)
data8 0x00000C49BA5E353F // (-4;-3)
data8 0xC005FB410A1BD901 // (-3;-2)
data8 0x000053F7CED91687 // (-3;-2)
data8 0x80151BB918A293AA,0x4000 // PR30
data8 0xB3C9F8F47422A314,0x400B // PRN
//
// right negative roots
//(-3;-2)
data8 0x40BFCF8B90BE7F6B,0x40B237623345EFC3 // A15,A14
data8 0x407A92EFB03B281E,0x40728700C7819759 // A11,A10
data8 0x403809F04EF4D0F2,0x4038D32F682D9593 // A7,A6
data8 0xB4A5302C53C2F2D8,0x3FFF // A3
data8 0xC1FF4B357A9B0383,0x3FFF // A1
data8 0x409C46632EB4B2D3,0x4091A72AFA2148F5 // A13,A12
data8 0x4059297AC79A88DB,0x40548EAA7BE7FA6B // A9,A8
data8 0x4017339FE04B227F,0x4021718D7CA09E02 // A5,A4
data8 0x9B775D8017AAE668,0x4001 // A2
data8 0x8191DB68FF4366A1,0x3FC9 // A0
//(-4;-3)
data8 0x425260910D35307B,0x422668F5BE7983BB // A15,A14
data8 0x41A4454DBE4BEE43,0x41799CA93F6EA817 // A11,A10
data8 0x40FBB97AA1400F31,0x40D293C3F7ADAB15 // A7,A6
data8 0xE089B8926AE4517B,0x4005 // A3
data8 0xF90532F97D630C69,0x4001 // A1
data8 0x41F9F0CF98C5F2EA,0x41D026336C6BF394 // A13,A12
data8 0x415057F61156D5B8,0x41251EA3055CB754 // A9,A8
data8 0x40A99A6337D9FC2B,0x408267203D776151 // A5,A4
data8 0xCEA694BB8A8827A9,0x4003 // A2
data8 0xF4B02F1D73D30EED,0x3FCD // A0
//(-5;-4)
data8 0x4412365489340979,0x43C86441BAFDEE39 // A15,A14
data8 0x42ED68FCB19352DD,0x42A45FCE3905CD6F // A11,A10
data8 0x41CD14FE49FD4FCA,0x41855E3DBFA89744 // A7,A6
data8 0xAACD88D954E0EC16,0x400B // A3
data8 0xD652E7A490B0DCDF,0x4003 // A1
data8 0x437F52608E0E752A,0x433560E0633E33D5 // A13,A12
data8 0x425C83998976DE3D,0x421433DCCD3B473B // A9,A8
data8 0x4140261EB5732106,0x40F96D18E21AE6CC // A5,A4
data8 0xA220AE6C09FA8A0E,0x4007 // A2
data8 0xCC1682D17A2B5A58,0xBFCF // A0
//(-6;-5)
data8 0x4630E41D6386CF5A,0x45C2E7992C628C8C // A15,A14
data8 0x447AABEC714F913A,0x440EDCAB45339F3A // A11,A10
data8 0x42C9A8D00C97E3CE,0x425F7D8D5BEAB44D // A7,A6
data8 0x929EC2B1FB95BB5B,0x4012 // A3
data8 0xF6B970414D717D38,0x4005 // A1
data8 0x45545E578976F6A2,0x44E738288DD52686 // A13,A12
data8 0x43A20921FEC49492,0x433557FD7C6A41B3 // A9,A8
data8 0x41F3E01773761DB4,0x418A225DF2DA6C47 // A5,A4
data8 0xE7661976117F9312,0x400B // A2
data8 0xC33C13FEE07494DE,0x3FCF // A0
//(-7;-6)
data8 0x4898F1E6133305AD,0x4802C5306FE4A850 // A15,A14
data8 0x463FD37946B44094,0x45A8D489B784C2DD // A11,A10
data8 0x43E9500995815F06,0x4354F21E2FEE6DF5 // A7,A6
data8 0xEF281D1E1BBE10BD,0x4019 // A3
data8 0xB4EF24F1D78C2029,0x4008 // A1
data8 0x476AB1D5930011E5,0x46D4867E77BFB622 // A13,A12
data8 0x45139151ECDEF7C5,0x447F3A2BC6BF466F // A9,A8
data8 0x42C1D3D50713FA40,0x422F9C7B52556A1B // A5,A4
data8 0xFE711A4267CEA83A,0x4010 // A2
data8 0xD11E91B3FF8F4B94,0xBFD2 // A0
//(-8;-7)
data8 0x4B39E57569811B6E,0x4A7656073EB1FA21 // A15,A14
data8 0x482C9B24A516B0BB,0x47698FF55139C62B // A11,A10
data8 0x452393E2BC8E8D04,0x44628E1C710DA478 // A7,A6
data8 0x9F2A95AF1B7A773F,0x4022 // A3
data8 0x9DA03D51C303C918,0x400B // A1
data8 0x49B24C241A3D5BCB,0x48F01CB936ECDA67 // A13,A12
data8 0x46A712B3425C6797,0x45E5164114BD6DA1 // A9,A8
data8 0x43A216A356069D01,0x42E25E42A45E2108 // A5,A4
data8 0xC1F42ED57BBC2529,0x4016 // A2
data8 0xB1C7B615A7DCA8A9,0xBFD7 // A0
//(-9;-8)
data8 0x4E09D478E5EE857D,0x4D1647782106E9AB // A15,A14
data8 0x4A3C7F4D51927548,0x49497954796D743A // A11,A10
data8 0x467387BD6AF0CBDF,0x4582843E134111D2 // A7,A6
data8 0x9F003C6DE9666513,0x402B // A3
data8 0x9D8447F6BF99950A,0x400E // A1
data8 0x4C22364D238C61A9,0x4B300B18050AB940 // A13,A12
data8 0x4857004D64215772,0x4765074E448C3C9A // A9,A8
data8 0x44920E9EA07BF624,0x43A257BEC94BBF48 // A5,A4
data8 0xC1D1C49AC5B2A4B4,0x401C // A2
data8 0x9A749AF9F2D2E688,0x3FDB // A0
//(-10;-9)
data8 0x5102C7C43EA26C83,0x4FDCD174DEB0426B // A15,A14
data8 0x4C6A036195CD5BAD,0x4B44ABB52B65628A // A11,A10
data8 0x47D6439374B98FED,0x46B2C3903EF44D7D // A7,A6
data8 0xE25BAF73AB8A7DB3,0x4034 // A3
data8 0xB130901CA6D81B61,0x4011 // A1
data8 0x4EB50BB0726AE206,0x4D907A96E6D2B6E2 // A13,A12
data8 0x4A20975D78EAF01A,0x48FAF79C9C3E7908 // A9,A8
data8 0x459044144129A247,0x446D6043FA3150A3 // A5,A4
data8 0xF547997E083D9BA7,0x4022 // A2
data8 0x977AF525A6ECA1BC,0x3FDC // A0
//(-11;-10)
data8 0x5420A5D5E90C6D73,0x52C4710A503DC67A // A15,A14
data8 0x4EB2ED07BA88D2A8,0x4D581001ED9A5ECE // A11,A10
data8 0x494A8A28E9E3DFEF,0x47F1E4E1E476793E // A7,A6
data8 0xDD0C97E12D4A3378,0x403E // A3
data8 0xDD7C12D5182FD543,0x4014 // A1
data8 0x5167ED536877A072,0x500DF9AF21DDC0B6 // A13,A12
data8 0x4BFEE6F04BC34FF8,0x4AA4175CEF736A5E // A9,A8
data8 0x4698D1B4388FEC78,0x4541EDE7607A600D // A5,A4
data8 0xBF9F645F282AC552,0x4029 // A2
data8 0xAE1BBE4D3CDACCF4,0x3FE1 // A0
//(-12;-11)
data8 0x575F0EEF5FB7D4C0,0x55CBB7302B211A7C // A15,A14
data8 0x5113A4F1825C7CB2,0x4F822A0D46E0605A // A11,A10
data8 0x4ACED38FC8BE069A,0x493E3B56D2649F18 // A7,A6
data8 0x8FA8FF5DF8B72D5E,0x4049 // A3
data8 0x9845417E8598D642,0x4018 // A1
data8 0x5437780541C3F2D3,0x52A56279B563C1B2 // A13,A12
data8 0x4DF0F71A48C50188,0x4C600B358988DEBF // A9,A8
data8 0x47AE7EE95BDA3DE9,0x46200599DC16B18F // A5,A4
data8 0xB5249F914932E55D,0x4030 // A2
data8 0xEAE760CD2C086094,0x3FE5 // A0
//(-13;-12)
data8 0x5ABA5848651F6D18,0x58EF60D8A817650B // A15,A14
data8 0x538A8CA86E13EFB1,0x51C05DBD4D01076D // A11,A10
data8 0x4C607594C339D259,0x4A9585BD5BF932BB // A7,A6
data8 0xF26D282C36EC3611,0x4053 // A3
data8 0xE467DF4810EE7EEE,0x401B // A1
data8 0x5721D9BA485E8CC3,0x5555AF2CCFB2104D // A13,A12
data8 0x4FF4619A17B14EA6,0x4E29B2F29EB9F8C4 // A9,A8
data8 0x48CCF27629D46E79,0x47044715F991A63D // A5,A4
data8 0xCBC92FB9BDAA95A9,0x4037 // A2
data8 0xFB743A426163665B,0xBFE6 // A0
//(-14;-13)
data8 0x5E3295B24B353EAA,0x5C2B447E29796F20 // A15,A14
data8 0x5615A35CB5EAFAE5,0x54106AB089C95CAF // A11,A10
data8 0x4DFEC7D93501900A,0x4BF8C4C685F01B83 // A7,A6
data8 0x820899603D9A74D5,0x405F // A3
data8 0xB9949919933821CB,0x401F // A1
data8 0x5A23373DB9A995AC,0x581CBA0AF7F53009 // A13,A12
data8 0x520929836BB304CD,0x500386409A7076DA // A9,A8
data8 0x49F480173FEAF90B,0x47F1ACB14B810793 // A5,A4
data8 0x86881B8674DBF205,0x403F // A2
data8 0x8CF3CC35AA2C5F90,0x3FED // A0
//(-15;-14)
data8 0x61C37D53BE0029D6,0x5F80667CD9D68354 // A15,A14
data8 0x58B3F01898E6605B,0x567149652116DB6A // A11,A10
data8 0x4FA82FA4F5D35B00,0x4D663DB00832DF8F // A7,A6
data8 0xAE426731C9B94996,0x406A // A3
data8 0xA264C84BE3708F3F,0x4023 // A1
data8 0x5D3B254BC1C806A8,0x5AF72E736048B553 // A13,A12
data8 0x542E476505104BB0,0x51EAD96CDC4FB48F // A9,A8
data8 0x4B25095F498DB134,0x48E4B9FDEBFE24AB // A5,A4
data8 0xCE076A5A116C1D34,0x4046 // A2
data8 0x940013871A15050B,0x3FF1 // A0
//
// left negative roots
//(-3;-2)
data8 0x41AEB7998DBE2B2C,0xC19053D8FAC05DF7 // A16,A15
data8 0x4133197BF1ADEAF9,0xC1150728B9B82072 // A12,A11
data8 0x40BDBA65E74F4526,0xC0A12239BEEF8F72 // A8,A7
data8 0xFA8256664F99E2AA,0x4004 // A4
data8 0x9933F9E132D2A5DB,0x4002 // A2
data8 0x416FFB167B85F77C,0xC15166AE0ACCF87C // A14,A13
data8 0x40F75815106322C0,0xC0DA2D23C59C348D // A10,A9
data8 0x4084373F7CC42043,0xC0685884581F8C61 // A6,A5
data8 0xA0C2D6186460FF9D,0xC003 // A3
data8 0xF5096D48258CA0AD,0xBFFF // A1
//(-4;-3)
data8 0xC3E5BD233016D4B9,0x43A084DAD2D94AB1 // A15,A14
data8 0xC2CCFFF5E5AED722,0x4286D143AC7D29A6 // A11,A10
data8 0xC1B7DBBE0680D07B,0x4173E8F3ABB79CED // A7,A6
data8 0xE929ACEA59799BAF,0xC00A // A3
data8 0xA5CCECB362B21E1C,0xC003 // A1
data8 0xC357EED873871B81,0x43128E0B873204FC // A13,A12
data8 0xC242225FA76E8450,0x41FD2F76AE7386CE // A9,A8
data8 0xC13116F7806D0C7A,0x40EE8F829F141025 // A5,A4
data8 0xFBB6F57021B5B397,0x4006 // A2
data8 0xEEE019B4C05AC269,0xBFCB // A0
//(-5;-4)
data8 0xC626A52FE8AAA100,0x45B9FD1F4DDFE31E // A15,A14
data8 0xC473812A5675F08B,0x440738530AECC254 // A11,A10
data8 0xC2C5068B3F94AC27,0x425A8C5C539A500B // A7,A6
data8 0x869FBFF732F20C3A,0xC012 // A3
data8 0xE91251F7CF25A655,0xC005 // A1
data8 0xC54C18CB48E5DA0F,0x44E07BD36FF561DF // A13,A12
data8 0xC39BEC120D2FEBEA,0x4330FFA5388435BE // A9,A8
data8 0xC1F13D5D163B7FB5,0x418752A6F5AC0F39 // A5,A4
data8 0xDA99E33C51D360F0,0x400B // A2
data8 0x9F47A66A2F53D9B9,0x3FD1 // A0
//(-6;-5)
data8 0xC8970DAC16B6D59E,0x480170728306FD76 // A15,A14
data8 0xC63E0E5030604CF3,0x45A7924D74D57C65 // A11,A10
data8 0xC3E8684E41730FC6,0x43544D54EA2E5B9A // A7,A6
data8 0xEB7404450C47C5F4,0xC019 // A3
data8 0xB30FB521D2C19F8B,0xC008 // A1
data8 0xC768F34D35DF6320,0x46D348B3BB2E68B8 // A13,A12
data8 0xC512AC2FE5EA638E,0x447DF44BC7FC5E17 // A9,A8
data8 0xC2C15EA6B0AAFEF9,0x422EF5D308DBC420 // A5,A4
data8 0xFBCEE5BCA70FD3A3,0x4010 // A2
data8 0x8589A7CFFE0A3E86,0xBFD5 // A0
//(-7;-6)
data8 0xCB3995A0CC961E5A,0x4A7615C6C7116ADD // A15,A14
data8 0xC82C5AFE0BF9C427,0x47695BD2F367668B // A11,A10
data8 0xC52377E70BA14CF5,0x4462775E859E4392 // A7,A6
data8 0x9EC8ED6E4C3D4DBE,0xC022 // A3
data8 0x9D5FBD2E75520E65,0xC00B // A1
data8 0xC9B21BB881A4DDF8,0x48EFEAB06FBA0207 // A13,A12
data8 0xC6A6E8550CBC188F,0x45E4F3D26238B099 // A9,A8
data8 0xC3A20427DF1B110A,0x42E24F3D636F2E4E // A5,A4
data8 0xC1A4D12A82280CFB,0x4016 // A2
data8 0xEF46D8DCCA9E8197,0x3FD2 // A0
//(-8;-7)
data8 0xCE0946982B27DE5B,0x4D15DBC6664E2DD2 // A15,A14
data8 0xCA3C769F6B3B2B93,0x49497251CD0C4363 // A11,A10
data8 0xC67384066C47F489,0x458281393433AB28 // A7,A6
data8 0x9EF3459926D0F14F,0xC02B // A3
data8 0x9D7BB7F2600DFF0B,0xC00E // A1
data8 0xCC22351326C939A7,0x4B3009431C4F1D3F // A13,A12
data8 0xC856FAADDD48815D,0x476502BC3ECA040C // A9,A8
data8 0xC4920C2A84173810,0x43A255C052525F99 // A5,A4
data8 0xC1C73B6554011EFA,0x401C // A2
data8 0x954612700ADF8317,0xBFD8 // A0
//(-9;-8)
data8 0xD102F5CC7B590D3A,0x4FDD0F1C30E4EB22 // A15,A14
data8 0xCC6A02912B0DF650,0x4B44AB18E4FCC159 // A11,A10
data8 0xC7D64314B4A2FAAB,0x46B2C334AE5E2D34 // A7,A6
data8 0xE2598724F7E28E99,0xC034 // A3
data8 0xB12F6FE2E195452C,0xC011 // A1
data8 0xCEB507747AF9356A,0x4D907802C08BA48F // A13,A12
data8 0xCA2096E3DC29516F,0x48FAF6ED046A1DB7 // A9,A8
data8 0xC59043D21BA5EE56,0x446D5FE468B30450 // A5,A4
data8 0xF5460A8196B59C83,0x4022 // A2
data8 0xB108F35A8EDA92D5,0xBFDD // A0
//(-10;-9)
data8 0xD420430D91F8265B,0x52C406CAAAC9E0EE // A15,A14
data8 0xCEB2ECDDDAA3DAD1,0x4D580FDA97F92E3A // A11,A10
data8 0xC94A8A192341B5D4,0x47F1E4D8C690D07B // A7,A6
data8 0xDD0C5F920C2F0D2B,0xC03E // A3
data8 0xDD7BED3631657B48,0xC014 // A1
data8 0xD167F410E64E90A4,0x500DFFED20F714A7 // A13,A12
data8 0xCBFEE6D9043169E9,0x4AA4174F64B40AA7 // A9,A8
data8 0xC698D1A9AF0AB9C2,0x4541EDE14987A887 // A5,A4
data8 0xBF9F43D461B3DE6E,0x4029 // A2
data8 0xF3891A50642FAF26,0x3FE1 // A0
//(-11;-10)
data8 0xD75F0EEAF769D42A,0x55CBB72C8869183A // A15,A14
data8 0xD113A4EF80394F77,0x4F822A0B96B3ECA9 // A11,A10
data8 0xCACED38DC75763CB,0x493E3B5522D2D028 // A7,A6
data8 0x8FA8FB5C92533701,0xC049 // A3
data8 0x98453EDB9339C24E,0xC018 // A1
data8 0xD43778026CCD4B20,0x52A5627753273B9B // A13,A12
data8 0xCDF0F718DD7E1214,0x4C600B34582911EB // A9,A8
data8 0xC7AE7EE7F112362C,0x46200599439C264F // A5,A4
data8 0xB5249C335342B5BC,0x4030 // A2
data8 0x881550711D143475,0x3FE4 // A0
//(-12;-11)
data8 0xDAB9C724EEEE2BBB,0x58EEC971340EDDBA // A15,A14
data8 0xD38A8C8AE63BD8BF,0x51C05DB21CEE00D3 // A11,A10
data8 0xCC607594C311C12D,0x4A9585BD5BE6AB57 // A7,A6
data8 0xF26D282C36EC0E66,0xC053 // A3
data8 0xE467DF1FA674BFAE,0xC01B // A1
data8 0xD721DE506999AA9C,0x5555B34F71B45132 // A13,A12
data8 0xCFF4619A476BF76F,0x4E29B2F2BBE7A67E // A9,A8
data8 0xC8CCF27629D48EDC,0x47044715F991AB46 // A5,A4
data8 0xCBC92FB9BDAA928D,0x4037 // A2
data8 0xCE27C4F01CF53284,0xBFE6 // A0
//(-13;-12)
data8 0xDE3295B24355C5A1,0x5C2B447E298B562D // A15,A14
data8 0xD615A35CB5E92103,0x54106AB089C95E8C // A11,A10
data8 0xCDFEC7D935019005,0x4BF8C4C685F01B83 // A7,A6
data8 0x820899603D9A74D5,0xC05F // A3
data8 0xB9949916F8DF4AC4,0xC01F // A1
data8 0xDA23373DBA0B7548,0x581CBA0AF7F45C01 // A13,A12
data8 0xD20929836BB30934,0x500386409A7076D6 // A9,A8
data8 0xC9F480173FEAF90B,0x47F1ACB14B810793 // A5,A4
data8 0x86881B8674DBF205,0x403F // A2
data8 0x8CFAFA9A142C1FF0,0x3FED // A0
//(-14;-13)
data8 0xE1C33F356FA2C630,0x5F8038B8AA919DD7 // A15,A14
data8 0xD8B3F0167E14982D,0x5671496400BAE0DB // A11,A10
data8 0xCFA82FA4F5D25C3E,0x4D663DB008328C58 // A7,A6
data8 0xAE426731C9B94980,0xC06A // A3
data8 0xA264C84BB8A66F86,0xC023 // A1
data8 0xDD3B26E34762ED1E,0x5AF72F76E3C1B793 // A13,A12
data8 0xD42E476507E3D06E,0x51EAD96CDD881DFA // A9,A8
data8 0xCB25095F498DB15F,0x48E4B9FDEBFE24B5 // A5,A4
data8 0xCE076A5A116C1D32,0x4046 // A2
data8 0x94001BF5A24966F5,0x3FF1 // A0
//(-15;-14)
data8 0xE56DB8B72D7156FF,0x62EAB0CDB22539BE // A15,A14
data8 0xDB63D76B0D3457E7,0x58E254823D0AE4FF // A11,A10
data8 0xD15F060BF548404A,0x4EDE65C20CD4E961 // A7,A6
data8 0x900DA565ED76C19D,0xC076 // A3
data8 0x9868C809852DA712,0xC027 // A1
data8 0xE067CCDA0408AAF0,0x5DE5A79C5C5C54AF // A13,A12
data8 0xD6611ADBF5958ED0,0x53E0294092BE9677 // A9,A8
data8 0xCC5EA28D90EE8C5D,0x49E014930EF336EE // A5,A4
data8 0xB57930DCE7A61AE8,0x404E // A2
data8 0x976BEC1F30DF151C,0x3FF5 // A0
LOCAL_OBJECT_END(lgamma_data)
.section .text
GLOBAL_LIBM_ENTRY(__libm_lgamma)
{ .mfi
getf.exp GR_SignExp = f8
frcpa.s1 FR_C,p9 = f1,f8
mov GR_ExpMask = 0x1ffff
}
{ .mfi
addl GR_ad_Data = @ltoff(lgamma_data),gp
fcvt.fx.s1 FR_int_N = f8
mov GR_2_25 = 0x4002 // 2.25
};;
{ .mfi
getf.d GR_ArgAsIs = f8
fclass.m p13,p0 = f8,0x1EF // is x NaTVal, NaN,
// +/-0, +/-INF or +/-deno?
mov GR_ExpBias = 0xFFFF
}
{ .mfi
ld8 GR_ad_Data = [GR_ad_Data]
fcvt.fx.trunc.s1 FR_int_Ntrunc = f8
mov GR_ExpOf256 = 0x10007
};;
{ .mfi
mov GR_ExpOf2 = 0x10000
fcmp.lt.s1 p14,p15 = f8,f0 // p14 if x<0
dep.z GR_Ind = GR_SignExp,8,4
}
{ .mfi
and GR_Exp = GR_SignExp,GR_ExpMask
fma.s1 FR_2 = f1,f1,f1
cmp.lt p10,p0 = GR_SignExp,GR_ExpBias
};;
{ .mfi
add GR_ad_1 = 0xB80,GR_ad_Data
fnorm.s1 FR_NormX = f8
shr.u GR_Arg = GR_ArgAsIs,48
}
{ .mib
add GR_ad_Co = GR_Ind,GR_ad_Data
add GR_ad_Ce = 0x10,GR_ad_Data
// jump if the input argument is NaTVal, NaN, +/-0, +/-INF or +/-deno
(p13) br.cond.spnt lgamma_spec
};;
lgamma_common:
{ .mfi
ldfpd FR_LocalMin,FR_05 = [GR_ad_1],16
fmerge.se FR_x = f1,f8
add GR_ad_2 = 0xBC0,GR_ad_Data
}
{ .mfb
add GR_ad_Ce = GR_Ind,GR_ad_Ce
fms.s1 FR_w = f8,f1,f1 // x-1
// jump if the input argument is positive and less than 1.0
(p10) br.cond.spnt lgamma_0_1
};;
{ .mfi
ldfe FR_C01 = [GR_ad_Co],32
fnma.s1 FR_InvX = FR_C,f8,f1 // NR iteration #1
(p15) cmp.lt.unc p8,p0 = GR_ExpOf256,GR_SignExp
}
{ .mib
ldfe FR_C11 = [GR_ad_Ce],32
(p15) cmp.lt.unc p11,p0 = GR_Arg,GR_2_25
// jump if the input argument isn't less than 512.0
(p8) br.cond.spnt lgamma_pstirling
};;
{ .mfi
ldfe FR_C21 = [GR_ad_Co],32
(p14) fms.s1 FR_r = FR_C,f8,f1 // reduced arg for log(x)
(p14) cmp.lt.unc p0,p9 = GR_Exp,GR_ExpOf256
}
{ .mib
ldfe FR_C31 = [GR_ad_Ce],32
add GR_ad_Co7 = 0x12C0,GR_ad_2
// jump if the input argument is from range [1.0; 2.25)
(p11) br.cond.spnt lgamma_1_2
};;
{ .mfi
ldfe FR_C41 = [GR_ad_Co],32
fcvt.xf FR_N = FR_int_N
add GR_ad_Ce7 = 0x1310,GR_ad_2
}
{ .mfb
ldfe FR_C51 = [GR_ad_Ce],32
(p14) fma.s1 FR_5 = FR_2,FR_2,f1
// jump if the input argument is less or equal to -512.0
(p9) br.cond.spnt lgamma_negstirling
};;
{ .mfi
ldfe FR_C61 = [GR_ad_Co],32
(p14) fcvt.xf FR_Ntrunc = FR_int_Ntrunc
shr GR_Ind = GR_Ind,4
}
{ .mfi
ldfe FR_C71 = [GR_ad_Ce],32
(p14) fma.s1 FR_Xp1 = f1,f1,FR_NormX // x+1
cmp.eq p6,p7 = GR_ExpOf2,GR_SignExp
};;
.pred.rel "mutex",p6,p7
{ .mfi
ldfe FR_C81 = [GR_ad_Co],32
(p6) fma.s1 FR_x = f0,f0,FR_NormX
shladd GR_Offs7 = GR_Ind,2,GR_Ind // (ind*16)*5
}
{ .mfi
ldfe FR_C91 = [GR_ad_Ce],32
(p7) fms.s1 FR_x = FR_x,f1,f1
add GR_ad_Co7 = 0x800,GR_ad_Data
};;
{ .mfi
ldfe FR_CA1 = [GR_ad_Co],32
(p14) fma.s1 FR_3 = f1,f1,FR_2
shladd GR_Offs7 = GR_Ind,1,GR_Offs7 // (ind*16)*7
}
{ .mfi
ldfe FR_C00 = [GR_ad_Ce],32
(p14) fma.s1 FR_Xp4 = FR_2,FR_2,FR_NormX
add GR_ad_Ce7 = 0x810,GR_ad_Data
};;
{ .mfi
ldfe FR_C10 = [GR_ad_Co],32
(p6) fms.s1 FR_Xm2 = FR_w,f1,f1
add GR_ad_Co7 = GR_ad_Co7,GR_Offs7
}
{ .mfi
ldfe FR_C20 = [GR_ad_Ce],32
(p14) fma.s1 FR_r2 = FR_r,FR_r,f0 // log(x)
add GR_ad_Ce7 = GR_ad_Ce7,GR_Offs7
};;
{ .mfi
ldfe FR_C30 = [GR_ad_Co],32
(p14) fms.s1 FR_Xf = FR_NormX,f1,FR_N // xf = x - [x]
(p14) mov GR_Arg17 = 0xC031 // -17
}
{ .mfi
ldfe FR_C40 = [GR_ad_Ce],32
(p14) fma.s1 FR_Xp5 = FR_5,f1,FR_NormX
(p14) sub GR_Exp = GR_Exp,GR_ExpBias
};;
{ .mfi
ldfe FR_C50 = [GR_ad_Co7],32
(p14) fms.s1 FR_Xfr = FR_Xp1,f1,FR_Ntrunc // xfr = (x+1) - [x]
(p14) cmp.lt.unc p13,p0 = GR_Arg,GR_Arg17
}
{ .mfb
ldfe FR_C60 = [GR_ad_Ce7],32
(p14) fma.s1 FR_Xp10 = FR_5,FR_2,FR_NormX
// jump if the input argument is negative and great than -17.0
(p13) br.cond.spnt lgamma_negrecursion
};;
{ .mfi
ldfe FR_C70 = [GR_ad_Co7],32
fma.s1 FR_C01 = FR_x,f1,FR_C01
(p14) add GR_ad_Ce = 0x1310,GR_ad_2
}
{ .mfi
ldfe FR_C80 = [GR_ad_Ce7],32
fma.s1 FR_C11 = FR_x,f1,FR_C11
(p14) add GR_ad_Co = 0x12C0,GR_ad_2
};;
{ .mfi
ldfe FR_C90 = [GR_ad_Co7],32
fma.s1 FR_C21 = FR_x,f1,FR_C21
nop.i 0
}
{ .mfi
ldfe FR_CA0 = [GR_ad_Ce7],32
fma.s1 FR_C31 = FR_x,f1,FR_C31
nop.i 0
};;
{ .mfi
ldfe FR_CN = [GR_ad_Co7],32
fma.s1 FR_C41 = FR_x,f1,FR_C41
nop.i 0
}
{ .mfi
(p14) ldfpd FR_P5,FR_P4 = [GR_ad_1],16
fma.s1 FR_C51 = FR_x,f1,FR_C51
nop.i 0
};;
{ .mfi
(p14) ldfpd FR_P3,FR_P2 = [GR_ad_2],16
fma.s1 FR_C61 = FR_x,f1,FR_C61
nop.i 0
}
{ .mfi
(p14) ldfe FR_Ln2 = [GR_ad_1]
fma.s1 FR_C71 = FR_x,f1,FR_C71
nop.i 0
};;
{ .mfi
(p14) ldfpd FR_S28,FR_S26 = [GR_ad_Co],16
fma.s1 FR_C81 = FR_x,f1,FR_C81
add GR_ad_2 = 0x60,GR_ad_2
}
{ .mfi
(p14) ldfpd FR_S24,FR_S22 = [GR_ad_Ce],16
fma.s1 FR_C91 = FR_x,f1,FR_C91
nop.i 0
};;
{ .mfi
(p14) ldfpd FR_S20,FR_S18 = [GR_ad_Co],16
fma.s1 FR_CA1 = FR_x,f1,FR_CA1
nop.i 0
}
{ .mfi
(p14) ldfpd FR_S16,FR_S14 = [GR_ad_Ce],16
fma.s1 FR_C01 = FR_C01,FR_x,FR_C00
nop.i 0
};;
{ .mfi
(p14) getf.exp GR_SignExp = FR_Xf
fma.s1 FR_C11 = FR_C11,FR_x,FR_C10
nop.i 0
}
{ .mfi
(p14) ldfe FR_S12 = [GR_ad_Co],16
fma.s1 FR_C21 = FR_C21,FR_x,FR_C20
nop.i 0
};;
{ .mfi
(p14) getf.sig GR_Sig = FR_Xf
(p14) frcpa.s1 FR_InvXf,p0 = f1,FR_Xf
nop.i 0
}
{ .mfi
(p14) ldfe FR_S10 = [GR_ad_Ce],16
fma.s1 FR_C41 = FR_C41,FR_x,FR_C40
nop.i 0
};;
{ .mfi
(p14) ldfe FR_S8 = [GR_ad_Co],16
fma.s1 FR_C51 = FR_C51,FR_x,FR_C50
nop.i 0
}
{ .mfi
(p14) ldfe FR_S6 = [GR_ad_Ce],16
fma.s1 FR_C61 = FR_C61,FR_x,FR_C60
(p14) and GR_Expf = GR_SignExp,GR_ExpMask
};;
{ .mfi
(p14) sub GR_Expf = GR_Expf,GR_ExpBias
fma.s1 FR_C71 = FR_C71,FR_x,FR_C70
(p14) shl GR_Ind = GR_Sig,1
}
{ .mfi
(p14) ldfe FR_S4 = [GR_ad_Co],16
fma.s1 FR_C81 = FR_C81,FR_x,FR_C80
(p14) cmp.eq.unc p8,p0 = 0,GR_Sig
};;
{ .mfi
(p14) setf.sig FR_int_Nf = GR_Expf
fma.s1 FR_C91 = FR_C91,FR_x,FR_C90
(p14) shr.u GR_Ind = GR_Ind,56
}
{ .mfb
(p14) ldfe FR_S2 = [GR_ad_Ce],16
fma.s1 FR_CA1 = FR_CA1,FR_x,FR_CA0
// jump if the input argument is integer number from range (-512.0;-17.0]
(p8) br.cond.spnt lgamma_singularity
};;
{ .mfi
(p14) getf.sig GR_Sig = FR_int_Ntrunc
fma.s1 FR_C01 = FR_C01,FR_C11,f0
nop.i 0
}
{ .mfi
(p14) shladd GR_ad_T = GR_Ind,4,GR_ad_2
fma.s1 FR_C31 = FR_C31,FR_x,FR_C30
nop.i 0
};;
{ .mfi
(p14) ldfe FR_Tf = [GR_ad_T]
(p14) fms.s1 FR_rf = FR_InvXf,FR_Xf,f1 // reduced arg for log({x})
(p14) extr.u GR_Ind = GR_ArgAsIs,44,8
}
{ .mfi
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
fma.s1 FR_C21 = FR_C21,FR_C41,f0
mov GR_SignOfGamma = 1
};;
{ .mfi
nop.m 0
fma.s1 FR_C51 = FR_C51,FR_C61,f0
(p14) tbit.z.unc p8,p0 = GR_Sig,0
}
{ .mfi
(p14) shladd GR_ad_T = GR_Ind,4,GR_ad_2
(p6) fma.s1 FR_CN = FR_CN,FR_Xm2,f0
nop.i 0
};;
{ .mfi
(p14) setf.sig FR_int_N = GR_Exp
fma.s1 FR_C71 = FR_C71,FR_C81,f0
(p8) sub GR_SignOfGamma = r0,GR_SignOfGamma
}
{ .mfi
nop.m 0
(p14) fma.s1 FR_Xf2 = FR_Xf,FR_Xf,f0
nop.i 0
};;
{ .mfi
(p14) ldfe FR_T = [GR_ad_T]
fma.s1 FR_C91 = FR_C91,FR_CA1,f0
nop.i 0
}
{ .mfi
nop.m 0
(p14) fma.s1 FR_r2 = FR_r,FR_r,f0
nop.i 0
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_C01 = FR_C01,FR_C31,f0
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
(p14) fma.s1 FR_P54 = FR_P5,FR_r,FR_P4
nop.i 0
};;
{ .mfi
nop.m 0
(p14) fma.s1 FR_P32 = FR_P3,FR_r,FR_P2
nop.i 0
}
{ .mfb
nop.m 0
(p14) fma.s1 FR_P54f = FR_P5,FR_rf,FR_P4
// jump if the input argument is non-integer from range (-512.0;-17.0]
(p14) br.cond.spnt lgamma_negpoly
};;
{ .mfi
nop.m 0
fma.s1 FR_C21 = FR_C21,FR_C51,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_C71 = FR_C71,FR_C91,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_CN = FR_C01,FR_CN,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_C21 = FR_C21,FR_C71,f0
nop.i 0
};;
{ .mfb
nop.m 0
fma.d.s0 f8 = FR_C21,FR_CN,f0
br.ret.sptk b0 // exit for arguments from range [2.25; 512.0)
};;
// branch for calculating of ln(GAMMA(x)) for -512 < x < -17
//---------------------------------------------------------------------
.align 32
lgamma_negpoly:
{ .mfi
nop.m 0
fma.s1 FR_Xf4 = FR_Xf2,FR_Xf2,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf2,FR_S26
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S24 = FR_S24,FR_Xf2,FR_S22
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S20 = FR_S20,FR_Xf2,FR_S18
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S16 = FR_S16,FR_Xf2,FR_S14
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S12 = FR_S12,FR_Xf2,FR_S10
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S8 = FR_S8,FR_Xf2,FR_S6
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S4 = FR_S4,FR_Xf2,FR_S2
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_rf2 = FR_rf,FR_rf,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P32f = FR_P3,FR_rf,FR_P2 // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_r3 = FR_r2,FR_r,f0 // log(x)
nop.i 0
}
{ .mfi
nop.m 0
fcvt.xf FR_Nf = FR_int_Nf // log({x})
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf4,FR_S24
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_Xf8 = FR_Xf4,FR_Xf4,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S20 = FR_S20,FR_Xf4,FR_S16
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_C21 = FR_C21,FR_C51,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S12 = FR_S12,FR_Xf4,FR_S8
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_C71 = FR_C71,FR_C91,f0
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_P10 = FR_r2,FR_05,FR_r // log(x)
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P54 = FR_P54,FR_r2,FR_P32 // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_P10f = FR_rf2,FR_05,FR_rf // log({x})
nop.i 0
}
{ .mfi
nop.m 0
fcvt.xf FR_N = FR_int_N // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_rf3 = FR_rf2,FR_rf,f0 // log({x})
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P54f = FR_P54f,FR_rf2,FR_P32f // log({x})
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf8,FR_S20
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_TpNxLn2f = FR_Nf,FR_Ln2,FR_Tf // log({x})
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_CN = FR_C01,FR_CN,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_C21 = FR_C21,FR_C71,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54 = FR_P54,FR_r3,FR_P10 // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_TpNxLn2 = FR_N,FR_Ln2,FR_T // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54f = FR_P54f,FR_rf3,FR_P10f // log({x})
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf8,FR_S12
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_C21 = FR_C21,FR_CN,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnX = FR_TpNxLn2,f1,FR_P54 // log(x)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnXf = FR_TpNxLn2f,f1,FR_P54f // log({x})
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf4,FR_S4
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnX = FR_LnX,f1,FR_LnXf
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_S28 = FR_S28,FR_Xf2,FR_C21
nop.i 0
};;
{ .mfb
nop.m 0
fms.d.s0 f8 = FR_S28,f1,FR_LnX
br.ret.sptk b0
};;
// branch for calculating of ln(GAMMA(x)) for x >= 512
//---------------------------------------------------------------------
.align 32
lgamma_pstirling:
{ .mfi
ldfpd FR_P5,FR_P4 = [GR_ad_1],16
nop.f 0
and GR_Exp = GR_SignExp,GR_ExpMask
}
{ .mfi
ldfpd FR_P3,FR_P2 = [GR_ad_2],16
fma.s1 FR_InvX = FR_C,FR_InvX,FR_C // NR iteration #1
mov GR_ExpBias = 0xffff
};;
{ .mfi
ldfe FR_Ln2 = [GR_ad_1],16
nop.f 0
sub GR_Exp = GR_Exp,GR_ExpBias
};;
{ .mfi
ldfpd FR_W4,FR_OvfBound = [GR_ad_2],16
nop.f 0
nop.i 0
};;
{ .mfi
setf.sig FR_int_N = GR_Exp
fms.s1 FR_r = FR_C,f8,f1
nop.i 0
};;
{ .mmf
getf.sig GR_Sig = FR_NormX
ldfe FR_LnSqrt2Pi = [GR_ad_1],16
nop.f 0
};;
{ .mmf
ldfe FR_W2 = [GR_ad_2],16
nop.m 0
fnma.s1 FR_InvX2 = FR_InvX,FR_NormX,f1 // NR iteration #2
};;
{ .mfi
add GR_ad_2 = 0x40,GR_ad_2
nop.f 0
shl GR_Ind = GR_Sig,1
};;
{ .mfi
mov GR_SignOfGamma = 1
nop.f 0
shr.u GR_Ind = GR_Ind,56
};;
{ .mfi
shladd GR_ad_2 = GR_Ind,4,GR_ad_2
fma.s1 FR_r2 = FR_r,FR_r,f0
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
};;
{ .mfi
ldfe FR_T = [GR_ad_2]
fma.s1 FR_P54 = FR_P5,FR_r,FR_P4
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P32 = FR_P3,FR_r,FR_P2
nop.i 0
};;
{ .mfi
nop.m 0
fcmp.le.s1 p6,p0 = FR_OvfBound,FR_NormX
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_InvX2 = FR_InvX,FR_InvX2,FR_InvX // NR iteration #2
nop.i 0
};;
{ .mfi
nop.m 0
fcvt.xf FR_N = FR_int_N
nop.i 0
}
{ .mfb
nop.m 0
nop.f 0
// jump if x is great than OVERFLOW_BOUNDARY
(p6) br.cond.spnt lgamma_overflow
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_r3 = FR_r2,FR_r,f0
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
fnma.s1 FR_P10 = FR_r2,FR_05,FR_r
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54 = FR_P54,FR_r2,FR_P32
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_InvX = FR_InvX2,FR_NormX,f1 // NR iteration #3
nop.i 0
};;
{ .mfi
nop.m 0
fms.s1 FR_Xm05 = FR_NormX,f1,FR_05 // (x-1/2)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_TpNxLn2 = FR_N,FR_Ln2,FR_T
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54 = FR_P54,FR_r3,FR_P10
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_InvX = FR_InvX2,FR_InvX,FR_InvX2 // NR iteration #3
nop.i 0
}
{ .mfi
nop.m 0
fms.s1 FR_LnSqrt2Pi = FR_LnSqrt2Pi,f1,FR_NormX // ln(sqrt(2*Pi))-x
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnX = FR_TpNxLn2,f1,FR_P54
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_InvX2 = FR_InvX,FR_InvX,f0
nop.i 0
};;
{ .mfi
nop.m 0
// (x-1/2)*ln(x)+ln(sqrt(2*Pi))-x
fma.s1 FR_LnX = FR_LnX,FR_Xm05,FR_LnSqrt2Pi
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_W2 = FR_W4,FR_InvX2,FR_W2 // W2 + W4/x^2
nop.i 0
};;
{ .mfb
nop.m 0
fma.d.s0 f8 = FR_InvX,FR_W2,FR_LnX
br.ret.sptk b0
};;
// branch for calculating of ln(GAMMA(x)) for x < -512
//---------------------------------------------------------------------
.align 32
lgamma_negstirling:
{ .mfi
ldfpd FR_P5,FR_P4 = [GR_ad_1],16
fms.s1 FR_Xf = FR_NormX,f1,FR_N // xf = x - [x]
and GR_Exp = GR_SignExp,GR_ExpMask
}
{ .mfi
ldfpd FR_P3,FR_P2 = [GR_ad_2],16
fma.s1 FR_InvX = FR_C,FR_InvX,FR_C // NR iteration #1
mov GR_0x30033 = 0x30033
};;
{ .mfi
ldfe FR_Ln2 = [GR_ad_1],16
nop.f 0
extr.u GR_Ind = GR_ArgAsIs,44,8
}
{ .mib
ldfd FR_W4 = [GR_ad_2],16
// jump if x is less or equal to -2^52, i.e. x is big negative integer
cmp.leu.unc p7,p0 = GR_0x30033,GR_SignExp
(p7) br.cond.spnt lgamma_singularity
};;
{ .mfi
ldfpd FR_S28,FR_S26 = [GR_ad_Co7],16
nop.f 0
add GR_ad_LnT = 0x50,GR_ad_2
}
{ .mfi
ldfpd FR_S24,FR_S22 = [GR_ad_Ce7],16
nop.f 0
mov GR_ExpBias = 0xffff
};;
{ .mfi
ldfpd FR_S20,FR_S18 = [GR_ad_Co7],16
nop.f 0
shladd GR_ad_T = GR_Ind,4,GR_ad_LnT
}
{ .mfi
ldfpd FR_S16,FR_S14 = [GR_ad_Ce7],16
nop.f 0
sub GR_Exp = GR_Exp,GR_ExpBias
};;
{ .mfi
ldfe FR_S12 = [GR_ad_Co7],16
nop.f 0
nop.i 0
}
{ .mfi
ldfe FR_S10 = [GR_ad_Ce7],16
fms.s1 FR_r = FR_C,f8,f1
nop.i 0
};;
{ .mmf
ldfe FR_S8 = [GR_ad_Co7],16
ldfe FR_S6 = [GR_ad_Ce7],16
nop.f 0
};;
{ .mfi
ldfe FR_S4 = [GR_ad_Co7],16
fma.s1 FR_Xf2 = FR_Xf,FR_Xf,f0
nop.i 0
}
{ .mfi
ldfe FR_S2 = [GR_ad_Ce7],16
fnma.s1 FR_InvX2 = FR_InvX,FR_NormX,f1 // NR iteration #2
nop.i 0
};;
{ .mfi
setf.sig FR_int_N = GR_Exp
frcpa.s1 FR_InvXf,p9 = f1,FR_Xf // 1/xf
nop.i 0
}
{ .mfi
ldfe FR_LnSqrt2Pi = [GR_ad_1],16
nop.f 0
nop.i 0
};;
{ .mfi
getf.exp GR_SignExp = FR_Xf
nop.f 0
nop.i 0
}
{ .mfi
ldfe FR_W2 = [GR_ad_2],16
nop.f 0
nop.i 0
};;
{ .mfi
getf.sig GR_Sig = FR_Xf
fma.s1 FR_P54 = FR_P5,FR_r,FR_P4
nop.i 0
}
{ .mfi
ldfe FR_T = [GR_ad_T]
fma.s1 FR_P32 = FR_P3,FR_r,FR_P2
nop.i 0
};;
{ .mfi
and GR_Exp = GR_SignExp,GR_ExpMask
fma.s1 FR_r2 = FR_r,FR_r,f0
nop.i 0
}
{ .mfi
nop.m 0
fms.s1 FR_Xm05 = FR_NormX,f1,FR_05 // (x-1/2)
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_InvX2 = FR_InvX,FR_InvX2,FR_InvX // NR iteration #2
extr.u GR_Ind = GR_Sig,55,8
}
{ .mfi
sub GR_Exp = GR_Exp,GR_ExpBias
fma.s1 FR_Xf4 = FR_Xf2,FR_Xf2,f0
cmp.eq p6,p0 = 0,GR_Sig
};;
{ .mfi
setf.sig FR_int_Nf = GR_Exp
fma.s1 FR_S28 = FR_S28,FR_Xf2,FR_S26
shladd GR_ad_T = GR_Ind,4,GR_ad_LnT
}
{ .mfb
nop.m 0
fma.s1 FR_S24 = FR_S24,FR_Xf2,FR_S22
// jump if the input argument is integer number from range (-512.0;-17.0]
(p6) br.cond.spnt lgamma_singularity
};;
{ .mfi
getf.sig GR_Sig = FR_int_Ntrunc
fma.s1 FR_S20 = FR_S20,FR_Xf2,FR_S18
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S16 = FR_S16,FR_Xf2,FR_S14
nop.i 0
};;
{ .mfi
ldfe FR_Tf = [GR_ad_T]
fma.s1 FR_S12 = FR_S12,FR_Xf2,FR_S10
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S8 = FR_S8,FR_Xf2,FR_S6
mov GR_SignOfGamma = 1
};;
{ .mfi
nop.m 0
fms.s1 FR_rf = FR_InvXf,FR_Xf,f1 // reduced arg rf
tbit.z p8,p0 = GR_Sig,0
}
{ .mfi
nop.m 0
fma.s1 FR_r3 = FR_r2,FR_r,f0
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
};;
{ .mfi
nop.m 0
fcvt.xf FR_N = FR_int_N
(p8) sub GR_SignOfGamma = r0,GR_SignOfGamma
}
{ .mfi
nop.m 0
fnma.s1 FR_InvX = FR_InvX2,FR_NormX,f1 // NR iteration #3
nop.i 0
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_P54 = FR_P54,FR_r2,FR_P32
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
fnma.s1 FR_P10 = FR_r2,FR_05,FR_r
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_Xf8 = FR_Xf4,FR_Xf4,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf4,FR_S24
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S20 = FR_S20,FR_Xf4,FR_S16
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S12 = FR_S12,FR_Xf4,FR_S8
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_rf2 = FR_rf,FR_rf,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P54f = FR_P5,FR_rf,FR_P4
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P32f = FR_P3,FR_rf,FR_P2
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_InvX = FR_InvX2,FR_InvX,FR_InvX2 // NR iteration #3
nop.i 0
};;
{ .mfi
nop.m 0
fcvt.xf FR_Nf = FR_int_Nf
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_LnSqrt2Pi = FR_NormX,f1,FR_LnSqrt2Pi // x+ln(sqrt(2*Pi))
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54 = FR_P54,FR_r3,FR_P10
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf8,FR_S20
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_rf3 = FR_rf2,FR_rf,f0
nop.i 0
}
{ .mfi
nop.m 0
fnma.s1 FR_P10f = FR_rf2,FR_05,FR_rf
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_TpNxLn2 = FR_N,FR_Ln2,FR_T
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_P54f = FR_P54f,FR_rf2,FR_P32f
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_InvX2 = FR_InvX,FR_InvX,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf8,FR_S12
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_S4 = FR_S4,FR_Xf2,FR_S2
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_P54f = FR_P54f,FR_rf3,FR_P10f
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_TpNxLn2f = FR_Nf,FR_Ln2,FR_Tf
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnX = FR_TpNxLn2,f1,FR_P54
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_W2 = FR_W4,FR_InvX2,FR_W2
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_S28 = FR_S28,FR_Xf4,FR_S4
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnXf = FR_TpNxLn2f,f1,FR_P54f
nop.i 0
};;
{ .mfi
nop.m 0
fms.s1 FR_LnX = FR_LnX,FR_Xm05,FR_LnSqrt2Pi
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_LnX = FR_InvX,FR_W2,FR_LnX
nop.i 0
};;
{ .mfi
nop.m 0
fnma.s1 FR_LnX = FR_S28,FR_Xf2,FR_LnX
nop.i 0
};;
{ .mfb
nop.m 0
fms.d.s0 f8 = FR_LnX,f1,FR_LnXf
br.ret.sptk b0
};;
// branch for calculating of ln(GAMMA(x)) for 0 <= x < 1
//---------------------------------------------------------------------
.align 32
lgamma_0_1:
{ .mfi
ldfpd FR_P5,FR_P4 = [GR_ad_1],16
fms.s1 FR_x = FR_NormX,f1,f0 // x
mov GR_Arg025 = 0x3FD0
}
{ .mfi
ldfpd FR_P3,FR_P2 = [GR_ad_2],16
nop.f 0
add GR_ad_Co = 0x1C40,GR_ad_Data
};;
{ .mfi
ldfe FR_Ln2 = [GR_ad_1],0x50
nop.f 0
// p6 if arg < 0.25
cmp.lt p6,p9 = GR_Arg,GR_Arg025
}
{ .mfi
add GR_ad_2 = 0x40,GR_ad_2
nop.f 0
mov GR_Arg075 = 0x3FE8
};;
{ .mfi
ldfpd FR_Q8,FR_Q7 = [GR_ad_1],16
fma.s1 FR_w2 = FR_w,FR_w,f0
// p7 if 0.25 <= arg < 0.75
// p8 if 0.75 <= arg < 1.0
(p9) cmp.lt.unc p7,p8 = GR_Arg,GR_Arg075
}
{ .mfi
mov GR_Arg0875 = 0x3FEC
nop.f 0
sub GR_Exp = GR_Exp,GR_ExpBias
};;
{ .mfi
ldfpd FR_Q6,FR_Q5 = [GR_ad_2],16
nop.f 0
(p8) cmp.lt p9,p0 = GR_Arg,GR_Arg0875
}
{ .mfi
ldfpd FR_Q4,FR_Q3 = [GR_ad_1],16
nop.f 0
add GR_ad_Ce = 0x60,GR_ad_Co
};;
.pred.rel "mutex",p7,p8
{ .mfi
ldfd FR_Q2 = [GR_ad_2],16
fms.s1 FR_r = FR_C,f8,f1
(p7) mov GR_Offs = 0xC0
}
{ .mfi
setf.sig FR_int_N = GR_Exp
nop.f 0
(p8) mov GR_Offs = 0x180
};;
.pred.rel "mutex",p6,p7
{ .mfi
(p9) add GR_ad_Co = GR_Offs,GR_ad_Co
(p8) fms.s1 FR_x = FR_NormX,f1,f1 // x-1
nop.i 0
}
{ .mfi
(p9) add GR_ad_Ce = GR_Offs,GR_ad_Ce
(p7) fms.s1 FR_x = FR_NormX,f1,FR_LocalMin // x-LocalMin
cmp.lt p10,p0 = GR_Arg,GR_Arg0875
};;
lgamma_common_0_2:
{ .mfi
ldfpd FR_A17,FR_A16 = [GR_ad_Co],16
nop.f 0
nop.i 0
}
{ .mfi
ldfpd FR_A15,FR_A14 = [GR_ad_Ce],16
nop.f 0
nop.i 0
};;
{ .mfi
ldfpd FR_A13,FR_A12 = [GR_ad_Co],16
nop.f 0
(p10) extr.u GR_Ind = GR_ArgAsIs,44,8
}
{ .mfi
ldfpd FR_A11,FR_A10 = [GR_ad_Ce],16
nop.f 0
nop.i 0
};;
{ .mfi
ldfpd FR_A9,FR_A8 = [GR_ad_Co],16
(p10) fnma.s1 FR_Q1 = FR_05,FR_w2,FR_w
nop.i 0
}
{ .mfi
ldfpd FR_A7,FR_A6 = [GR_ad_Ce],16
(p10) fma.s1 FR_w3 = FR_w2,FR_w,f0
nop.i 0
};;
{ .mfi
(p10) getf.exp GR_SignExp_w = FR_w
(p10) fma.s1 FR_w4 = FR_w2,FR_w2,f0
nop.i 0
}
{ .mfi
(p10) shladd GR_ad_2 = GR_Ind,4,GR_ad_2
(p10) fma.s1 FR_r2 = FR_r,FR_r,f0
nop.i 0
};;
{ .mfi
(p10) ldfe FR_T = [GR_ad_2]
(p10) fma.s1 FR_P54 = FR_P5,FR_r,FR_P4
nop.i 0
}
{ .mfi
ldfe FR_A5 = [GR_ad_Co],16
(p10) fma.s1 FR_P32 = FR_P3,FR_r,FR_P2
nop.i 0
};;
{ .mfi
ldfe FR_A4 = [GR_ad_Ce],16
fma.s1 FR_x2 = FR_x,FR_x,f0
(p10) and GR_Exp_w = GR_ExpMask, GR_SignExp_w
}
{ .mfi
ldfe FR_A3 = [GR_ad_Co],16
nop.f 0
(p10) mov GR_fff9 = 0xfff9
};;
// p13 <== large w __libm_lgamma
// p14 <== small w __libm_lgamma
{ .mfi
ldfe FR_A2 = [GR_ad_Ce],16
(p10) fma.s1 FR_Q8 = FR_Q8,FR_w,FR_Q7
(p10) cmp.ge.unc p13,p14 = GR_Exp_w,GR_fff9
}
{ .mfi
ldfe FR_A1 = [GR_ad_Co],16
(p10) fma.s1 FR_Q6 = FR_Q6,FR_w,FR_Q5
nop.i 0
};;
{ .mfi
ldfe FR_A0 = [GR_ad_Ce],16
(p10) fma.s1 FR_Q4 = FR_Q4,FR_w,FR_Q3
nop.i 0
}
{ .mfi
nop.m 0
(p10) fma.s1 FR_Q2 = FR_Q2,FR_w3,FR_Q1
nop.i 0
};;
{ .mfi
// set p11 if signgum is 32-bit int
// set p12 if signgum is 64-bit int
cmp.eq p12,p11 = 8,r34
(p10) fma.s1 FR_r3 = FR_r2,FR_r,f0
nop.i 0
}
{ .mfi
nop.m 0
(p10) fnma.s1 FR_P10 = FR_r2,FR_05,FR_r
mov GR_SignOfGamma = 1
};;
.pred.rel "mutex",p11,p12
{ .mfi
// store sign of gamma(x) as 32-bit int
(p11) st4 [r33] = GR_SignOfGamma
fma.s1 FR_A17 = FR_A17,FR_x,FR_A16
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p12) st8 [r33] = GR_SignOfGamma
fma.s1 FR_A15 = FR_A15,FR_x,FR_A14
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fcvt.xf FR_N = FR_int_N
nop.i 0
}
{ .mfi
nop.m 0
(p10) fma.s1 FR_P54 = FR_P54,FR_r2,FR_P32
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A13 = FR_A13,FR_x,FR_A12
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A11 = FR_A11,FR_x,FR_A10
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A9 = FR_A9,FR_x,FR_A8
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A7 = FR_A7,FR_x,FR_A6
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fma.s1 FR_Qlo = FR_Q8,FR_w2,FR_Q6
nop.i 0
}
{ .mfi
nop.m 0
(p10) fma.s1 FR_w6 = FR_w3,FR_w3,f0
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fma.s1 FR_Qhi = FR_Q4,FR_w4,FR_Q2
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A5 = FR_A5,FR_x,FR_A4
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fma.s1 FR_TpNxLn2 = FR_N,FR_Ln2,FR_T
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A3 = FR_A3,FR_x,FR_A2
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fma.s1 FR_P54 = FR_P54,FR_r3,FR_P10
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A1 = FR_A1,FR_x,FR_A0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A17 = FR_A17,FR_x2,FR_A15
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A13 = FR_A13,FR_x2,FR_A11
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A9 = FR_A9,FR_x2,FR_A7
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_x4 = FR_x2,FR_x2,f0
nop.i 0
};;
{ .mfi
nop.m 0
(p14) fma.s1 FR_LnX = FR_Qlo,FR_w6,FR_Qhi
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A5 = FR_A5,FR_x2,FR_A3
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_LnX = FR_TpNxLn2,f1,FR_P54
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A17 = FR_A17,FR_x4,FR_A13
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_x8 = FR_x4,FR_x4,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A9 = FR_A9,FR_x4,FR_A5
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A17 = FR_A17,FR_x8,FR_A9
nop.i 0
};;
{ .mfi
nop.m 0
(p10) fms.s1 FR_A1 = FR_A1,f1,FR_LnX
nop.i 0
};;
{ .mfb
nop.m 0
fma.d.s0 f8 = FR_A17,FR_x2,FR_A1
br.ret.sptk b0
};;
// branch for calculating of ln(GAMMA(x)) for 1.0 <= x < 2.25
//---------------------------------------------------------------------
.align 32
lgamma_1_2:
{ .mfi
add GR_ad_Co = 0x10B0,GR_ad_1
fcmp.eq.s1 p12,p0 = f1,FR_w
mov GR_Arg125 = 0x3FF4
}
{ .mfi
add GR_ad_Ce = 0x1110,GR_ad_1
nop.f 0
mov GR_Arg175 = 0x3FFC
};;
{ .mfi
mov GR_SignOfGamma = 1
fcmp.eq.s1 p13,p0 = f1,FR_NormX
cmp.lt p6,p9 = GR_Arg,GR_Arg125 // 1.0 <= x < 1.25
}
{ .mfi
// set p10 if signgum is 32-bit int
// set p11 if signgum is 64-bit int
cmp.eq p11,p10 = 8,r34
nop.f 0
cmp.ge p8,p0 = GR_Arg,GR_Arg175 // x >= 1.75
};;
.pred.rel "mutex",p10,p11
{ .mfi
// store sign of gamma(x) as 32-bit int
(p10) st4 [r33] = GR_SignOfGamma
(p12) fma.d.s0 f8 = f0,f0,f0
(p9) cmp.lt.unc p7,p0 = GR_Arg,GR_Arg175 // 1.25 <= x < 1.75
}
{ .mib
// store sign of gamma(x) as 64-bit int
(p11) st8 [r33] = GR_SignOfGamma
mov GR_Offs = 0
(p12) br.ret.spnt b0 // fast exit for 2.0
};;
.pred.rel "mutex",p7,p8
{ .mfi
(p7) mov GR_Offs = 0xC0
(p7) fms.s1 FR_x = FR_w,f1,FR_LocalMin
nop.i 0
}
{ .mfb
(p8) mov GR_Offs = 0x180
(p13) fma.d.s0 f8 = f0,f0,f0
(p13) br.ret.spnt b0 // fast exit for 1.0
};;
.pred.rel "mutex",p6,p8
{ .mfi
add GR_ad_Co = GR_ad_Co,GR_Offs
(p8) fms.s1 FR_x = FR_w,f1,f1
cmp.eq p0,p10 = r0,r0
}
{ .mfb
add GR_ad_Ce = GR_ad_Ce,GR_Offs
(p6) fma.s1 FR_x = f0,f0,FR_w
br.cond.sptk lgamma_common_0_2
};;
// branch for calculating of ln(GAMMA(x)) for -17 < x < 0
//---------------------------------------------------------------------
.align 32
lgamma_negrecursion:
{ .mfi
getf.d GR_ArgXfrAsIs = FR_Xfr
fma.s1 FR_Xp2 = FR_2,f1,FR_NormX
mov GR_Arg05 = 0x3FE
}
{ .mfi
add GR_ad_Roots = 0x1390,GR_ad_1
fma.s1 FR_NormX = FR_NormX,FR_Xfr,f0
mov GR_Arg075 = 0x3FE8
};;
{ .mfi
getf.sig GR_Sig = FR_int_Ntrunc
fma.s1 FR_Xp3 = FR_2,f1,FR_Xp1
shl GR_Arg05 = GR_Arg05,52
}
{ .mfi
mov GR_Arg025 = 0x3FD0
fma.s1 FR_Xp6 = FR_5,f1,FR_Xp1
add GR_ad_Co = 0x1C40,GR_ad_Data
};;
{ .mfi
add GR_ad_Dx = 8,GR_ad_Roots
fma.s1 FR_Xp7 = FR_2,f1,FR_Xp5
shr.u GR_ArgXfr = GR_ArgXfrAsIs,48
}
{ .mfi
add GR_ad_Ce = 0x60,GR_ad_Co
fma.s1 FR_Xp8 = FR_3,f1,FR_Xp5
cmp.lt p6,p0 = GR_ArgXfrAsIs,GR_Arg05
};;
{ .mfi
and GR_RootInd = 0xF,GR_Sig
fma.s1 FR_Xp9 = FR_2,FR_2,FR_Xp5
// p10 if arg < 0.25
cmp.lt p10,p14 = GR_ArgXfr,GR_Arg025
}
{ .mfi
(p6) add GR_ad_Roots = 0x120,GR_ad_Roots
fma.s1 FR_Xp11 = f1,f1,FR_Xp10
(p6) add GR_ad_Dx = 0x120,GR_ad_Dx
};;
{ .mfi
shladd GR_ad_Root = GR_RootInd,4,GR_ad_Roots
fma.s1 FR_Xp12 = FR_2,f1,FR_Xp10
// p11 if 0.25 <= arg < 0.75
// p12 if 0.75 <= arg < 1.0
(p14) cmp.lt.unc p11,p12 = GR_ArgXfr,GR_Arg075
}
{ .mfi
shladd GR_ad_Dx = GR_RootInd,4,GR_ad_Dx
fma.s1 FR_Xp13 = FR_3,f1,FR_Xp10
cmp.eq p0,p13 = 0,GR_Sig
};;
{ .mfi
ld8 GR_Root = [GR_ad_Root]
fma.s1 FR_Xp14 = FR_2,FR_2,FR_Xp10
(p12) mov GR_Offs = 0x180
}
{ .mfi
ldfd FR_Root = [GR_ad_Root]
fma.s1 FR_Xp15 = FR_5,f1,FR_Xp10
and GR_Sig = 0xF,GR_Sig
};;
{ .mfi
ld8 GR_Dx = [GR_ad_Dx]
fma.s1 FR_Xp16 = FR_3,FR_2,FR_Xp10
(p13) cmp.ge.unc p6,p0 = 0xD,GR_Sig
}
{ .mfi
(p11) mov GR_Offs = 0xC0
(p13) fma.s1 FR_NormX = FR_NormX,FR_Xp1,f0
(p13) cmp.ge.unc p7,p0 = 0xB,GR_Sig
};;
{ .mfi
(p14) add GR_ad_Co = GR_Offs,GR_ad_Co
(p6) fma.s1 FR_Xp2 = FR_Xp2,FR_Xp3,f0
(p13) cmp.ge.unc p8,p0 = 0x9,GR_Sig
}
{ .mfi
(p14) add GR_ad_Ce = GR_Offs,GR_ad_Ce
(p7) fma.s1 FR_Xp4 = FR_Xp4,FR_Xp5,f0
(p13) cmp.ge.unc p9,p0 = 0x7,GR_Sig
};;
{ .mfi
ldfpd FR_B17,FR_B16 = [GR_ad_Co],16
(p8) fma.s1 FR_Xp6 = FR_Xp6,FR_Xp7,f0
(p13) cmp.ge.unc p6,p0 = 0x5,GR_Sig
}
{ .mfi
ldfpd FR_B15,FR_B14 = [GR_ad_Ce],16
(p9) fma.s1 FR_Xp8 = FR_Xp8,FR_Xp9,f0
(p13) cmp.ge.unc p7,p0 = 0x3,GR_Sig
};;
{ .mfi
ldfpd FR_B13,FR_B12 = [GR_ad_Co],16
(p6) fma.s1 FR_Xp10 = FR_Xp10,FR_Xp11,f0
(p13) cmp.ge.unc p8,p0 = 0x1,GR_Sig
}
{ .mfi
ldfpd FR_B11,FR_B10 = [GR_ad_Ce],16
(p7) fma.s1 FR_Xp12 = FR_Xp12,FR_Xp13,f0
(p13) cmp.eq.unc p9,p0 = 0,GR_Sig
};;
{ .mfi
ldfpd FR_B9,FR_B8 = [GR_ad_Co],16
(p8) fma.s1 FR_Xp14 = FR_Xp14,FR_Xp15,f0
mov GR_Arg15 = 0xC02E // -15
}
{ .mfi
ldfpd FR_B7,FR_B6 = [GR_ad_Ce],16
fcmp.eq.s1 p15,p0 = f0,FR_Xf
(p13) cmp.ge.unc p6,p0 = 0xC,GR_Sig
};;
{ .mfi
ldfe FR_B5 = [GR_ad_Co],16
(p9) fma.s1 FR_NormX = FR_NormX,FR_Xp16,f0
sub GR_Root = GR_ArgAsIs,GR_Root
}
{ .mfi
sub GR_RootInd = 0xE,GR_RootInd
(p11) fms.s1 FR_x = FR_Xfr,f1,FR_LocalMin // x-LocalMin
(p13) cmp.ge.unc p7,p0 = 0x8,GR_Sig
};;
.pred.rel "mutex",p10,p12
{ .mfi
ldfe FR_B4 = [GR_ad_Ce],16
(p10) fms.s1 FR_x = FR_Xfr,f1,f0 // x
add GR_Root = GR_Root,GR_Dx
}
{ .mfb
cmp.gtu p14,p0 = 0xE,GR_RootInd
(p12) fms.s1 FR_x = FR_Xfr,f1,f1 // x-1
(p15) br.cond.spnt lgamma_singularity
};;
{ .mfi
ldfe FR_B3 = [GR_ad_Co],16
(p6) fma.s1 FR_Xp2 = FR_Xp2,FR_Xp4,f0
(p14) cmp.lt.unc p11,p0 = GR_Arg,GR_Arg15
}
{ .mfi
ldfe FR_B2 = [GR_ad_Ce],16
(p7) fma.s1 FR_Xp6 = FR_Xp6,FR_Xp8,f0
add GR_2xDx = GR_Dx,GR_Dx
};;
{ .mfi
ldfe FR_B1 = [GR_ad_Co],16
fms.s1 FR_r = f8,f1,FR_Root
(p13) cmp.ge.unc p6,p0 = 0x4,GR_Sig
}
{ .mib
ldfe FR_B0 = [GR_ad_Ce],16
(p11) cmp.leu.unc p10,p0 = GR_Root,GR_2xDx
(p10) br.cond.spnt lgamma_negroots
};;
{ .mfi
ldfpd FR_P5,FR_P4 = [GR_ad_1],16
(p6) fma.s1 FR_Xp10 = FR_Xp10,FR_Xp12,f0
tbit.z p14,p15 = GR_Sig,0
}
{ .mfi
ldfpd FR_P3,FR_P2 = [GR_ad_2],16
fnma.d.s0 FR_T = f1,f1,f8 // nop.f 0
(p13) cmp.ge.unc p7,p0 = 0x2,GR_Sig
};;
{ .mfi
ldfe FR_Ln2 = [GR_ad_1],0x50
(p7) fma.s1 FR_NormX = FR_NormX,FR_Xp14,f0
mov GR_PseudoRoot = 0xBFFBC
}
{ .mlx
add GR_ad_2 = 0x40,GR_ad_2
movl GR_2xDx = 0x00002346DC5D6389
};;
{ .mfi
ldfpd FR_Q8,FR_Q7 = [GR_ad_1],16
fma.s1 FR_x2 = FR_x,FR_x,f0
shl GR_PseudoRoot = GR_PseudoRoot,44
}
{ .mfi
ldfpd FR_Q6,FR_Q5 = [GR_ad_2],16
fma.s1 FR_B17 = FR_B17,FR_x,FR_B16
(p13) cmp.ge.unc p6,p0 = 0xA,GR_Sig
};;
{ .mfi
ldfpd FR_Q4,FR_Q3 = [GR_ad_1],16
(p6) fma.s1 FR_Xp2 = FR_Xp2,FR_Xp6,f0
sub GR_PseudoRoot = GR_ArgAsIs,GR_PseudoRoot
}
{ .mfi
ldfpd FR_Q2,FR_Q1 = [GR_ad_2],16
fma.s1 FR_B15 = FR_B15,FR_x,FR_B14
(p13) cmp.ge.unc p7,p0 = 0x6,GR_Sig
};;
{ .mfi
add GR_ad_Co = 0x12F0,GR_ad_2
fma.s1 FR_B13 = FR_B13,FR_x,FR_B12
cmp.leu.unc p10,p0 = GR_PseudoRoot,GR_2xDx
}
{ .mfi
add GR_ad_Ce = 0x1300,GR_ad_2
fma.s1 FR_B11 = FR_B11,FR_x,FR_B10
mov GR_ExpMask = 0x1ffff
};;
{ .mfi
(p10) ldfe FR_PR01 = [GR_ad_Co],0xF0
fma.s1 FR_B9 = FR_B9,FR_x,FR_B8
mov GR_ExpBias = 0xFFFF
}
{ .mfb
(p10) ldfe FR_PR11 = [GR_ad_Ce],0xF0
fma.s1 FR_B7 = FR_B7,FR_x,FR_B6
(p10) br.cond.spnt lgamma_pseudoroot
};;
{ .mfi
(p13) cmp.ge.unc p6,p0 = 0xE,GR_Sig
(p7) fma.s1 FR_NormX = FR_NormX,FR_Xp10,f0
tbit.z.unc p8,p0 = GR_Sig,0
}
{ .mfi
mov GR_SignOfGamma = 1
fma.s1 FR_B5 = FR_B5,FR_x,FR_B4
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
};;
{ .mfi
nop.m 0
fma.s1 FR_B3 = FR_B3,FR_x,FR_B2
(p8) sub GR_SignOfGamma = r0,GR_SignOfGamma
}
{ .mfi
nop.m 0
(p14) fms.s1 FR_w = f0,f0,f1
nop.i 0
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_B1 = FR_B1,FR_x,FR_B0
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
fma.s1 FR_B17 = FR_B17,FR_x2,FR_B15
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_B13 = FR_B13,FR_x2,FR_B11
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_B9 = FR_B9,FR_x2,FR_B7
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_x4 = FR_x2,FR_x2,f0
nop.i 0
};;
{ .mfi
nop.m 0
(p6) fma.s1 FR_NormX = FR_NormX,FR_Xp2,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_B5 = FR_B5,FR_x2,FR_B3
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_B17 = FR_B17,FR_x4,FR_B13
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_x8 = FR_x4,FR_x4,f0
nop.i 0
};;
.pred.rel "mutex",p14,p15
{ .mfi
nop.m 0
(p15) fms.s1 FR_w = FR_NormX,f1,f1
nop.i 0
}
{ .mfi
nop.m 0
(p14) fnma.s1 FR_w = FR_NormX,f1,FR_w
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_B9 = FR_B9,FR_x4,FR_B5
nop.i 0
};;
{ .mfi
nop.m 0
frcpa.s1 FR_C,p0 = f1,FR_NormX
nop.i 0
};;
{ .mfi
getf.exp GR_Exp = FR_NormX
nop.f 0
nop.i 0
};;
{ .mfi
getf.d GR_ArgAsIs = FR_NormX
nop.f 0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_w2 = FR_w,FR_w,f0
nop.i 0
}
{ .mfi
and GR_Exp = GR_Exp,GR_ExpMask
fma.s1 FR_Q8 = FR_Q8,FR_w,FR_Q7
nop.i 0
};;
{ .mfi
sub GR_Exp = GR_Exp,GR_ExpBias
fma.s1 FR_B17 = FR_B17,FR_x8,FR_B9
extr.u GR_Ind = GR_ArgAsIs,44,8
}
{ .mfi
nop.m 0
fma.s1 FR_Q6 = FR_Q6,FR_w,FR_Q5
nop.i 0
};;
{ .mfi
setf.sig FR_int_N = GR_Exp
fms.s1 FR_r = FR_C,FR_NormX,f1
nop.i 0
}
{ .mfi
shladd GR_ad_2 = GR_Ind,4,GR_ad_2
nop.f 0
nop.i 0
};;
{ .mfi
getf.exp GR_SignExp_w = FR_w
fma.s1 FR_Q4 = FR_Q4,FR_w,FR_Q3
nop.i 0
}
{ .mfi
ldfe FR_T = [GR_ad_2]
nop.f 0
nop.i 0
};;
{ .mfi
and GR_Exp_w = GR_ExpMask, GR_SignExp_w
fnma.s1 FR_Q1 = FR_05,FR_w2,FR_w
mov GR_fff9 = 0xfff9
}
{ .mfi
nop.m 0
fma.s1 FR_w3 = FR_w2,FR_w,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_w4 = FR_w2,FR_w2,f0
// p13 <== large w __libm_lgamma
// p14 <== small w __libm_lgamma
cmp.ge p13,p14 = GR_Exp_w,GR_fff9
}
{ .mfi
nop.m 0
fma.s1 FR_Qlo = FR_Q8,FR_w2,FR_Q6
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_r2 = FR_r,FR_r,f0
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_B17 = FR_B17,FR_x2,FR_B1
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_P32 = FR_P3,FR_r,FR_P2
nop.i 0
}
{ .mfi
nop.m 0
(p13) fma.s1 FR_P54 = FR_P5,FR_r,FR_P4
nop.i 0
};;
{ .mfi
nop.m 0
(p14) fma.s1 FR_Q2 = FR_Q2,FR_w3,FR_Q1
nop.i 0
}
{ .mfi
nop.m 0
(p14) fma.s1 FR_w6 = FR_w3,FR_w3,f0
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fcvt.xf FR_N = FR_int_N
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_r3 = FR_r2,FR_r,f0
nop.i 0
}
{ .mfi
nop.m 0
(p13) fnma.s1 FR_P10 = FR_r2,FR_05,FR_r
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_P54 = FR_P54,FR_r2,FR_P32
nop.i 0
};;
{ .mfi
nop.m 0
(p14) fma.s1 FR_Qhi = FR_Q4,FR_w4,FR_Q2
nop.i 0
}
{ .mfi
nop.m 0
(p14) fnma.s1 FR_Qlo = FR_Qlo,FR_w6,FR_B17
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_TpNxLn2 = FR_N,FR_Ln2,FR_T
nop.i 0
};;
{ .mfi
nop.m 0
(p13) fma.s1 FR_P54 = FR_P54,FR_r3,FR_P10
nop.i 0
};;
.pred.rel "mutex",p13,p14
{ .mfi
nop.m 0
(p14) fms.d.s0 f8 = FR_Qlo,f1,FR_Qhi
nop.i 0
}
{ .mfi
nop.m 0
(p13) fma.s1 FR_LnX = FR_TpNxLn2,f1,FR_P54
nop.i 0
};;
{ .mfb
nop.m 0
(p13) fms.d.s0 f8 = FR_B17,f1,FR_LnX
br.ret.sptk b0
};;
// branch for calculating of ln(GAMMA(x)) near negative roots
//---------------------------------------------------------------------
.align 32
lgamma_negroots:
{ .mfi
shladd GR_Offs = GR_RootInd,3,r0 //GR_RootInd*8
fma.s1 FR_r2 = FR_r,FR_r,f0
add GR_ad_Co = 0x15C0,GR_ad_1//0x1590,GR_ad_1
}
{ .mfi
add GR_ad_Ce = 0x1610,GR_ad_1//0x15E0,GR_ad_1
nop.f 0
cmp.lt p6,p0 = GR_ArgXfrAsIs,GR_Arg05
};;
{ .mfi
add GR_ad_Roots = 0x10A0,GR_ad_1
nop.f 0
(p6) add GR_ad_Co = 0x820,GR_ad_Co
}
{ .mfi
(p6) add GR_ad_Ce = 0x820,GR_ad_Ce
nop.f 0
shladd GR_Offs = GR_RootInd,1,GR_Offs //GR_RootInd*10
};;
{ .mmi
shladd GR_ad_Co = GR_Offs,4,GR_ad_Co
shladd GR_ad_Ce = GR_Offs,4,GR_ad_Ce
cmp.eq p8,p7 = r0,r0
};;
{ .mmi
ldfpd FR_A15,FR_A14 = [GR_ad_Co],16
ldfpd FR_A13,FR_A12 = [GR_ad_Ce],16
mov GR_SignOfGamma = 1
};;
{ .mmi
ldfpd FR_A11,FR_A10 = [GR_ad_Co],16
ldfpd FR_A9,FR_A8 = [GR_ad_Ce],16
(p6) cmp.eq p7,p8 = r0,GR_RootInd
};;
{ .mmi
ldfpd FR_A7,FR_A6 = [GR_ad_Co],16
ldfpd FR_A5,FR_A4 = [GR_ad_Ce],16
tbit.z p11,p0 = GR_Sig,0
};;
{ .mmi
ldfe FR_A3 = [GR_ad_Co],16
ldfe FR_A2 = [GR_ad_Ce],16
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
};;
{ .mmi
ldfe FR_A1 = [GR_ad_Co],16
ldfe FR_A0 = [GR_ad_Ce],16
(p11) sub GR_SignOfGamma = r0,GR_SignOfGamma
};;
{ .mfi
ldfe FR_A00 = [GR_ad_Roots]
fma.s1 FR_r4 = FR_r2,FR_r2,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A15 = FR_A15,FR_r,FR_A14
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A13 = FR_A13,FR_r,FR_A12
nop.i 0
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_A11 = FR_A11,FR_r,FR_A10
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
fma.s1 FR_A9 = FR_A9,FR_r,FR_A8
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A7 = FR_A7,FR_r,FR_A6
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_A5 = FR_A5,FR_r,FR_A4
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A3 = FR_A3,FR_r,FR_A2
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_r8 = FR_r4,FR_r4,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A1 = FR_A1,FR_r,FR_A0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A15 = FR_A15,FR_r2,FR_A13
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A11 = FR_A11,FR_r2,FR_A9
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A7 = FR_A7,FR_r2,FR_A5
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A3 = FR_A3,FR_r2,FR_A1
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A15 = FR_A15,FR_r4,FR_A11
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_A7 = FR_A7,FR_r4,FR_A3
nop.i 0
};;
.pred.rel "mutex",p7,p8
{ .mfi
nop.m 0
(p7) fma.s1 FR_A1 = FR_A15,FR_r8,FR_A7
nop.i 0
}
{ .mfi
nop.m 0
(p8) fma.d.s0 f8 = FR_A15,FR_r8,FR_A7
nop.i 0
};;
{ .mfb
nop.m 0
(p7) fma.d.s0 f8 = FR_A1,FR_r,FR_A00
br.ret.sptk b0
};;
// branch for handling pseudo root on (-2;-1)
//---------------------------------------------------------------------
.align 32
lgamma_pseudoroot:
{ .mmi
ldfe FR_PR21 = [GR_ad_Co],32
ldfe FR_PR31 = [GR_ad_Ce],32
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
};;
{ .mmi
ldfe FR_PR00 = [GR_ad_Co],32
ldfe FR_PR10 = [GR_ad_Ce],0xF0
mov GR_SignOfGamma = 1
};;
{ .mmi
ldfe FR_PR20 = [GR_ad_Co],0xF0
ldfe FR_PR30 = [GR_ad_Ce]
tbit.z p8,p0 = GR_Sig,0
};;
{ .mfi
ldfe FR_PRN = [GR_ad_Co]
fma.s1 FR_PR01 = f8,f1,FR_PR01
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_PR11 = f8,f1,FR_PR11
(p8) sub GR_SignOfGamma = r0,GR_SignOfGamma
};;
.pred.rel "mutex",p9,p10
{ .mfi
// store sign of gamma(x) as 32-bit int
(p9) st4 [r33] = GR_SignOfGamma
fma.s1 FR_PR21 = f8,f1,FR_PR21
nop.i 0
}
{ .mfi
// store sign of gamma(x) as 64-bit int
(p10) st8 [r33] = GR_SignOfGamma
fma.s1 FR_PR31 = f8,f1,FR_PR31
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_PR01 = f8,FR_PR01,FR_PR00
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_PR11 = f8,FR_PR11,FR_PR10
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_PR21 = f8,FR_PR21,FR_PR20
nop.i 0
}
{ .mfi
nop.m 0
fma.s1 FR_PR31 = f8,FR_PR31,FR_PR30
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_PR01 = FR_PR11,FR_PR01,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_PR21 = FR_PR31,FR_PR21,f0
nop.i 0
};;
{ .mfi
nop.m 0
fma.s1 FR_PR01 = FR_PR21,FR_PR01,f0
nop.i 0
};;
{ .mfb
nop.m 0
fma.d.s0 f8 = FR_PR01,FR_PRN,f0
br.ret.sptk b0
};;
// branch for handling +/-0, NaT, QNaN, +/-INF and denormalised numbers
//---------------------------------------------------------------------
.align 32
lgamma_spec:
{ .mfi
getf.exp GR_SignExp = FR_NormX
fclass.m p6,p0 = f8,0x21 // is arg +INF?
mov GR_SignOfGamma = 1
};;
{ .mfi
getf.sig GR_ArgAsIs = FR_NormX
fclass.m p7,p0 = f8,0xB // is x deno?
// set p11 if signgum is 32-bit int
// set p12 if signgum is 64-bit int
cmp.eq p12,p11 = 8,r34
};;
.pred.rel "mutex",p11,p12
{ .mfi
// store sign of gamma(x) as 32-bit int
(p11) st4 [r33] = GR_SignOfGamma
fclass.m p8,p0 = f8,0x1C0 // is arg NaT or NaN?
dep.z GR_Ind = GR_SignExp,8,4
}
{ .mib
// store sign of gamma(x) as 64-bit int
(p12) st8 [r33] = GR_SignOfGamma
cmp.lt p10,p0 = GR_SignExp,GR_ExpBias
(p6) br.ret.spnt b0 // exit for +INF
};;
{ .mfi
and GR_Exp = GR_SignExp,GR_ExpMask
fclass.m p9,p0 = f8,0x22 // is arg -INF?
nop.i 0
};;
{ .mfi
add GR_ad_Co = GR_Ind,GR_ad_Data
(p7) fma.s0 FR_tmp = f8,f8,f8
extr.u GR_ArgAsIs = GR_ArgAsIs,11,52
}
{ .mfb
nop.m 0
(p8) fms.d.s0 f8 = f8,f1,f8
(p8) br.ret.spnt b0 // exit for NaT and NaN
};;
{ .mib
nop.m 0
shr.u GR_Arg = GR_ArgAsIs,48
(p7) br.cond.sptk lgamma_common
};;
{ .mfb
nop.m 0
(p9) fmerge.s f8 = f1,f8
(p9) br.ret.spnt b0 // exit -INF
};;
// branch for handling negative integers and +/-0
//---------------------------------------------------------------------
.align 32
lgamma_singularity:
{ .mfi
mov GR_ad_SignGam = r33
fclass.m p6,p0 = f8, 0x6 // is x -0?
mov GR_SignOfGamma = 1
}
{ .mfi
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
fma.s1 FR_X = f0,f0,f8
nop.i 0
};;
{ .mfi
nop.m 0
frcpa.s0 f8,p0 = f1,f0
mov GR_TAG = 106 // negative
}
{ .mib
nop.m 0
(p6) sub GR_SignOfGamma = r0,GR_SignOfGamma
br.cond.sptk lgamma_libm_err
};;
// overflow (x > OVERFLOV_BOUNDARY)
//---------------------------------------------------------------------
.align 32
lgamma_overflow:
{ .mfi
mov GR_SignOfGamma = 1
nop.f 0
mov r8 = 0x1FFFE
};;
{ .mfi
setf.exp f9 = r8
fmerge.s FR_X = f8,f8
mov GR_TAG = 105 // overflow
};;
{ .mfi
mov GR_ad_SignGam = r33
nop.f 0
// set p9 if signgum is 32-bit int
// set p10 if signgum is 64-bit int
cmp.eq p10,p9 = 8,r34
}
{ .mfi
nop.m 0
fma.d.s0 f8 = f9,f9,f0 // Set I,O and +INF result
nop.i 0
};;
//
//---------------------------------------------------------------------
.align 32
lgamma_libm_err:
{ .mmi
alloc r32 = ar.pfs,1,4,4,0
mov GR_Parameter_TAG = GR_TAG
nop.i 0
};;
.pred.rel "mutex",p9,p10
{ .mmi
// store sign of gamma(x) as 32-bit int
(p9) st4 [GR_ad_SignGam] = GR_SignOfGamma
// store sign of gamma(x) as 64-bit int
(p10) st8 [GR_ad_SignGam] = GR_SignOfGamma
nop.i 0
};;
GLOBAL_LIBM_END(__libm_lgamma)
LOCAL_LIBM_ENTRY(__libm_error_region)
.prologue
{ .mfi
add GR_Parameter_Y=-32,sp // Parameter 2 value
nop.f 0
.save ar.pfs,GR_SAVE_PFS
mov GR_SAVE_PFS=ar.pfs // Save ar.pfs
}
{ .mfi
.fframe 64
add sp=-64,sp // Create new stack
nop.f 0
mov GR_SAVE_GP=gp // Save gp
};;
{ .mmi
stfd [GR_Parameter_Y] = FR_Y,16 // STORE Parameter 2 on stack
add GR_Parameter_X = 16,sp // Parameter 1 address
.save b0, GR_SAVE_B0
mov GR_SAVE_B0=b0 // Save b0
};;
.body
{ .mib
stfd [GR_Parameter_X] = FR_X // STORE Parameter 1
// on stack
add GR_Parameter_RESULT = 0,GR_Parameter_Y // Parameter 3 address
nop.b 0
}
{ .mib
stfd [GR_Parameter_Y] = FR_RESULT // STORE Parameter 3
// on stack
add GR_Parameter_Y = -16,GR_Parameter_Y
br.call.sptk b0=__libm_error_support# // Call error handling
// function
};;
{ .mmi
nop.m 0
nop.m 0
add GR_Parameter_RESULT = 48,sp
};;
{ .mmi
ldfd f8 = [GR_Parameter_RESULT] // Get return result off stack
.restore sp
add sp = 64,sp // Restore stack pointer
mov b0 = GR_SAVE_B0 // Restore return address
};;
{ .mib
mov gp = GR_SAVE_GP // Restore gp
mov ar.pfs = GR_SAVE_PFS // Restore ar.pfs
br.ret.sptk b0 // Return
};;
LOCAL_LIBM_END(__libm_error_region)
.type __libm_error_support#,@function
.global __libm_error_support#
|