public static Span <uint> pack(N1 width, Span <uint> src) { Span <uint> dst = new uint[8]; pack(width, ref src[0], ref dst[0]); return(dst); }
void ShowBitSeq(N1 n, ShowLog dst) { var bits = BitSeq.bits(n); dst.Show($"n={n}, count={bits.Length}"); dst.Show(RP.PageBreak120); root.iter(bits, s => dst.Buffer.AppendFormat("{0} ", s.Format())); dst.ShowBuffer(); }
public static void pack(N1 width, ref uint src, ref uint dst) { // we are going to pack 256 1-bit values, touching 1 256-bit words, using 16 bytes // we are going to touch 1 256-bit word __m256i w0 = default; w0 = _mm256_lddqu_si256(ref add(ref src, 0)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 1)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 2)), 2)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 3)), 3)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 4)), 4)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 5)), 5)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 6)), 6)); w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 7)), 7)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 0)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 1)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 2)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 3)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 4)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 5)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 6)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 7)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 0)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 1)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 2)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 3)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 4)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 5)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 6)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 7)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 0)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 1)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 2)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 3)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 4)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 5)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 6)); // w0 = _mm256_or_si256(w0, _mm256_slli_epi32(_mm256_lddqu_si256(ref add(ref src, 1)), 7)); _mm256_storeu_si256(ref dst, w0); }
public static ref ulong uint64(ref BitBlock16 src, N1 hi) => ref Unsafe.As <BitBlock8, ulong>(ref src.Block8x1);