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 __m512i Define(__m256i lo, __m256i hi) => new __m512i(lo, hi);