about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJubilee <46493976+workingjubilee@users.noreply.github.com>2021-04-26 00:12:51 -0700
committerGitHub <noreply@github.com>2021-04-26 00:12:51 -0700
commita9a1c9dbb727fc7693147e20b13ffbe4f565ecb8 (patch)
treedb21619a161add6014ad84a350365e4e26cdce95
parent24ebae870e11ed60a83ca0acccc202387f95f25f (diff)
parent92d643b6283b0171873de4c46f708005af025f33 (diff)
downloadrust-a9a1c9dbb727fc7693147e20b13ffbe4f565ecb8.tar.gz
rust-a9a1c9dbb727fc7693147e20b13ffbe4f565ecb8.zip
Merge pull request #100 from rust-lang/fix-sat-math
Fix sat math at the cost of Simd{U,I}128 for now
-rw-r--r--crates/core_simd/src/comparisons.rs2
-rw-r--r--crates/core_simd/src/fmt.rs4
-rw-r--r--crates/core_simd/src/lanes_at_most_32.rs (renamed from crates/core_simd/src/lanes_at_most_64.rs)2
-rw-r--r--crates/core_simd/src/lib.rs4
-rw-r--r--crates/core_simd/src/masks/full_masks.rs6
-rw-r--r--crates/core_simd/src/masks/mod.rs16
-rw-r--r--crates/core_simd/src/math.rs35
-rw-r--r--crates/core_simd/src/ops.rs2
-rw-r--r--crates/core_simd/src/vector/int.rs17
-rw-r--r--crates/core_simd/src/vector/uint.rs17
-rw-r--r--crates/core_simd/tests/i128_ops.rs3
-rw-r--r--crates/core_simd/tests/mask_ops_impl/mask128.rs2
-rw-r--r--crates/core_simd/tests/mask_ops_impl/mod.rs1
-rw-r--r--crates/core_simd/tests/u128_ops.rs3
-rw-r--r--crates/test_helpers/src/lib.rs4
15 files changed, 32 insertions, 86 deletions
diff --git a/crates/core_simd/src/comparisons.rs b/crates/core_simd/src/comparisons.rs
index 455f30dc97e..988ff857eab 100644
--- a/crates/core_simd/src/comparisons.rs
+++ b/crates/core_simd/src/comparisons.rs
@@ -71,14 +71,12 @@ implement_mask_ops! {
     SimdI16 => Mask16 (SimdMask16, SimdI16),
     SimdI32 => Mask32 (SimdMask32, SimdI32),
     SimdI64 => Mask64 (SimdMask64, SimdI64),
-    SimdI128 => Mask128 (SimdMask128, SimdI128),
     SimdIsize => MaskSize (SimdMaskSize, SimdIsize),
 
     SimdU8 => Mask8 (SimdMask8, SimdI8),
     SimdU16 => Mask16 (SimdMask16, SimdI16),
     SimdU32 => Mask32 (SimdMask32, SimdI32),
     SimdU64 => Mask64 (SimdMask64, SimdI64),
-    SimdU128 => Mask128 (SimdMask128, SimdI128),
     SimdUsize => MaskSize (SimdMaskSize, SimdIsize),
 
     SimdF32 => Mask32 (SimdMask32, SimdI32),
diff --git a/crates/core_simd/src/fmt.rs b/crates/core_simd/src/fmt.rs
index faf0c20e922..1d5010843eb 100644
--- a/crates/core_simd/src/fmt.rs
+++ b/crates/core_simd/src/fmt.rs
@@ -77,8 +77,8 @@ macro_rules! impl_fmt_trait {
 
 impl_fmt_trait! {
     integers:
-        SimdU8, SimdU16, SimdU32, SimdU64, SimdU128,
-        SimdI8, SimdI16, SimdI32, SimdI64, SimdI128,
+        SimdU8, SimdU16, SimdU32, SimdU64,
+        SimdI8, SimdI16, SimdI32, SimdI64,
         SimdUsize, SimdIsize,
 }
 
diff --git a/crates/core_simd/src/lanes_at_most_64.rs b/crates/core_simd/src/lanes_at_most_32.rs
index dc0e02c22a2..1e2f7e952c6 100644
--- a/crates/core_simd/src/lanes_at_most_64.rs
+++ b/crates/core_simd/src/lanes_at_most_32.rs
@@ -18,14 +18,12 @@ impl_for! { SimdU8 }
 impl_for! { SimdU16 }
 impl_for! { SimdU32 }
 impl_for! { SimdU64 }
-impl_for! { SimdU128 }
 impl_for! { SimdUsize }
 
 impl_for! { SimdI8 }
 impl_for! { SimdI16 }
 impl_for! { SimdI32 }
 impl_for! { SimdI64 }
-impl_for! { SimdI128 }
 impl_for! { SimdIsize }
 
 impl_for! { SimdF32 }
diff --git a/crates/core_simd/src/lib.rs b/crates/core_simd/src/lib.rs
index 0fc2641516d..2d4176ce342 100644
--- a/crates/core_simd/src/lib.rs
+++ b/crates/core_simd/src/lib.rs
@@ -22,8 +22,8 @@ mod round;
 
 mod math;
 
-mod lanes_at_most_64;
-pub use lanes_at_most_64::LanesAtMost32;
+mod lanes_at_most_32;
+pub use lanes_at_most_32::LanesAtMost32;
 
 mod masks;
 pub use masks::*;
diff --git a/crates/core_simd/src/masks/full_masks.rs b/crates/core_simd/src/masks/full_masks.rs
index a6689ce48c6..60a6cb5fdbe 100644
--- a/crates/core_simd/src/masks/full_masks.rs
+++ b/crates/core_simd/src/masks/full_masks.rs
@@ -418,12 +418,6 @@ define_mask! {
 }
 
 define_mask! {
-    /// A mask equivalent to [SimdI128](crate::SimdI128), where all bits in the lane must be either set
-    /// or unset.
-    struct SimdMask128<const LANES: usize>(crate::SimdI128<LANES>);
-}
-
-define_mask! {
     /// A mask equivalent to [SimdIsize](crate::SimdIsize), where all bits in the lane must be either set
     /// or unset.
     struct SimdMaskSize<const LANES: usize>(crate::SimdIsize<LANES>);
diff --git a/crates/core_simd/src/masks/mod.rs b/crates/core_simd/src/masks/mod.rs
index 4503187e4b8..c394c7003a3 100644
--- a/crates/core_simd/src/masks/mod.rs
+++ b/crates/core_simd/src/masks/mod.rs
@@ -7,7 +7,7 @@ pub use full_masks::*;
 mod bitmask;
 pub use bitmask::*;
 
-use crate::{LanesAtMost32, SimdI128, SimdI16, SimdI32, SimdI64, SimdI8, SimdIsize};
+use crate::{LanesAtMost32, SimdI16, SimdI32, SimdI64, SimdI8, SimdIsize};
 
 macro_rules! define_opaque_mask {
     {
@@ -388,14 +388,6 @@ define_opaque_mask! {
 }
 
 define_opaque_mask! {
-    /// Mask for vectors with `LANES` 128-bit elements.
-    ///
-    /// The layout of this type is unspecified.
-    struct Mask128<const LANES: usize>(SimdMask128<LANES>);
-    @bits SimdI128
-}
-
-define_opaque_mask! {
     /// Mask for vectors with `LANES` pointer-width elements.
     ///
     /// The layout of this type is unspecified.
@@ -448,12 +440,6 @@ pub type mask64x4 = Mask64<4>;
 /// Vector of eight 64-bit masks
 pub type mask64x8 = Mask64<8>;
 
-/// Vector of two 128-bit masks
-pub type mask128x2 = Mask128<2>;
-
-/// Vector of four 128-bit masks
-pub type mask128x4 = Mask128<4>;
-
 /// Vector of two pointer-width masks
 pub type masksizex2 = MaskSize<2>;
 
diff --git a/crates/core_simd/src/math.rs b/crates/core_simd/src/math.rs
index 23ff83f11a1..6a243dbd196 100644
--- a/crates/core_simd/src/math.rs
+++ b/crates/core_simd/src/math.rs
@@ -1,5 +1,5 @@
 macro_rules! impl_uint_arith {
-    ($(($name:ident, $n:ty)),+) => {
+    ($(($name:ident, $n:ident)),+) => {
         $( impl<const LANES: usize> $name<LANES> where Self: crate::LanesAtMost32 {
 
             /// Lanewise saturating add.
@@ -41,7 +41,7 @@ macro_rules! impl_uint_arith {
 }
 
 macro_rules! impl_int_arith {
-    ($(($name:ident, $n:ty)),+) => {
+    ($(($name:ident, $n:ident)),+) => {
         $( impl<const LANES: usize> $name<LANES> where Self: crate::LanesAtMost32 {
 
             /// Lanewise saturating add.
@@ -79,16 +79,34 @@ macro_rules! impl_int_arith {
                 unsafe { crate::intrinsics::simd_saturating_sub(self, second) }
             }
 
+            /// Lanewise absolute value, implemented in Rust.
+            /// Every lane becomes its absolute value.
+            ///
+            /// # Examples
+            /// ```
+            /// # use core_simd::*;
+            #[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
+            #[doc = concat!("let xs = ", stringify!($name), "::from_array([MIN, MIN +1, -5, 0]);")]
+            #[doc = concat!("assert_eq!(xs.abs(), ", stringify!($name), "::from_array([MIN, MAX, 5, 0]));")]
+            /// ```
+            #[inline]
+            pub fn abs(self) -> Self {
+                const SHR: $n = <$n>::BITS as $n - 1;
+                let m = self >> SHR;
+                (self^m) - m
+            }
+
             /// Lanewise saturating absolute value, implemented in Rust.
             /// As abs(), except the MIN value becomes MAX instead of itself.
             ///
             /// # Examples
+            /// ```
             /// # use core_simd::*;
             #[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
-            #[doc = concat!("let x = ", stringify!($name), "::splat([MIN, -2, 0, 3]);")]
-            /// let unsat = x.abs();
-            /// let sat = x.saturating_abs();
-            #[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, 0, 3]);")]
+            #[doc = concat!("let xs = ", stringify!($name), "::from_array([MIN, -2, 0, 3]);")]
+            /// let unsat = xs.abs();
+            /// let sat = xs.saturating_abs();
+            #[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, 0, 3]));")]
             #[doc = concat!("assert_eq!(sat, ", stringify!($name), "::from_array([MAX, 2, 0, 3]));")]
             /// ```
             #[inline]
@@ -103,12 +121,13 @@ macro_rules! impl_int_arith {
             /// As neg(), except the MIN value becomes MAX instead of itself.
             ///
             /// # Examples
+            /// ```
             /// # use core_simd::*;
             #[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
-            #[doc = concat!("let x = ", stringify!($name), "::splat([MIN, -2, 3, MAX]);")]
+            #[doc = concat!("let x = ", stringify!($name), "::from_array([MIN, -2, 3, MAX]);")]
             /// let unsat = -x;
             /// let sat = x.saturating_neg();
-            #[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, -3, MIN + 1]);")]
+            #[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, -3, MIN + 1]));")]
             #[doc = concat!("assert_eq!(sat, ", stringify!($name), "::from_array([MAX, 2, -3, MIN + 1]));")]
             /// ```
             #[inline]
diff --git a/crates/core_simd/src/ops.rs b/crates/core_simd/src/ops.rs
index 513eeb423d9..c7037d2acbc 100644
--- a/crates/core_simd/src/ops.rs
+++ b/crates/core_simd/src/ops.rs
@@ -653,7 +653,6 @@ impl_unsigned_int_ops! {
     u16 => SimdU16;
     u32 => SimdU32;
     u64 => SimdU64;
-    u128 => SimdU128;
     usize => SimdUsize;
 }
 
@@ -662,7 +661,6 @@ impl_signed_int_ops! {
     i16 => SimdI16;
     i32 => SimdI32;
     i64 => SimdI64;
-    i128 => SimdI128;
     isize => SimdIsize;
 }
 
diff --git a/crates/core_simd/src/vector/int.rs b/crates/core_simd/src/vector/int.rs
index 24f77cb3e10..30b09a229e9 100644
--- a/crates/core_simd/src/vector/int.rs
+++ b/crates/core_simd/src/vector/int.rs
@@ -64,17 +64,6 @@ from_transmute_x86! { unsafe isizex4 => __m256i }
 //#[cfg(target_pointer_width = "64")]
 //from_transmute_x86! { unsafe isizex8 => __m512i }
 
-/// A SIMD vector of containing `LANES` `i128` values.
-#[repr(simd)]
-pub struct SimdI128<const LANES: usize>([i128; LANES])
-where
-    Self: crate::LanesAtMost32;
-
-impl_integer_vector! { SimdI128, i128, Mask128, SimdI128 }
-
-from_transmute_x86! { unsafe i128x2 => __m256i }
-//from_transmute_x86! { unsafe i128x4 => __m512i }
-
 /// A SIMD vector of containing `LANES` `i16` values.
 #[repr(simd)]
 pub struct SimdI16<const LANES: usize>([i16; LANES])
@@ -132,12 +121,6 @@ pub type isizex4 = SimdIsize<4>;
 /// Vector of eight `isize` values
 pub type isizex8 = SimdIsize<8>;
 
-/// Vector of two `i128` values
-pub type i128x2 = SimdI128<2>;
-
-/// Vector of four `i128` values
-pub type i128x4 = SimdI128<4>;
-
 /// Vector of four `i16` values
 pub type i16x4 = SimdI16<4>;
 
diff --git a/crates/core_simd/src/vector/uint.rs b/crates/core_simd/src/vector/uint.rs
index 3866b9ca5c6..53e780520a7 100644
--- a/crates/core_simd/src/vector/uint.rs
+++ b/crates/core_simd/src/vector/uint.rs
@@ -49,17 +49,6 @@ from_transmute_x86! { unsafe usizex4 => __m256i }
 //#[cfg(target_pointer_width = "64")]
 //from_transmute_x86! { unsafe usizex8 => __m512i }
 
-/// A SIMD vector of containing `LANES` `u128` values.
-#[repr(simd)]
-pub struct SimdU128<const LANES: usize>([u128; LANES])
-where
-    Self: crate::LanesAtMost32;
-
-impl_unsigned_vector! { SimdU128, u128 }
-
-from_transmute_x86! { unsafe u128x2 => __m256i }
-//from_transmute_x86! { unsafe u128x4 => __m512i }
-
 /// A SIMD vector of containing `LANES` `u16` values.
 #[repr(simd)]
 pub struct SimdU16<const LANES: usize>([u16; LANES])
@@ -117,12 +106,6 @@ pub type usizex4 = SimdUsize<4>;
 /// Vector of eight `usize` values
 pub type usizex8 = SimdUsize<8>;
 
-/// Vector of two `u128` values
-pub type u128x2 = SimdU128<2>;
-
-/// Vector of four `u128` values
-pub type u128x4 = SimdU128<4>;
-
 /// Vector of four `u16` values
 pub type u16x4 = SimdU16<4>;
 
diff --git a/crates/core_simd/tests/i128_ops.rs b/crates/core_simd/tests/i128_ops.rs
deleted file mode 100644
index 3e3fa1d2068..00000000000
--- a/crates/core_simd/tests/i128_ops.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-#[macro_use]
-mod ops_macros;
-impl_signed_tests! { SimdI128, i128 }
diff --git a/crates/core_simd/tests/mask_ops_impl/mask128.rs b/crates/core_simd/tests/mask_ops_impl/mask128.rs
deleted file mode 100644
index 27ba4e2d29f..00000000000
--- a/crates/core_simd/tests/mask_ops_impl/mask128.rs
+++ /dev/null
@@ -1,2 +0,0 @@
-mask_tests! { mask128x2, 2 }
-mask_tests! { mask128x4, 4 }
diff --git a/crates/core_simd/tests/mask_ops_impl/mod.rs b/crates/core_simd/tests/mask_ops_impl/mod.rs
index 99d735be293..ff36af95651 100644
--- a/crates/core_simd/tests/mask_ops_impl/mod.rs
+++ b/crates/core_simd/tests/mask_ops_impl/mod.rs
@@ -5,5 +5,4 @@ mod mask8;
 mod mask16;
 mod mask32;
 mod mask64;
-mod mask128;
 mod masksize;
diff --git a/crates/core_simd/tests/u128_ops.rs b/crates/core_simd/tests/u128_ops.rs
deleted file mode 100644
index 4be7d751ffd..00000000000
--- a/crates/core_simd/tests/u128_ops.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-#[macro_use]
-mod ops_macros;
-impl_unsigned_tests! { SimdU128, u128 }
diff --git a/crates/test_helpers/src/lib.rs b/crates/test_helpers/src/lib.rs
index b5bfd96dde8..9e8790842b4 100644
--- a/crates/test_helpers/src/lib.rs
+++ b/crates/test_helpers/src/lib.rs
@@ -273,13 +273,11 @@ macro_rules! test_lanes {
                     core_simd::SimdU16<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdU32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdU64<$lanes>: core_simd::LanesAtMost32,
-                    core_simd::SimdU128<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdUsize<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI8<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI16<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI64<$lanes>: core_simd::LanesAtMost32,
-                    core_simd::SimdI128<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdIsize<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdF32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdF64<$lanes>: core_simd::LanesAtMost32,
@@ -345,13 +343,11 @@ macro_rules! test_lanes_panic {
                     core_simd::SimdU16<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdU32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdU64<$lanes>: core_simd::LanesAtMost32,
-                    core_simd::SimdU128<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdUsize<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI8<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI16<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdI64<$lanes>: core_simd::LanesAtMost32,
-                    core_simd::SimdI128<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdIsize<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdF32<$lanes>: core_simd::LanesAtMost32,
                     core_simd::SimdF64<$lanes>: core_simd::LanesAtMost32,