| 1804 | /* ADD DOT PRODUCT OF VECTORS OF FLOATING-POINT NUMBERS TO LARGE ACCUMULATOR. */ |
| 1805 | |
| 1806 | void xsum_large_add_dot (xsum_large_accumulator *restrict lacc, |
| 1807 | const xsum_flt *vec1, |
| 1808 | const xsum_flt *vec2, |
| 1809 | xsum_length n) |
| 1810 | { |
| 1811 | if (xsum_debug) c_printf("\nLARGE ADD_DOT OF %ld VALUES\n",(long)n); |
| 1812 | |
| 1813 | # if OPT_LARGE_DOT |
| 1814 | { |
| 1815 | xsum_lcount count; |
| 1816 | xsum_expint ix; |
| 1817 | xsum_uint uintv; |
| 1818 | double fltv; |
| 1819 | |
| 1820 | while (n > 3) |
| 1821 | { |
| 1822 | fltv = *vec1 * *vec2; |
| 1823 | COPY64 (uintv, fltv); |
| 1824 | vec1 += 1; vec2 += 1; |
| 1825 | |
| 1826 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1827 | |
| 1828 | count = lacc->count[ix] - 1; |
| 1829 | |
| 1830 | if (count < 0) |
| 1831 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1832 | } |
| 1833 | else |
| 1834 | { lacc->count[ix] = count; |
| 1835 | lacc->chunk[ix] += uintv; |
| 1836 | } |
| 1837 | |
| 1838 | fltv = *vec1 * *vec2; |
| 1839 | COPY64 (uintv, fltv); |
| 1840 | vec1 += 1; vec2 += 1; |
| 1841 | |
| 1842 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1843 | |
| 1844 | count = lacc->count[ix] - 1; |
| 1845 | |
| 1846 | if (count < 0) |
| 1847 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
| 1848 | } |
| 1849 | else |
| 1850 | { lacc->count[ix] = count; |
| 1851 | lacc->chunk[ix] += uintv; |
| 1852 | } |
| 1853 | |
| 1854 | fltv = *vec1 * *vec2; |
| 1855 | COPY64 (uintv, fltv); |
| 1856 | vec1 += 1; vec2 += 1; |
| 1857 | |
| 1858 | ix = uintv >> XSUM_MANTISSA_BITS; |
| 1859 | |
| 1860 | count = lacc->count[ix] - 1; |
| 1861 | |
| 1862 | if (count < 0) |
| 1863 | { xsum_large_add_value_inf_nan (lacc, ix, uintv); |
nothing calls this directly
no test coverage detected