• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 cfg_if! {
2     // Use the SSE2 implementation if possible: it allows us to scan 16 buckets
3     // at once instead of 8. We don't bother with AVX since it would require
4     // runtime dispatch and wouldn't gain us much anyways: the probability of
5     // finding a match drops off drastically after the first few buckets.
6     //
7     // I attempted an implementation on ARM using NEON instructions, but it
8     // turns out that most NEON instructions have multi-cycle latency, which in
9     // the end outweighs any gains over the generic implementation.
10     if #[cfg(all(
11         target_feature = "sse2",
12         any(target_arch = "x86", target_arch = "x86_64"),
13         not(miri),
14     ))] {
15         mod sse2;
16         use sse2 as imp;
17     } else if #[cfg(all(
18         target_arch = "aarch64",
19         target_feature = "neon",
20         // NEON intrinsics are currently broken on big-endian targets.
21         // See https://github.com/rust-lang/stdarch/issues/1484.
22         target_endian = "little",
23         not(miri),
24     ))] {
25         mod neon;
26         use neon as imp;
27     } else {
28         mod generic;
29         use generic as imp;
30     }
31 }
32 pub(crate) use self::imp::Group;
33 pub(super) use self::imp::{
34     BitMaskWord, NonZeroBitMaskWord, BITMASK_ITER_MASK, BITMASK_MASK, BITMASK_STRIDE,
35 };
36