MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / xsum_large_add_dot

Function xsum_large_add_dot

xs/sources/xsum.c:1806–1963  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1804/* ADD DOT PRODUCT OF VECTORS OF FLOATING-POINT NUMBERS TO LARGE ACCUMULATOR. */
1805
1806void 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);

Callers

nothing calls this directly

Calls 1

Tested by

no test coverage detected