| 1370 | *----------------------------------------------------------------------------*/ |
| 1371 | |
| 1372 | floatx80 floatx80_sin(floatx80 a, float_status *status) |
| 1373 | { |
| 1374 | flag aSign, xSign; |
| 1375 | int32_t aExp, xExp; |
| 1376 | uint64_t aSig, xSig; |
| 1377 | |
| 1378 | int32_t compact, l, n, j; |
| 1379 | floatx80 fp0, fp1, fp2, fp3, fp4, fp5, x, invtwopi, twopi1, twopi2; |
| 1380 | float32 posneg1, twoto63; |
| 1381 | flag adjn, endflag; |
| 1382 | |
| 1383 | aSig = extractFloatx80Frac(a); |
| 1384 | aExp = extractFloatx80Exp(a); |
| 1385 | aSign = extractFloatx80Sign(a); |
| 1386 | |
| 1387 | if (aExp == 0x7FFF) { |
| 1388 | if ((uint64_t) (aSig<<1)) return propagateFloatx80NaNOneArg(a, status); |
| 1389 | float_raise(float_flag_invalid, status); |
| 1390 | return floatx80_default_nan(status); |
| 1391 | } |
| 1392 | |
| 1393 | if (aExp == 0 && aSig == 0) { |
| 1394 | return packFloatx80(aSign, 0, 0); |
| 1395 | } |
| 1396 | |
| 1397 | adjn = 0; |
| 1398 | |
| 1399 | SET_PREC; |
| 1400 | |
| 1401 | compact = floatx80_make_compact(aExp, aSig); |
| 1402 | |
| 1403 | fp0 = a; |
| 1404 | |
| 1405 | if (compact < 0x3FD78000 || compact > 0x4004BC7E) { // 2^(-40) > |X| > 15 PI |
| 1406 | if (compact > 0x3FFF8000) { // |X| >= 15 PI |
| 1407 | // REDUCEX |
| 1408 | fp1 = packFloatx80(0, 0, 0); |
| 1409 | if (compact == 0x7FFEFFFF) { |
| 1410 | twopi1 = packFloatx80(aSign ^ 1, 0x7FFE, LIT64(0xC90FDAA200000000)); |
| 1411 | twopi2 = packFloatx80(aSign ^ 1, 0x7FDC, LIT64(0x85A308D300000000)); |
| 1412 | fp0 = floatx80_add(fp0, twopi1, status); |
| 1413 | fp1 = fp0; |
| 1414 | fp0 = floatx80_add(fp0, twopi2, status); |
| 1415 | fp1 = floatx80_sub(fp1, fp0, status); |
| 1416 | fp1 = floatx80_add(fp1, twopi2, status); |
| 1417 | } |
| 1418 | loop: |
| 1419 | xSign = extractFloatx80Sign(fp0); |
| 1420 | xExp = extractFloatx80Exp(fp0); |
| 1421 | xExp -= 0x3FFF; |
| 1422 | if (xExp <= 28) { |
| 1423 | l = 0; |
| 1424 | endflag = 1; |
| 1425 | } else { |
| 1426 | l = xExp - 27; |
| 1427 | endflag = 0; |
| 1428 | } |
| 1429 | invtwopi = packFloatx80(0, 0x3FFE - l, LIT64(0xA2F9836E4E44152A)); // INVTWOPI |
no test coverage detected