| 1909 | *----------------------------------------------------------------------------*/ |
| 1910 | |
| 1911 | floatx80 floatx80_tan(floatx80 a, float_status *status) |
| 1912 | { |
| 1913 | flag aSign, xSign; |
| 1914 | int32_t aExp, xExp; |
| 1915 | uint64_t aSig, xSig; |
| 1916 | |
| 1917 | int32_t compact, l, n, j; |
| 1918 | floatx80 fp0, fp1, fp2, fp3, fp4, fp5, invtwopi, twopi1, twopi2; |
| 1919 | float32 twoto63; |
| 1920 | flag endflag; |
| 1921 | |
| 1922 | aSig = extractFloatx80Frac(a); |
| 1923 | aExp = extractFloatx80Exp(a); |
| 1924 | aSign = extractFloatx80Sign(a); |
| 1925 | |
| 1926 | if (aExp == 0x7FFF) { |
| 1927 | if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status); |
| 1928 | float_raise(float_flag_invalid, status); |
| 1929 | return floatx80_default_nan(status); |
| 1930 | } |
| 1931 | |
| 1932 | if (aExp == 0 && aSig == 0) { |
| 1933 | return packFloatx80(aSign, 0, 0); |
| 1934 | } |
| 1935 | |
| 1936 | SET_PREC; |
| 1937 | |
| 1938 | compact = floatx80_make_compact(aExp, aSig); |
| 1939 | |
| 1940 | fp0 = a; |
| 1941 | |
| 1942 | if (compact < 0x3FD78000 || compact > 0x4004BC7E) { // 2^(-40) > |X| > 15 PI |
| 1943 | if (compact > 0x3FFF8000) { // |X| >= 15 PI |
| 1944 | // REDUCEX |
| 1945 | fp1 = packFloatx80(0, 0, 0); |
| 1946 | if (compact == 0x7FFEFFFF) { |
| 1947 | twopi1 = packFloatx80(aSign ^ 1, 0x7FFE, LIT64(0xC90FDAA200000000)); |
| 1948 | twopi2 = packFloatx80(aSign ^ 1, 0x7FDC, LIT64(0x85A308D300000000)); |
| 1949 | fp0 = floatx80_add(fp0, twopi1, status); |
| 1950 | fp1 = fp0; |
| 1951 | fp0 = floatx80_add(fp0, twopi2, status); |
| 1952 | fp1 = floatx80_sub(fp1, fp0, status); |
| 1953 | fp1 = floatx80_add(fp1, twopi2, status); |
| 1954 | } |
| 1955 | loop: |
| 1956 | xSign = extractFloatx80Sign(fp0); |
| 1957 | xExp = extractFloatx80Exp(fp0); |
| 1958 | xExp -= 0x3FFF; |
| 1959 | if (xExp <= 28) { |
| 1960 | l = 0; |
| 1961 | endflag = 1; |
| 1962 | } else { |
| 1963 | l = xExp - 27; |
| 1964 | endflag = 0; |
| 1965 | } |
| 1966 | invtwopi = packFloatx80(0, 0x3FFE - l, LIT64(0xA2F9836E4E44152A)); // INVTWOPI |
| 1967 | twopi1 = packFloatx80(0, 0x3FFF + l, LIT64(0xC90FDAA200000000)); |
| 1968 | twopi2 = packFloatx80(0, 0x3FDD + l, LIT64(0x85A308D300000000)); |
no test coverage detected