From 3df72fddc267144a2052167c012b654974d84bb8 Mon Sep 17 00:00:00 2001 From: Caleb Zulawski Date: Thu, 24 Sep 2020 19:48:18 -0400 Subject: [PATCH] Add masks --- crates/core_simd/src/lib.rs | 19 ++ crates/core_simd/src/macros.rs | 240 +++++++++++++++++------ crates/core_simd/src/masks.rs | 67 +++++++ crates/core_simd/src/vectors_f32.rs | 8 +- crates/core_simd/src/vectors_f64.rs | 6 +- crates/core_simd/src/vectors_i128.rs | 4 +- crates/core_simd/src/vectors_i16.rs | 10 +- crates/core_simd/src/vectors_i32.rs | 8 +- crates/core_simd/src/vectors_i64.rs | 6 +- crates/core_simd/src/vectors_i8.rs | 12 +- crates/core_simd/src/vectors_isize.rs | 6 +- crates/core_simd/src/vectors_mask128.rs | 11 ++ crates/core_simd/src/vectors_mask16.rs | 26 +++ crates/core_simd/src/vectors_mask32.rs | 21 ++ crates/core_simd/src/vectors_mask64.rs | 16 ++ crates/core_simd/src/vectors_mask8.rs | 31 +++ crates/core_simd/src/vectors_masksize.rs | 16 ++ crates/core_simd/src/vectors_u128.rs | 4 +- crates/core_simd/src/vectors_u16.rs | 10 +- crates/core_simd/src/vectors_u32.rs | 8 +- crates/core_simd/src/vectors_u64.rs | 6 +- crates/core_simd/src/vectors_u8.rs | 12 +- crates/core_simd/src/vectors_usize.rs | 6 +- 23 files changed, 439 insertions(+), 114 deletions(-) create mode 100644 crates/core_simd/src/masks.rs create mode 100644 crates/core_simd/src/vectors_mask128.rs create mode 100644 crates/core_simd/src/vectors_mask16.rs create mode 100644 crates/core_simd/src/vectors_mask32.rs create mode 100644 crates/core_simd/src/vectors_mask64.rs create mode 100644 crates/core_simd/src/vectors_mask8.rs create mode 100644 crates/core_simd/src/vectors_masksize.rs diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs index a5dae4b02792..1ee180a5e3a1 100644 --- a/crates/core_simd/src/lib.rs +++ b/crates/core_simd/src/lib.rs @@ -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::*; diff --git a/crates/core_simd/src/macros.rs b/crates/core_simd/src/macros.rs index 5a50b1a48ec1..3b5d70695c61 100644 --- a/crates/core_simd/src/macros.rs +++ b/crates/core_simd/src/macros.rs @@ -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),*) } } } diff --git a/crates/core_simd/src/masks.rs b/crates/core_simd/src/masks.rs new file mode 100644 index 000000000000..970047aabdef --- /dev/null +++ b/crates/core_simd/src/masks.rs @@ -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 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); +} diff --git a/crates/core_simd/src/vectors_f32.rs b/crates/core_simd/src/vectors_f32.rs index 3b38b26d6310..c2987a7f6314 100644 --- a/crates/core_simd/src/vectors_f32.rs +++ b/crates/core_simd/src/vectors_f32.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_f64.rs b/crates/core_simd/src/vectors_f64.rs index f627fffd46b4..4881df2b6dac 100644 --- a/crates/core_simd/src/vectors_f64.rs +++ b/crates/core_simd/src/vectors_f64.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_i128.rs b/crates/core_simd/src/vectors_i128.rs index b4f30f845fd1..939aeb8ce2e9 100644 --- a/crates/core_simd/src/vectors_i128.rs +++ b/crates/core_simd/src/vectors_i128.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_i16.rs b/crates/core_simd/src/vectors_i16.rs index a87fa8c41cd5..b9089a3b4edf 100644 --- a/crates/core_simd/src/vectors_i16.rs +++ b/crates/core_simd/src/vectors_i16.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_i32.rs b/crates/core_simd/src/vectors_i32.rs index 13c9299b7c6e..686576baff18 100644 --- a/crates/core_simd/src/vectors_i32.rs +++ b/crates/core_simd/src/vectors_i32.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_i64.rs b/crates/core_simd/src/vectors_i64.rs index 8d86501a4961..0a34b4c9d7e8 100644 --- a/crates/core_simd/src/vectors_i64.rs +++ b/crates/core_simd/src/vectors_i64.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_i8.rs b/crates/core_simd/src/vectors_i8.rs index f0d5ad55212d..2deacfc1feb7 100644 --- a/crates/core_simd/src/vectors_i8.rs +++ b/crates/core_simd/src/vectors_i8.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_isize.rs b/crates/core_simd/src/vectors_isize.rs index 2028d1ecc710..e709d1758704 100644 --- a/crates/core_simd/src/vectors_isize.rs +++ b/crates/core_simd/src/vectors_isize.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_mask128.rs b/crates/core_simd/src/vectors_mask128.rs new file mode 100644 index 000000000000..3b1bacb7ad3c --- /dev/null +++ b/crates/core_simd/src/vectors_mask128.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_mask16.rs b/crates/core_simd/src/vectors_mask16.rs new file mode 100644 index 000000000000..8d076636caac --- /dev/null +++ b/crates/core_simd/src/vectors_mask16.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_mask32.rs b/crates/core_simd/src/vectors_mask32.rs new file mode 100644 index 000000000000..64044bc4f578 --- /dev/null +++ b/crates/core_simd/src/vectors_mask32.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_mask64.rs b/crates/core_simd/src/vectors_mask64.rs new file mode 100644 index 000000000000..b0c62b225c9b --- /dev/null +++ b/crates/core_simd/src/vectors_mask64.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_mask8.rs b/crates/core_simd/src/vectors_mask8.rs new file mode 100644 index 000000000000..c8f3cbac3c91 --- /dev/null +++ b/crates/core_simd/src/vectors_mask8.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_masksize.rs b/crates/core_simd/src/vectors_masksize.rs new file mode 100644 index 000000000000..1bf911caffc6 --- /dev/null +++ b/crates/core_simd/src/vectors_masksize.rs @@ -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]); +} diff --git a/crates/core_simd/src/vectors_u128.rs b/crates/core_simd/src/vectors_u128.rs index 4b47fb2fa2ec..f98026275c73 100644 --- a/crates/core_simd/src/vectors_u128.rs +++ b/crates/core_simd/src/vectors_u128.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_u16.rs b/crates/core_simd/src/vectors_u16.rs index f637d2fe9f2c..e6ec15679f8c 100644 --- a/crates/core_simd/src/vectors_u16.rs +++ b/crates/core_simd/src/vectors_u16.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_u32.rs b/crates/core_simd/src/vectors_u32.rs index d2f5d7d241c5..e347509fa54b 100644 --- a/crates/core_simd/src/vectors_u32.rs +++ b/crates/core_simd/src/vectors_u32.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_u64.rs b/crates/core_simd/src/vectors_u64.rs index e6e21e62da10..a3b786230975 100644 --- a/crates/core_simd/src/vectors_u64.rs +++ b/crates/core_simd/src/vectors_u64.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_u8.rs b/crates/core_simd/src/vectors_u8.rs index f6246f87ecec..eac58dcc9634 100644 --- a/crates/core_simd/src/vectors_u8.rs +++ b/crates/core_simd/src/vectors_u8.rs @@ -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]); } diff --git a/crates/core_simd/src/vectors_usize.rs b/crates/core_simd/src/vectors_usize.rs index 45da00562f60..dc97715f0c8d 100644 --- a/crates/core_simd/src/vectors_usize.rs +++ b/crates/core_simd/src/vectors_usize.rs @@ -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]); }