summaryrefslogtreecommitdiffstats
path: root/vendor/memchr/src/memmem/prefilter/x86/avx.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/memchr/src/memmem/prefilter/x86/avx.rs')
-rw-r--r--vendor/memchr/src/memmem/prefilter/x86/avx.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/vendor/memchr/src/memmem/prefilter/x86/avx.rs b/vendor/memchr/src/memmem/prefilter/x86/avx.rs
new file mode 100644
index 000000000..fb11f335b
--- /dev/null
+++ b/vendor/memchr/src/memmem/prefilter/x86/avx.rs
@@ -0,0 +1,46 @@
+use core::arch::x86_64::__m256i;
+
+use crate::memmem::{
+ prefilter::{PrefilterFnTy, PrefilterState},
+ NeedleInfo,
+};
+
+// Check that the functions below satisfy the Prefilter function type.
+const _: PrefilterFnTy = find;
+
+/// An AVX2 accelerated candidate finder for single-substring search.
+///
+/// # Safety
+///
+/// Callers must ensure that the avx2 CPU feature is enabled in the current
+/// environment.
+#[target_feature(enable = "avx2")]
+pub(crate) unsafe fn find(
+ prestate: &mut PrefilterState,
+ ninfo: &NeedleInfo,
+ haystack: &[u8],
+ needle: &[u8],
+) -> Option<usize> {
+ super::super::genericsimd::find::<__m256i>(
+ prestate,
+ ninfo,
+ haystack,
+ needle,
+ super::sse::find,
+ )
+}
+
+#[cfg(test)]
+mod tests {
+ #[test]
+ #[cfg(not(miri))]
+ fn prefilter_permutations() {
+ use crate::memmem::prefilter::tests::PrefilterTest;
+ if !is_x86_feature_detected!("avx2") {
+ return;
+ }
+ // SAFETY: The safety of super::find only requires that the current
+ // CPU support AVX2, which we checked above.
+ unsafe { PrefilterTest::run_all_tests(super::find) };
+ }
+}