diff options
| author | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
|---|---|---|
| committer | mo khan <mo@mokhan.ca> | 2025-07-02 18:36:06 -0600 |
| commit | 8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch) | |
| tree | 22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/httparse/src/simd/runtime.rs | |
| parent | 4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff) | |
chore: add vendor directory
Diffstat (limited to 'vendor/httparse/src/simd/runtime.rs')
| -rw-r--r-- | vendor/httparse/src/simd/runtime.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/vendor/httparse/src/simd/runtime.rs b/vendor/httparse/src/simd/runtime.rs new file mode 100644 index 00000000..c523a921 --- /dev/null +++ b/vendor/httparse/src/simd/runtime.rs @@ -0,0 +1,57 @@ +use std::sync::atomic::{AtomicU8, Ordering}; +use crate::iter::Bytes; +use super::avx2; +use super::sse42; + +const AVX2: u8 = 1; +const SSE42: u8 = 2; +const NOP: u8 = 3; + +fn detect_runtime_feature() -> u8 { + if is_x86_feature_detected!("avx2") { + AVX2 + } else if is_x86_feature_detected!("sse4.2") { + SSE42 + } else { + NOP + } +} + +static RUNTIME_FEATURE: AtomicU8 = AtomicU8::new(0); + +#[inline] +fn get_runtime_feature() -> u8 { + let mut feature = RUNTIME_FEATURE.load(Ordering::Relaxed); + if feature == 0 { + feature = detect_runtime_feature(); + RUNTIME_FEATURE.store(feature, Ordering::Relaxed); + } + + feature +} + +pub fn match_header_name_vectored(bytes: &mut Bytes) { + super::swar::match_header_name_vectored(bytes); +} + +pub fn match_uri_vectored(bytes: &mut Bytes) { + // SAFETY: calls are guarded by a feature check + unsafe { + match get_runtime_feature() { + AVX2 => avx2::match_uri_vectored(bytes), + SSE42 => sse42::match_uri_vectored(bytes), + _ /* NOP */ => super::swar::match_uri_vectored(bytes), + } + } +} + +pub fn match_header_value_vectored(bytes: &mut Bytes) { + // SAFETY: calls are guarded by a feature check + unsafe { + match get_runtime_feature() { + AVX2 => avx2::match_header_value_vectored(bytes), + SSE42 => sse42::match_header_value_vectored(bytes), + _ /* NOP */ => super::swar::match_header_value_vectored(bytes), + } + } +} |
