MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / floatx80_tan

Function floatx80_tan

src/softfloat/softfloat_fpsp.cpp:1911–2084  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1909 *----------------------------------------------------------------------------*/
1910
1911floatx80 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));

Callers 2

fp_tanFunction · 0.85
softfloat_tanFunction · 0.85

Calls 15

extractFloatx80FracFunction · 0.85
extractFloatx80ExpFunction · 0.85
extractFloatx80SignFunction · 0.85
float_raiseFunction · 0.85
floatx80_default_nanFunction · 0.85
packFloatx80Function · 0.85
floatx80_make_compactFunction · 0.85
floatx80_addFunction · 0.85
floatx80_subFunction · 0.85
floatx80_mulFunction · 0.85
float32_to_floatx80Function · 0.85

Tested by

no test coverage detected