blob: 6b5d087c1730411ba81f01f9eaf76f6151f3b549 [file] [log] [blame]
//! `x86_64`'s Streaming SIMD Extensions 4.2 (SSE4.2)
#[cfg(test)]
use stdarch_test::assert_instr;
#[allow(improper_ctypes)]
extern "C" {
#[link_name = "llvm.x86.sse42.crc32.64.64"]
fn crc32_64_64(crc: u64, v: u64) -> u64;
}
/// Starting with the initial value in `crc`, return the accumulated
/// CRC32-C value for unsigned 64-bit integer `v`.
///
/// [Intel's documentation](https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm_crc32_u64)
#[inline]
#[target_feature(enable = "sse4.2")]
#[cfg_attr(test, assert_instr(crc32))]
#[stable(feature = "simd_x86", since = "1.27.0")]
pub unsafe fn _mm_crc32_u64(crc: u64, v: u64) -> u64 {
crc32_64_64(crc, v)
}
#[cfg(test)]
mod tests {
use crate::core_arch::arch::x86_64::*;
use stdarch_test::simd_test;
#[simd_test(enable = "sse4.2")]
unsafe fn test_mm_crc32_u64() {
let crc = 0x7819dccd3e824;
let v = 0x2a22b845fed;
let i = _mm_crc32_u64(crc, v);
assert_eq!(i, 0xbb6cdc6c);
}
}