Skip to content

Commit 865137a

Browse files
committed
crc32: make code emulate zlib-ng more
1 parent 126eedb commit 865137a

File tree

1 file changed

+12
-12
lines changed

1 file changed

+12
-12
lines changed

zlib-rs/src/crc32/pclmulqdq.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use core::arch::x86_64::__m128i;
22
use core::arch::x86_64::{
3-
_mm_and_si128, _mm_clmulepi64_si128, _mm_extract_epi32, _mm_load_si128, _mm_loadu_si128,
4-
_mm_or_si128, _mm_shuffle_epi8, _mm_slli_si128, _mm_srli_si128, _mm_storeu_si128,
5-
_mm_xor_si128,
3+
_mm_and_si128, _mm_clmulepi64_si128, _mm_cvtsi32_si128, _mm_extract_epi32, _mm_load_si128,
4+
_mm_loadu_si128, _mm_or_si128, _mm_shuffle_epi8, _mm_slli_si128, _mm_srli_si128,
5+
_mm_storeu_si128, _mm_xor_si128,
66
};
77

88
use crate::CRC32_INITIAL_VALUE;
@@ -249,21 +249,22 @@ impl Accumulator {
249249
// bytes of input is needed for the aligning load that occurs. If there's an initial CRC, to
250250
// carry it forward through the folded CRC there must be 16 - src % 16 + 16 bytes available, which
251251
// by definition can be up to 15 bytes + one full vector load. */
252-
assert!(src.len() >= 31 || init_crc == CRC32_INITIAL_VALUE);
252+
let xmm_initial = _mm_cvtsi32_si128(init_crc as i32);
253+
let first = init_crc != CRC32_INITIAL_VALUE;
254+
assert!(src.len() >= 31 || !first);
253255

254256
if COPY {
255257
assert_eq!(dst.len(), src.len(), "dst and src must be the same length")
256258
}
257259

258260
if src.len() < 16 {
259-
if COPY {
260-
if src.is_empty() {
261-
return;
262-
}
261+
if src.is_empty() {
262+
return;
263+
}
263264

264-
partial_buf.0[..src.len()].copy_from_slice(src);
265-
xmm_crc_part =
266-
unsafe { _mm_load_si128(partial_buf.0.as_mut_ptr() as *mut __m128i) };
265+
partial_buf.0[..src.len()].copy_from_slice(src);
266+
xmm_crc_part = unsafe { _mm_load_si128(partial_buf.0.as_mut_ptr() as *mut __m128i) };
267+
if COPY {
267268
dst[..src.len()].copy_from_slice(&partial_buf.0[..src.len()]);
268269
}
269270
} else {
@@ -280,7 +281,6 @@ impl Accumulator {
280281
let is_initial = init_crc == CRC32_INITIAL_VALUE;
281282

282283
if !is_initial {
283-
let xmm_initial = reg([init_crc, 0, 0, 0]);
284284
xmm_crc_part = unsafe { _mm_xor_si128(xmm_crc_part, xmm_initial) };
285285
init_crc = CRC32_INITIAL_VALUE;
286286
}

0 commit comments

Comments
 (0)