1use std::ops::{BitAnd, BitOr, BitOrAssign};
2
3pub trait Simd: Sized {
5 const LANES: usize;
6
7 type Element;
8 type Mask: Mask;
9
10 unsafe fn from_slice_unaligned_unchecked(slice: &[u8]) -> Self {
12 debug_assert!(slice.len() >= Self::LANES);
13 Self::loadu(slice.as_ptr())
14 }
15
16 unsafe fn write_to_slice_unaligned_unchecked(&self, slice: &mut [u8]) {
18 debug_assert!(slice.len() >= Self::LANES);
19 self.storeu(slice.as_mut_ptr());
20 }
21
22 unsafe fn loadu(ptr: *const u8) -> Self;
24
25 unsafe fn storeu(&self, ptr: *mut u8);
27
28 fn eq(&self, rhs: &Self) -> Self::Mask;
29
30 fn splat(elem: Self::Element) -> Self;
31
32 fn gt(&self, rhs: &Self) -> Self::Mask;
34
35 fn le(&self, rhs: &Self) -> Self::Mask;
37}
38
39pub trait Mask: Sized + BitOr<Self> + BitOrAssign + BitAnd<Self> {
41 type Element;
42 type BitMask: BitMask;
43
44 fn bitmask(self) -> Self::BitMask;
45
46 fn splat(b: bool) -> Self;
47}
48
49pub trait BitMask {
51 const LEN: usize;
53
54 fn first_offset(&self) -> usize;
56
57 fn before(&self, rhs: &Self) -> bool;
59
60 fn as_little_endian(&self) -> Self;
62
63 fn all_zero(&self) -> bool;
65
66 fn clear_high_bits(&self, n: usize) -> Self;
68}