summaryrefslogtreecommitdiff
path: root/vendor/httparse/src/simd/runtime.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
committermo khan <mo@mokhan.ca>2025-07-02 18:36:06 -0600
commit8cdfa445d6629ffef4cb84967ff7017654045bc2 (patch)
tree22f0b0907c024c78d26a731e2e1f5219407d8102 /vendor/httparse/src/simd/runtime.rs
parent4351c74c7c5f97156bc94d3a8549b9940ac80e3f (diff)
chore: add vendor directory
Diffstat (limited to 'vendor/httparse/src/simd/runtime.rs')
-rw-r--r--vendor/httparse/src/simd/runtime.rs57
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),
+ }
+ }
+}