summaryrefslogtreecommitdiffstats
path: root/vendor/memchr/src/memmem/prefilter/x86
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/memchr/src/memmem/prefilter/x86')
-rw-r--r--vendor/memchr/src/memmem/prefilter/x86/avx.rs46
-rw-r--r--vendor/memchr/src/memmem/prefilter/x86/mod.rs5
-rw-r--r--vendor/memchr/src/memmem/prefilter/x86/sse.rs42
3 files changed, 93 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) };
+ }
+}
diff --git a/vendor/memchr/src/memmem/prefilter/x86/mod.rs b/vendor/memchr/src/memmem/prefilter/x86/mod.rs
new file mode 100644
index 000000000..91381e516
--- /dev/null
+++ b/vendor/memchr/src/memmem/prefilter/x86/mod.rs
@@ -0,0 +1,5 @@
+// We only use AVX when we can detect at runtime whether it's available, which
+// requires std.
+#[cfg(feature = "std")]
+pub(crate) mod avx;
+pub(crate) mod sse;
diff --git a/vendor/memchr/src/memmem/prefilter/x86/sse.rs b/vendor/memchr/src/memmem/prefilter/x86/sse.rs
new file mode 100644
index 000000000..b1c48e1e1
--- /dev/null
+++ b/vendor/memchr/src/memmem/prefilter/x86/sse.rs
@@ -0,0 +1,42 @@
+use core::arch::x86_64::__m128i;
+
+use crate::memmem::{
+ prefilter::{PrefilterFnTy, PrefilterState},
+ NeedleInfo,
+};
+
+// Check that the functions below satisfy the Prefilter function type.
+const _: PrefilterFnTy = find;
+
+/// An SSE2 accelerated candidate finder for single-substring search.
+///
+/// # Safety
+///
+/// Callers must ensure that the sse2 CPU feature is enabled in the current
+/// environment. This feature should be enabled in all x86_64 targets.
+#[target_feature(enable = "sse2")]
+pub(crate) unsafe fn find(
+ prestate: &mut PrefilterState,
+ ninfo: &NeedleInfo,
+ haystack: &[u8],
+ needle: &[u8],
+) -> Option<usize> {
+ super::super::genericsimd::find::<__m128i>(
+ prestate,
+ ninfo,
+ haystack,
+ needle,
+ super::super::simple_memchr_fallback,
+ )
+}
+
+#[cfg(all(test, feature = "std"))]
+mod tests {
+ #[test]
+ #[cfg(not(miri))]
+ fn prefilter_permutations() {
+ use crate::memmem::prefilter::tests::PrefilterTest;
+ // SAFETY: super::find is safe to call for all inputs on x86.
+ unsafe { PrefilterTest::run_all_tests(super::find) };
+ }
+}