Add masks

This commit is contained in:
Caleb Zulawski 2020-09-24 19:48:18 -04:00
parent 872e8f62d6
commit 3df72fddc2
23 changed files with 439 additions and 114 deletions

View file

@ -1,10 +1,14 @@
#![no_std]
#![feature(repr_simd)]
#![warn(missing_docs)]
//! Portable SIMD module.
#[macro_use]
mod macros;
mod masks;
pub use masks::*;
mod vectors_u8;
pub use vectors_u8::*;
mod vectors_u16;
@ -17,6 +21,7 @@ mod vectors_u128;
pub use vectors_u128::*;
mod vectors_usize;
pub use vectors_usize::*;
mod vectors_i8;
pub use vectors_i8::*;
mod vectors_i16;
@ -29,7 +34,21 @@ mod vectors_i128;
pub use vectors_i128::*;
mod vectors_isize;
pub use vectors_isize::*;
mod vectors_f32;
pub use vectors_f32::*;
mod vectors_f64;
pub use vectors_f64::*;
mod vectors_mask8;
pub use vectors_mask8::*;
mod vectors_mask16;
pub use vectors_mask16::*;
mod vectors_mask32;
pub use vectors_mask32::*;
mod vectors_mask64;
pub use vectors_mask64::*;
mod vectors_mask128;
pub use vectors_mask128::*;
mod vectors_masksize;
pub use vectors_masksize::*;

View file

@ -1,3 +1,4 @@
/// Provides implementations of `From<$a> for $b` and `From<$b> for $a` that transmutes the value.
macro_rules! from_transmute {
{ unsafe $a:ty => $b:ty } => {
from_transmute!{ @impl $a => $b }
@ -13,6 +14,8 @@ macro_rules! from_transmute {
};
}
/// Provides implementations of `From<$generic> for core::arch::{x86, x86_64}::$intel` and
/// vice-versa that transmutes the value.
macro_rules! from_transmute_x86 {
{ unsafe $generic:ty => $intel:ident } => {
#[cfg(target_arch = "x86")]
@ -23,10 +26,118 @@ macro_rules! from_transmute_x86 {
}
}
macro_rules! define_type {
{ $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => {
define_type! { @impl $(#[$attr])* | $name [$type; $lanes] }
/// Calls a the macro `$mac` with the provided `$args` followed by `$repeat` repeated the specified
/// number of times.
macro_rules! call_repeat {
{ 1 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)*
}
};
{ 2 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)*
}
};
{ 4 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)*
}
};
{ 8 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
}
};
{ 16 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
}
};
{ 32 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
}
};
{ 64 => $mac:path [$($repeat:tt)*] $($args:tt)* } => {
$mac! {
$($args)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
$($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)* $($repeat)*
}
};
}
/// Calls the macro `$mac` with the specified `$args` followed by the specified number of unique
/// identifiers.
macro_rules! call_counting_args {
{ 1 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
value
}
};
{ 2 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v1 v2
}
};
{ 4 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v0 v1 v2 v3
}
};
{ 8 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v0 v1 v2 v3 v4 v5 v6 v7
}
};
{ 16 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15
}
};
{ 32 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15
v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31
}
};
{ 64 => $mac:path => $($args:tt)* } => {
$mac! {
$($args)*
v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15
v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31
v32 v33 v34 v35 v36 v37 v38 v39 v40 v41 v42 v43 v44 v45 v46 v47
v48 v49 v50 v51 v52 v53 v54 v55 v56 v57 v58 v59 v60 v61 v62 v63
}
};
}
/// Implements common traits on the specified vector `$name`, holding multiple `$lanes` of `$type`.
macro_rules! base_vector_traits {
{ $name:path => [$type:ty; $lanes:literal] } => {
// array references
impl AsRef<[$type; $lanes]> for $name {
#[inline]
@ -67,71 +178,78 @@ macro_rules! define_type {
Self::splat(value)
}
}
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 1] } => {
define_type! { @def $(#[$attr])* | $name | $type | $type, | v0, }
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 2] } => {
define_type! { @def $(#[$attr])* | $name | $type | $type, $type, | v0, v1, }
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 4] } => {
define_type! { @def $(#[$attr])* | $name | $type |
$type, $type, $type, $type, |
v0, v1, v2, v3,
}
}
/// Defines a vector `$name` containing multiple `$lanes` of `$type`.
macro_rules! define_vector {
{ $(#[$attr:meta])* struct $name:ident([$type:ty; $lanes:tt]); } => {
call_repeat! { $lanes => define_vector [$type] def $(#[$attr])* | $name | }
impl $name {
call_repeat! { $lanes => define_vector [$type] splat $type | }
call_counting_args! { $lanes => define_vector => new $type | }
}
base_vector_traits! { $name => [$type; $lanes] }
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 8] } => {
define_type! { @def $(#[$attr])* | $name | $type |
$type, $type, $type, $type, $type, $type, $type, $type, |
v0, v1, v2, v3, v4, v5, v6, v7,
}
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 16] } => {
define_type! { @def $(#[$attr])* | $name | $type |
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, |
v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
}
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 32] } => {
define_type! { @def $(#[$attr])* | $name | $type |
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type,
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, |
v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
}
};
{ @impl $(#[$attr:meta])* | $name:ident [$type:ty; 64] } => {
define_type! { @def $(#[$attr])* | $name | $type |
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type,
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type,
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type,
$type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, $type, |
v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63,
}
};
{ @def $(#[$attr:meta])* | $name:ident | $type:ty | $($itype:ty,)* | $($ivar:ident,)* } => {
{ def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => {
$(#[$attr])*
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)]
#[repr(simd)]
pub struct $name($($itype),*);
impl $name {
/// Construct a vector by setting all lanes to the given value.
#[inline]
pub const fn splat(value: $type) -> Self {
Self($(value as $itype),*)
}
/// Construct a vector by setting each lane to the given values.
#[allow(clippy::too_many_arguments)]
#[inline]
pub const fn new($($ivar: $itype),*) -> Self {
Self($($ivar),*)
}
};
{ splat $type:ty | $($itype:ty)* } => {
/// Construct a vector by setting all lanes to the given value.
#[inline]
pub const fn splat(value: $type) -> Self {
Self($(value as $itype),*)
}
};
{ new $type:ty | $($var:ident)* } => {
/// Construct a vector by setting each lane to the given values.
#[allow(clippy::too_many_arguments)]
#[inline]
pub const fn new($($var: $type),*) -> Self {
Self($($var),*)
}
}
}
/// Defines a mask vector `$name` containing multiple `$lanes` of `$type`, represented by the
/// underlying type `$impl_type`.
macro_rules! define_mask_vector {
{ $(#[$attr:meta])* struct $name:ident([$impl_type:ty as $type:ty; $lanes:tt]); } => {
call_repeat! { $lanes => define_mask_vector [$impl_type] def $(#[$attr])* | $name | }
impl $name {
call_repeat! { $lanes => define_mask_vector [$impl_type] splat $type | }
call_counting_args! { $lanes => define_mask_vector => new $type | }
}
base_vector_traits! { $name => [$type; $lanes] }
};
{ def $(#[$attr:meta])* | $name:ident | $($itype:ty)* } => {
$(#[$attr])*
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd)]
#[repr(simd)]
pub struct $name($($itype),*);
};
{ splat $type:ty | $($itype:ty)* } => {
/// Construct a vector by setting all lanes to the given value.
#[inline]
pub const fn splat(value: $type) -> Self {
Self($(value.0 as $itype),*)
}
};
{ new $type:ty | $($var:ident)* } => {
/// Construct a vector by setting each lane to the given values.
#[allow(clippy::too_many_arguments)]
#[inline]
pub const fn new($($var: $type),*) -> Self {
Self($($var.0),*)
}
}
}

View file

@ -0,0 +1,67 @@
macro_rules! define_mask {
{ $(#[$attr:meta])* struct $name:ident($type:ty); } => {
$(#[$attr])*
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, Default, PartialEq, PartialOrd, Eq, Ord, Hash)]
#[repr(transparent)]
pub struct $name(pub(crate) $type);
impl $name {
/// Construct a mask from the given value.
pub const fn new(value: bool) -> Self {
if value {
Self(!0)
} else {
Self(0)
}
}
/// Test if the mask is set.
pub const fn test(&self) -> bool {
self.0 != 0
}
}
impl core::convert::From<bool> for $name {
fn from(value: bool) -> Self {
Self::new(value)
}
}
impl core::convert::From<$name> for bool {
fn from(mask: $name) -> Self {
mask.test()
}
}
}
}
define_mask! {
#[doc = "8-bit mask"]
struct mask8(i8);
}
define_mask! {
#[doc = "16-bit mask"]
struct mask16(i16);
}
define_mask! {
#[doc = "32-bit mask"]
struct mask32(i32);
}
define_mask! {
#[doc = "64-bit mask"]
struct mask64(i64);
}
define_mask! {
#[doc = "128-bit mask"]
struct mask128(i128);
}
define_mask! {
#[doc = "`isize`-wide mask"]
struct masksize(isize);
}

View file

@ -1,19 +1,19 @@
define_type! {
define_vector! {
#[doc = "Vector of two `f32` values"]
struct f32x2([f32; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `f32` values"]
struct f32x4([f32; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `f32` values"]
struct f32x8([f32; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `f32` values"]
struct f32x16([f32; 16]);
}

View file

@ -1,14 +1,14 @@
define_type! {
define_vector! {
#[doc = "Vector of two `f64` values"]
struct f64x2([f64; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `f64` values"]
struct f64x4([f64; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `f64` values"]
struct f64x8([f64; 8]);
}

View file

@ -1,9 +1,9 @@
define_type! {
define_vector! {
#[doc = "Vector of two `i128` values"]
struct i128x2([i128; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `i128` values"]
struct i128x4([i128; 4]);
}

View file

@ -1,24 +1,24 @@
define_type! {
define_vector! {
#[doc = "Vector of two `i16` values"]
struct i16x2([i16; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `i16` values"]
struct i16x4([i16; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `i16` values"]
struct i16x8([i16; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `i16` values"]
struct i16x16([i16; 16]);
}
define_type! {
define_vector! {
#[doc = "Vector of 32 `i16` values"]
struct i16x32([i16; 32]);
}

View file

@ -1,19 +1,19 @@
define_type! {
define_vector! {
#[doc = "Vector of two `i32` values"]
struct i32x2([i32; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `i32` values"]
struct i32x4([i32; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `i32` values"]
struct i32x8([i32; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `i32` values"]
struct i32x16([i32; 16]);
}

View file

@ -1,14 +1,14 @@
define_type! {
define_vector! {
#[doc = "Vector of two `i64` values"]
struct i64x2([i64; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `i64` values"]
struct i64x4([i64; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `i64` values"]
struct i64x8([i64; 8]);
}

View file

@ -1,29 +1,29 @@
define_type! {
define_vector! {
#[doc = "Vector of two `i8` values"]
struct i8x2([i8; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `i8` values"]
struct i8x4([i8; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `i8` values"]
struct i8x8([i8; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `i8` values"]
struct i8x16([i8; 16]);
}
define_type! {
define_vector! {
#[doc = "Vector of 32 `i8` values"]
struct i8x32([i8; 32]);
}
define_type! {
define_vector! {
#[doc = "Vector of 64 `i8` values"]
struct i8x64([i8; 64]);
}

View file

@ -1,14 +1,14 @@
define_type! {
define_vector! {
#[doc = "Vector of two `isize` values"]
struct isizex2([isize; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `isize` values"]
struct isizex4([isize; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `isize` values"]
struct isizex8([isize; 8]);
}

View file

@ -0,0 +1,11 @@
use crate::mask128;
define_mask_vector! {
#[doc = "vector of two `mask128` values"]
struct mask128x2([i128 as mask128; 2]);
}
define_mask_vector! {
#[doc = "vector of four `mask128` values"]
struct mask128x4([i128 as mask128; 4]);
}

View file

@ -0,0 +1,26 @@
use crate::mask16;
define_mask_vector! {
#[doc = "vector of two `mask16` values"]
struct mask16x2([i16 as mask16; 2]);
}
define_mask_vector! {
#[doc = "vector of four `mask16` values"]
struct mask16x4([i16 as mask16; 4]);
}
define_mask_vector! {
#[doc = "vector of eight `mask16` values"]
struct mask16x8([i16 as mask16; 8]);
}
define_mask_vector! {
#[doc = "vector of 16 `mask16` values"]
struct mask16x16([i16 as mask16; 16]);
}
define_mask_vector! {
#[doc = "vector of 32 `mask16` values"]
struct mask16x32([i16 as mask16; 32]);
}

View file

@ -0,0 +1,21 @@
use crate::mask32;
define_mask_vector! {
#[doc = "vector of two `mask32` values"]
struct mask32x2([i32 as mask32; 2]);
}
define_mask_vector! {
#[doc = "vector of four `mask32` values"]
struct mask32x4([i32 as mask32; 4]);
}
define_mask_vector! {
#[doc = "vector of eight `mask32` values"]
struct mask32x8([i32 as mask32; 8]);
}
define_mask_vector! {
#[doc = "vector of 16 `mask32` values"]
struct mask32x16([i32 as mask32; 16]);
}

View file

@ -0,0 +1,16 @@
use crate::mask64;
define_mask_vector! {
#[doc = "vector of two `mask64` values"]
struct mask64x2([i64 as mask64; 2]);
}
define_mask_vector! {
#[doc = "vector of four `mask64` values"]
struct mask64x4([i64 as mask64; 4]);
}
define_mask_vector! {
#[doc = "vector of eight `mask64` values"]
struct mask64x8([i64 as mask64; 8]);
}

View file

@ -0,0 +1,31 @@
use crate::mask8;
define_mask_vector! {
#[doc = "vector of two `mask8` values"]
struct mask8x2([i8 as mask8; 2]);
}
define_mask_vector! {
#[doc = "vector of four `mask8` values"]
struct mask8x4([i8 as mask8; 4]);
}
define_mask_vector! {
#[doc = "vector of eight `mask8` values"]
struct mask8x8([i8 as mask8; 8]);
}
define_mask_vector! {
#[doc = "vector of 16 `mask8` values"]
struct mask8x16([i8 as mask8; 16]);
}
define_mask_vector! {
#[doc = "vector of 32 `mask8` values"]
struct mask8x32([i8 as mask8; 32]);
}
define_mask_vector! {
#[doc = "vector of 64 `mask8` values"]
struct mask8x64([i8 as mask8; 64]);
}

View file

@ -0,0 +1,16 @@
use crate::masksize;
define_mask_vector! {
#[doc = "vector of two `masksize` values"]
struct masksizex2([isize as masksize; 2]);
}
define_mask_vector! {
#[doc = "vector of four `masksize` values"]
struct masksizex4([isize as masksize; 4]);
}
define_mask_vector! {
#[doc = "vector of eight `masksize` values"]
struct masksizex8([isize as masksize; 8]);
}

View file

@ -1,9 +1,9 @@
define_type! {
define_vector! {
#[doc = "Vector of two `u128` values"]
struct u128x2([u128; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `u128` values"]
struct u128x4([u128; 4]);
}

View file

@ -1,24 +1,24 @@
define_type! {
define_vector! {
#[doc = "Vector of two `u16` values"]
struct u16x2([u16; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `u16` values"]
struct u16x4([u16; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `u16` values"]
struct u16x8([u16; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `u16` values"]
struct u16x16([u16; 16]);
}
define_type! {
define_vector! {
#[doc = "Vector of 32 `u16` values"]
struct u16x32([u16; 32]);
}

View file

@ -1,19 +1,19 @@
define_type! {
define_vector! {
#[doc = "Vector of two `u32` values"]
struct u32x2([u32; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `u32` values"]
struct u32x4([u32; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `u32` values"]
struct u32x8([u32; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `u32` values"]
struct u32x16([u32; 16]);
}

View file

@ -1,14 +1,14 @@
define_type! {
define_vector! {
#[doc = "Vector of two `u64` values"]
struct u64x2([u64; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `u64` values"]
struct u64x4([u64; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `u64` values"]
struct u64x8([u64; 8]);
}

View file

@ -1,29 +1,29 @@
define_type! {
define_vector! {
#[doc = "Vector of two `u8` values"]
struct u8x2([u8; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `u8` values"]
struct u8x4([u8; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `u8` values"]
struct u8x8([u8; 8]);
}
define_type! {
define_vector! {
#[doc = "Vector of 16 `u8` values"]
struct u8x16([u8; 16]);
}
define_type! {
define_vector! {
#[doc = "Vector of 32 `u8` values"]
struct u8x32([u8; 32]);
}
define_type! {
define_vector! {
#[doc = "Vector of 64 `u8` values"]
struct u8x64([u8; 64]);
}

View file

@ -1,14 +1,14 @@
define_type! {
define_vector! {
#[doc = "Vector of two `usize` values"]
struct usizex2([usize; 2]);
}
define_type! {
define_vector! {
#[doc = "Vector of four `usize` values"]
struct usizex4([usize; 4]);
}
define_type! {
define_vector! {
#[doc = "Vector of eight `usize` values"]
struct usizex8([usize; 8]);
}