+ [[maybe_unused]] auto m512_haddx8 = [m512_hadd128x16_interleave](
+ __m512i sum0, __m512i sum1, __m512i sum2, __m512i sum3,
+ __m512i sum4, __m512i sum5, __m512i sum6, __m512i sum7, __m256i bias) -> __m256i {
+
+ __m512i suma = m512_hadd128x16_interleave(sum0, sum1, sum2, sum3);
+ __m512i sumb = m512_hadd128x16_interleave(sum4, sum5, sum6, sum7);
+
+ __m512i indices0 = _mm512_setr_epi64(0, 1, 8, 9, 4, 5, 12, 13);
+ __m512i indices1 = _mm512_setr_epi64(2, 3, 10, 11, 6, 7, 14, 15);
+ __m512i x = _mm512_add_epi32(
+ _mm512_permutex2var_epi64(suma, indices0, sumb),
+ _mm512_permutex2var_epi64(suma, indices1, sumb));
+
+ __m256i sum256lo = _mm512_castsi512_si256(x);
+ __m256i sum256hi = _mm512_extracti64x4_epi64(x, 1);
+
+ return _mm256_add_epi32(_mm256_add_epi32(sum256lo, sum256hi), bias);
+ };
+
+ [[maybe_unused]] auto m512_hadd256x8 =[m512_hadd128x16_interleave](
+ __m512i sum0, __m512i sum1, __m512i sum2, __m512i sum3, __m256i bias) -> __m256i {
+
+ __m512i sum = m512_hadd128x16_interleave(sum0, sum1, sum2, sum3);
+
+ __m512i indices = _mm512_setr_epi32(
+ 0, 4, 8, 12, 2, 6, 10, 14,
+ 1, 5, 9, 13, 3, 7, 11, 15);
+ sum = _mm512_permutexvar_epi32(indices, sum);
+
+ __m256i sum256lo = _mm512_castsi512_si256(sum);
+ __m256i sum256hi = _mm512_extracti64x4_epi64(sum, 1);
+
+ return _mm256_add_epi32(_mm256_hadd_epi32(sum256lo, sum256hi), bias);
+ };
+
+ [[maybe_unused]] auto m512_hadd256x16 = [m512_hadd128x16_interleave](
+ __m512i sum0, __m512i sum1, __m512i sum2, __m512i sum3,
+ __m512i sum4, __m512i sum5, __m512i sum6, __m512i sum7, __m512i bias) -> __m512i {
+
+ __m512i suma = m512_hadd128x16_interleave(sum0, sum1, sum2, sum3);
+ __m512i sumb = m512_hadd128x16_interleave(sum4, sum5, sum6, sum7);
+
+ __m512i indices0 = _mm512_setr_epi64(0, 1, 8, 9, 4, 5, 12, 13);
+ __m512i indices1 = _mm512_setr_epi64(2, 3, 10, 11, 6, 7, 14, 15);
+ __m512i x = _mm512_add_epi32(
+ _mm512_permutex2var_epi64(suma, indices0, sumb),
+ _mm512_permutex2var_epi64(suma, indices1, sumb));
+
+ __m512i indices = _mm512_setr_epi32(0, 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15);
+ return _mm512_add_epi32(_mm512_permutexvar_epi32(indices, x), bias);
+ };
+