| 1483 | /* ADD A VECTOR OF FLOATING-POINT NUMBERS TO A LARGE ACCUMULATOR. */ |
| 1484 | |
| 1485 | void xsum_large_addv (xsum_large_accumulator *restrict lacc, |
| 1486 | const xsum_flt *restrict vec, |
| 1487 | xsum_length n) |
| 1488 | { |
| 1489 | if (xsum_debug) c_printf("\nLARGE ADDV OF %ld VALUES\n",(long)n); |
| 1490 | |
| 1491 | # if OPT_LARGE_SUM |
| 1492 | { |
| 1493 | xsum_lcount count; |
| 1494 | xsum_expint ix; |
| 1495 | xsum_uint uintv; |
| 1496 | |
| 1497 | while (n > 3) |
| 1498 | { |
| 1499 | COPY64 (uintv, *vec); |
| 1500 | vec += 1; |
| 1501 | |
| 1502 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1503 | |
| 1504 | count = lacc->count[ix] - 1; |
| 1505 | |
| 1506 | if (count < 0) |
| 1507 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1508 | } |
| 1509 | else |
| 1510 | { lacc->count[ix] = count; |
| 1511 | lacc->chunk[ix] += uintv; |
| 1512 | } |
| 1513 | |
| 1514 | COPY64 (uintv, *vec); |
| 1515 | vec += 1; |
| 1516 | |
| 1517 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1518 | |
| 1519 | count = lacc->count[ix] - 1; |
| 1520 | |
| 1521 | if (count < 0) |
| 1522 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1523 | } |
| 1524 | else |
| 1525 | { lacc->count[ix] = count; |
| 1526 | lacc->chunk[ix] += uintv; |
| 1527 | } |
| 1528 | |
| 1529 | COPY64 (uintv, *vec); |
| 1530 | vec += 1; |
| 1531 | |
| 1532 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1533 | |
| 1534 | count = lacc->count[ix] - 1; |
| 1535 | |
| 1536 | if (count < 0) |
| 1537 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1538 | } |
| 1539 | else |
| 1540 | { lacc->count[ix] = count; |
| 1541 | lacc->chunk[ix] += uintv; |
| 1542 | } |
no test coverage detected