#[inline] #[target_feature(enable = "sse2")] unsafefn update_imp(a: u16, b: u16, data: &[u8]) -> (u16, u16) { letmut a = a as u32; letmut b = b as u32;
let chunks = data.chunks_exact(CHUNK_SIZE); let remainder = chunks.remainder(); for chunk in chunks {
update_chunk_block(&mut a, &mut b, chunk);
}
let blocks = chunk.chunks_exact(BLOCK_SIZE); let blocks_remainder = blocks.remainder();
let zero_v = _mm_setzero_si128(); let weight_hi_v = get_weight_hi(); let weight_lo_v = get_weight_lo();
letmut p_v = _mm_set_epi32(0, 0, 0, (*a * blocks.len() as u32) as _); letmut a_v = _mm_setzero_si128(); letmut b_v = _mm_set_epi32(0, 0, 0, *b as _);
for block in blocks { let block_ptr = block.as_ptr() as *const _; let left_v = _mm_loadu_si128(block_ptr); let right_v = _mm_loadu_si128(block_ptr.add(1));
#[inline(always)] unsafefn maddubs(a: __m128i, b: __m128i) -> __m128i { let a_lo = _mm_unpacklo_epi8(a, _mm_setzero_si128()); let a_hi = _mm_unpackhi_epi8(a, _mm_setzero_si128());
let b_lo = _mm_unpacklo_epi8(b, _mm_setzero_si128()); let b_hi = _mm_unpackhi_epi8(b, _mm_setzero_si128());
let lo = _mm_madd_epi16(a_lo, b_lo); let hi = _mm_madd_epi16(a_hi, b_hi);
_mm_add_epi32(lo, hi)
}
#[inline(always)] unsafefn reduce_add(v: __m128i) -> u32 { let hi = _mm_unpackhi_epi64(v, v); let sum = _mm_add_epi32(hi, v); let hi = _mm_shuffle_epi32(sum, crate::imp::_MM_SHUFFLE(2, 3, 0, 1));
fn assert_sum_eq(data: &[u8]) { iflet Some(update) = super::get_imp() { let (a, b) = update(1, 0, data); let left = u32::from(b) << 16 | u32::from(a); let right = adler::adler32_slice(data);
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.