]> git.ipfire.org Git - thirdparty/zlib-ng.git/commitdiff
Use mm_blend_epi16 in crc32_(v)pclmulqdq final reduction
authorNathan Moinvaziri <nathan@nathanm.com>
Fri, 2 Jan 2026 22:47:53 +0000 (14:47 -0800)
committerHans Kristian Rosbach <hk-github@circlestorm.org>
Sat, 17 Jan 2026 19:37:25 +0000 (20:37 +0100)
This is the preferred operation mentioned in
https://www.corsix.org/content/alternative-exposition-crc32_4k_pclmulqdq

arch/x86/crc32_pclmulqdq_tpl.h

index 5271a6846d503ae650d31c2c70f1f3d895de29a4..d18839bbbe340fb72d9bee7030eb055f37a1e8ff 100644 (file)
@@ -210,7 +210,7 @@ static inline uint32_t fold_final(__m128i *xmm_crc0, __m128i *xmm_crc1, __m128i
     __m128i x_tmp0 = _mm_clmulepi64_si128(*xmm_crc3, barrett_k, 0x00);
     __m128i x_tmp1 = _mm_clmulepi64_si128(x_tmp0, barrett_k, 0x10);
 
-    x_tmp1 = _mm_and_si128(x_tmp1, _mm_setr_epi32(0, 0, ~0, 0));
+    x_tmp1 = _mm_blend_epi16(x_tmp1, _mm_setzero_si128(), 0xcf);
     x_tmp0 = _mm_xor_si128(x_tmp1, *xmm_crc3);
 
     __m128i x_res_a = _mm_clmulepi64_si128(x_tmp0, barrett_k, 0x01);