//! # Safety //! //! The functions in this module should only be executed on x86 machines with the AVX2 extension. use core::arch::x86_64::{
__m256i, _mm256_add_epi32, _mm256_castsi256_si128, _mm256_extracti128_si256, _mm256_madd_epi16,
_mm256_maddubs_epi16, _mm256_permutevar8x32_epi32, _mm256_sad_epu8, _mm256_slli_epi32,
_mm256_zextsi128_si256, _mm_add_epi32, _mm_cvtsi128_si32, _mm_cvtsi32_si128, _mm_shuffle_epi32,
_mm_unpackhi_epi64,
};
#[allow(unused_unsafe)] // because target features 1.1 unsafe { let non_zero = _mm256_permutevar8x32_epi32(x, PERM_VEC); let non_zero_sse = _mm256_castsi256_si128(non_zero); let sum2 = _mm_add_epi32(non_zero_sse, _mm_unpackhi_epi64(non_zero_sse, non_zero_sse)); let sum3 = _mm_add_epi32(sum2, _mm_shuffle_epi32(sum2, 1));
_mm_cvtsi128_si32(sum3) as u32
}
}
pubfn adler32_avx2(adler: u32, src: &[u8]) -> u32 {
assert!(crate::cpu_features::is_enabled_avx2_and_bmi2()); // SAFETY: the assertion above ensures this code is not executed unless the CPU has AVX2. unsafe { adler32_avx2_help(adler, src) }
}
// use largest step possible (without causing overflow) for chunk in middle.chunks(NMAX as usize / 32) {
(adler0, adler1) = unsafe { helper_32_bytes(adler0, adler1, chunk) };
}
#[cfg(test)] #[cfg(target_feature = "avx2")] mod test { usesuper::*;
#[test] fn empty_input() { let avx2 = adler32_avx2(0, &[]); let rust = crate::adler32::generic::adler32_rust(0, &[]);
assert_eq!(rust, avx2);
}
quickcheck::quickcheck! { fn adler32_avx2_is_adler32_rust(v: Vec<u8>, start: u32) -> bool { let avx2 = adler32_avx2(start, &v); let rust = crate::adler32::generic::adler32_rust(start, &v);
rust == avx2
}
}
const INPUT: [u8; 1024] = { letmut array = [0; 1024]; letmut i = 0; while i < array.len() {
array[i] = i as u8;
i += 1;
}
array
};
#[test] fn start_alignment() { // SIMD algorithm is sensitive to alignment; for i in0..16 { for start in [crate::ADLER32_INITIAL_VALUE as u32, 42] { let avx2 = adler32_avx2(start, &INPUT[i..]); let rust = crate::adler32::generic::adler32_rust(start, &INPUT[i..]);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.