11use core:: arch:: x86_64:: __m128i;
22use 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
88use 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