branches 0.4.4

Branch hinting prediction and control functions for stable Rust including likely, unlikely, assume and abort, plus read and write cpu prefetch functions to help algorithm optimization
Documentation
#![cfg(feature = "prefetch")]
use branches::*;

#[test]
#[cfg(feature = "prefetch")]
fn test_prefetch_combined_usage_smoke() {
    let mut arr: Vec<u8> = Vec::with_capacity(1_000_000);
    for i in 0..1_000_000 {
        let value = match i % 4 {
            0 => 10,
            1 => 20,
            2 => 30,
            _ => 40,
        };
        arr.push(value);
    }
    let mut acc = 0u32;
    for &v in &arr {
        unsafe {
            assume(v <= 40);
        }
        if likely(v % 20 != 0) {
            acc += v as u32;
        } else if unlikely(v == 20) {
            acc += 1;
        }
        prefetch_read_data::<_, 0>(&arr);
    }
    assert_eq!(acc, 10250000);
}

#[test]
#[cfg(feature = "prefetch")]
fn test_prefetch_read_variants() {
    let buf = [0u8; 64];
    let ptr = buf.as_ptr();
    prefetch_read_data::<_, 0>(ptr);
    prefetch_read_data::<_, 1>(ptr);
    prefetch_read_data::<_, 2>(ptr);
    prefetch_read_data::<_, 3>(ptr);
    assert_eq!(buf.iter().sum::<u8>(), 0);
}

#[test]
#[cfg(feature = "prefetch")]
fn test_prefetch_write_variants() {
    let buf = [1u8; 32];
    let ptr = buf.as_ptr();
    prefetch_write_data::<_, 0>(ptr);
    prefetch_write_data::<_, 1>(ptr);
    prefetch_write_data::<_, 2>(ptr);
    prefetch_write_data::<_, 3>(ptr);
    assert_eq!(buf.iter().sum::<u8>(), 32);
}

#[test]
#[cfg(feature = "prefetch")]
fn test_prefetch_multiple_addresses() {
    let mut big = [0u8; 256];
    for (i, b) in big.iter_mut().enumerate() {
        *b = (i & 0xFF) as u8;
    }
    for chunk in big.chunks(16) {
        prefetch_read_data::<_, 0>(chunk.as_ptr());
        prefetch_write_data::<_, 1>(chunk.as_ptr());
    }
    let checksum: u32 = big.iter().map(|&b| b as u32).sum();
    assert_eq!(checksum, (0u32..256).sum());
}