| 1643 | /* ADD SQUARED NORM OF VECTOR OF FLOATING-POINT NUMBERS TO LARGE ACCUMULATOR. */ |
| 1644 | |
| 1645 | void xsum_large_add_sqnorm (xsum_large_accumulator *restrict lacc, |
| 1646 | const xsum_flt *restrict vec, |
| 1647 | xsum_length n) |
| 1648 | { |
| 1649 | if (xsum_debug) c_printf("\nLARGE ADD_SQNORM OF %ld VALUES\n",(long)n); |
| 1650 | |
| 1651 | # if OPT_LARGE_SQNORM |
| 1652 | { |
| 1653 | xsum_lcount count; |
| 1654 | xsum_expint ix; |
| 1655 | xsum_uint uintv; |
| 1656 | double fltv; |
| 1657 | |
| 1658 | while (n > 3) |
| 1659 | { |
| 1660 | fltv = *vec * *vec; |
| 1661 | COPY64 (uintv, fltv); |
| 1662 | vec += 1; |
| 1663 | |
| 1664 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1665 | |
| 1666 | count = lacc->count[ix] - 1; |
| 1667 | |
| 1668 | if (count < 0) |
| 1669 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1670 | } |
| 1671 | else |
| 1672 | { lacc->count[ix] = count; |
| 1673 | lacc->chunk[ix] += uintv; |
| 1674 | } |
| 1675 | |
| 1676 | fltv = *vec * *vec; |
| 1677 | COPY64 (uintv, fltv); |
| 1678 | vec += 1; |
| 1679 | |
| 1680 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1681 | |
| 1682 | count = lacc->count[ix] - 1; |
| 1683 | |
| 1684 | if (count < 0) |
| 1685 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1686 | } |
| 1687 | else |
| 1688 | { lacc->count[ix] = count; |
| 1689 | lacc->chunk[ix] += uintv; |
| 1690 | } |
| 1691 | |
| 1692 | fltv = *vec * *vec; |
| 1693 | COPY64 (uintv, fltv); |
| 1694 | vec += 1; |
| 1695 | |
| 1696 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1697 | |
| 1698 | count = lacc->count[ix] - 1; |
| 1699 | |
| 1700 | if (count < 0) |
| 1701 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1702 | } |
nothing calls this directly
no test coverage detected