public static double sum(ReadOnlySpan <double> src) { var veclen = Vec128 <double> .Length; var seglen = 2 * veclen; var srclen = src.Length; require(0 == srclen % seglen); var dst = Vec128.Fill((double)0); var offset = 0; for (var i = 0; i < srclen; i += seglen) { var v1 = Vec128.Load(src, offset); offset += veclen; var v2 = Vec128.Load(src, offset); offset += veclen; var vSum = dfp.hadd(v1, v2); dst = dfp.add(dst, vSum); } Span <double> final = stackalloc double[veclen]; vstore(dst, ref final[0]); var total = (double)0; for (var i = 0; i < veclen; i++) { total += final[i]; } return(total); }
static Vec128 <float> CalcFpSignMask32() => Vec128.Fill(-0.0f);
static Vec128 <double> CalcFpSignMask64() => Vec128.Fill(-0.0);