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

Function floatx80_sin

src/softfloat/softfloat_fpsp.cpp:1372–1569  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1370 *----------------------------------------------------------------------------*/
1371
1372floatx80 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

Callers 1

fp_sinFunction · 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