1 | //! `x86_64`'s Streaming SIMD Extensions 4.2 (SSE4.2) |
2 | |
3 | #[cfg (test)] |
4 | use stdarch_test::assert_instr; |
5 | |
6 | #[allow (improper_ctypes)] |
7 | extern "C" { |
8 | #[link_name = "llvm.x86.sse42.crc32.64.64" ] |
9 | fn crc32_64_64(crc: u64, v: u64) -> u64; |
10 | } |
11 | |
12 | /// Starting with the initial value in `crc`, return the accumulated |
13 | /// CRC32-C value for unsigned 64-bit integer `v`. |
14 | /// |
15 | /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_crc32_u64) |
16 | #[inline ] |
17 | #[target_feature (enable = "sse4.2" )] |
18 | #[cfg_attr (test, assert_instr(crc32))] |
19 | #[stable (feature = "simd_x86" , since = "1.27.0" )] |
20 | pub unsafe fn _mm_crc32_u64(crc: u64, v: u64) -> u64 { |
21 | crc32_64_64(crc, v) |
22 | } |
23 | |
24 | #[cfg (test)] |
25 | mod tests { |
26 | use crate::core_arch::arch::x86_64::*; |
27 | |
28 | use stdarch_test::simd_test; |
29 | |
30 | #[simd_test(enable = "sse4.2" )] |
31 | unsafe fn test_mm_crc32_u64() { |
32 | let crc = 0x7819dccd3e824; |
33 | let v = 0x2a22b845fed; |
34 | let i = _mm_crc32_u64(crc, v); |
35 | assert_eq!(i, 0xbb6cdc6c); |
36 | } |
37 | } |
38 | |