use std::ops::{Add, AddAssign, Mul, Sub, SubAssign};
pub mod dist_table;
pub mod f32;
pub mod f64;
pub mod i32;
pub mod u8;
use num_traits::{Float, Num};
use u8::u8x16;
pub trait SIMD<T: Num + Copy, const N: usize>:
std::fmt::Debug
+ AddAssign<Self>
+ Add<Self, Output = Self>
+ Mul<Self, Output = Self>
+ Sub<Self, Output = Self>
+ SubAssign<Self>
+ Copy
+ Clone
+ Sized
+ for<'a> From<&'a [T]>
{
const LANES: usize = N;
fn splat(val: T) -> Self;
fn zeros() -> Self;
unsafe fn load(ptr: *const T) -> Self;
unsafe fn load_unaligned(ptr: *const T) -> Self;
unsafe fn store(&self, ptr: *mut T);
unsafe fn store_unaligned(&self, ptr: *mut T);
fn as_array(&self) -> [T; N] {
let mut arr = [T::zero(); N];
unsafe {
self.store_unaligned(arr.as_mut_ptr());
}
arr
}
fn reduce_sum(&self) -> T;
fn reduce_min(&self) -> T;
fn min(&self, rhs: &Self) -> Self;
fn find(&self, val: T) -> Option<i32>;
}
pub trait FloatSimd<F: Float, const N: usize>: SIMD<F, N> {
fn multiply_add(&mut self, a: Self, b: Self);
}
pub trait Shuffle {
fn shuffle(&self, indices: u8x16) -> Self;
}