Skip to content

Commit a9a1c9d

Browse files
Merge pull request rust-lang#100 from rust-lang/fix-sat-math
Fix sat math at the cost of Simd{U,I}128 for now
2 parents 24ebae8 + 92d643b commit a9a1c9d

File tree

15 files changed

+32
-86
lines changed

15 files changed

+32
-86
lines changed

crates/core_simd/src/comparisons.rs

-2
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,12 @@ implement_mask_ops! {
7171
SimdI16 => Mask16 (SimdMask16, SimdI16),
7272
SimdI32 => Mask32 (SimdMask32, SimdI32),
7373
SimdI64 => Mask64 (SimdMask64, SimdI64),
74-
SimdI128 => Mask128 (SimdMask128, SimdI128),
7574
SimdIsize => MaskSize (SimdMaskSize, SimdIsize),
7675

7776
SimdU8 => Mask8 (SimdMask8, SimdI8),
7877
SimdU16 => Mask16 (SimdMask16, SimdI16),
7978
SimdU32 => Mask32 (SimdMask32, SimdI32),
8079
SimdU64 => Mask64 (SimdMask64, SimdI64),
81-
SimdU128 => Mask128 (SimdMask128, SimdI128),
8280
SimdUsize => MaskSize (SimdMaskSize, SimdIsize),
8381

8482
SimdF32 => Mask32 (SimdMask32, SimdI32),

crates/core_simd/src/fmt.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ macro_rules! impl_fmt_trait {
7777

7878
impl_fmt_trait! {
7979
integers:
80-
SimdU8, SimdU16, SimdU32, SimdU64, SimdU128,
81-
SimdI8, SimdI16, SimdI32, SimdI64, SimdI128,
80+
SimdU8, SimdU16, SimdU32, SimdU64,
81+
SimdI8, SimdI16, SimdI32, SimdI64,
8282
SimdUsize, SimdIsize,
8383
}
8484

crates/core_simd/src/lanes_at_most_64.rs crates/core_simd/src/lanes_at_most_32.rs

-2
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ impl_for! { SimdU8 }
1818
impl_for! { SimdU16 }
1919
impl_for! { SimdU32 }
2020
impl_for! { SimdU64 }
21-
impl_for! { SimdU128 }
2221
impl_for! { SimdUsize }
2322

2423
impl_for! { SimdI8 }
2524
impl_for! { SimdI16 }
2625
impl_for! { SimdI32 }
2726
impl_for! { SimdI64 }
28-
impl_for! { SimdI128 }
2927
impl_for! { SimdIsize }
3028

3129
impl_for! { SimdF32 }

crates/core_simd/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ mod round;
2222

2323
mod math;
2424

25-
mod lanes_at_most_64;
26-
pub use lanes_at_most_64::LanesAtMost32;
25+
mod lanes_at_most_32;
26+
pub use lanes_at_most_32::LanesAtMost32;
2727

2828
mod masks;
2929
pub use masks::*;

crates/core_simd/src/masks/full_masks.rs

-6
Original file line numberDiff line numberDiff line change
@@ -417,12 +417,6 @@ define_mask! {
417417
struct SimdMask64<const LANES: usize>(crate::SimdI64<LANES>);
418418
}
419419

420-
define_mask! {
421-
/// A mask equivalent to [SimdI128](crate::SimdI128), where all bits in the lane must be either set
422-
/// or unset.
423-
struct SimdMask128<const LANES: usize>(crate::SimdI128<LANES>);
424-
}
425-
426420
define_mask! {
427421
/// A mask equivalent to [SimdIsize](crate::SimdIsize), where all bits in the lane must be either set
428422
/// or unset.

crates/core_simd/src/masks/mod.rs

+1-15
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub use full_masks::*;
77
mod bitmask;
88
pub use bitmask::*;
99

10-
use crate::{LanesAtMost32, SimdI128, SimdI16, SimdI32, SimdI64, SimdI8, SimdIsize};
10+
use crate::{LanesAtMost32, SimdI16, SimdI32, SimdI64, SimdI8, SimdIsize};
1111

1212
macro_rules! define_opaque_mask {
1313
{
@@ -387,14 +387,6 @@ define_opaque_mask! {
387387
@bits SimdI64
388388
}
389389

390-
define_opaque_mask! {
391-
/// Mask for vectors with `LANES` 128-bit elements.
392-
///
393-
/// The layout of this type is unspecified.
394-
struct Mask128<const LANES: usize>(SimdMask128<LANES>);
395-
@bits SimdI128
396-
}
397-
398390
define_opaque_mask! {
399391
/// Mask for vectors with `LANES` pointer-width elements.
400392
///
@@ -448,12 +440,6 @@ pub type mask64x4 = Mask64<4>;
448440
/// Vector of eight 64-bit masks
449441
pub type mask64x8 = Mask64<8>;
450442

451-
/// Vector of two 128-bit masks
452-
pub type mask128x2 = Mask128<2>;
453-
454-
/// Vector of four 128-bit masks
455-
pub type mask128x4 = Mask128<4>;
456-
457443
/// Vector of two pointer-width masks
458444
pub type masksizex2 = MaskSize<2>;
459445

crates/core_simd/src/math.rs

+27-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
macro_rules! impl_uint_arith {
2-
($(($name:ident, $n:ty)),+) => {
2+
($(($name:ident, $n:ident)),+) => {
33
$( impl<const LANES: usize> $name<LANES> where Self: crate::LanesAtMost32 {
44

55
/// Lanewise saturating add.
@@ -41,7 +41,7 @@ macro_rules! impl_uint_arith {
4141
}
4242

4343
macro_rules! impl_int_arith {
44-
($(($name:ident, $n:ty)),+) => {
44+
($(($name:ident, $n:ident)),+) => {
4545
$( impl<const LANES: usize> $name<LANES> where Self: crate::LanesAtMost32 {
4646

4747
/// Lanewise saturating add.
@@ -79,16 +79,34 @@ macro_rules! impl_int_arith {
7979
unsafe { crate::intrinsics::simd_saturating_sub(self, second) }
8080
}
8181

82+
/// Lanewise absolute value, implemented in Rust.
83+
/// Every lane becomes its absolute value.
84+
///
85+
/// # Examples
86+
/// ```
87+
/// # use core_simd::*;
88+
#[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
89+
#[doc = concat!("let xs = ", stringify!($name), "::from_array([MIN, MIN +1, -5, 0]);")]
90+
#[doc = concat!("assert_eq!(xs.abs(), ", stringify!($name), "::from_array([MIN, MAX, 5, 0]));")]
91+
/// ```
92+
#[inline]
93+
pub fn abs(self) -> Self {
94+
const SHR: $n = <$n>::BITS as $n - 1;
95+
let m = self >> SHR;
96+
(self^m) - m
97+
}
98+
8299
/// Lanewise saturating absolute value, implemented in Rust.
83100
/// As abs(), except the MIN value becomes MAX instead of itself.
84101
///
85102
/// # Examples
103+
/// ```
86104
/// # use core_simd::*;
87105
#[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
88-
#[doc = concat!("let x = ", stringify!($name), "::splat([MIN, -2, 0, 3]);")]
89-
/// let unsat = x.abs();
90-
/// let sat = x.saturating_abs();
91-
#[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, 0, 3]);")]
106+
#[doc = concat!("let xs = ", stringify!($name), "::from_array([MIN, -2, 0, 3]);")]
107+
/// let unsat = xs.abs();
108+
/// let sat = xs.saturating_abs();
109+
#[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, 0, 3]));")]
92110
#[doc = concat!("assert_eq!(sat, ", stringify!($name), "::from_array([MAX, 2, 0, 3]));")]
93111
/// ```
94112
#[inline]
@@ -103,12 +121,13 @@ macro_rules! impl_int_arith {
103121
/// As neg(), except the MIN value becomes MAX instead of itself.
104122
///
105123
/// # Examples
124+
/// ```
106125
/// # use core_simd::*;
107126
#[doc = concat!("# use core::", stringify!($n), "::{MIN, MAX};")]
108-
#[doc = concat!("let x = ", stringify!($name), "::splat([MIN, -2, 3, MAX]);")]
127+
#[doc = concat!("let x = ", stringify!($name), "::from_array([MIN, -2, 3, MAX]);")]
109128
/// let unsat = -x;
110129
/// let sat = x.saturating_neg();
111-
#[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, -3, MIN + 1]);")]
130+
#[doc = concat!("assert_eq!(unsat, ", stringify!($name), "::from_array([MIN, 2, -3, MIN + 1]));")]
112131
#[doc = concat!("assert_eq!(sat, ", stringify!($name), "::from_array([MAX, 2, -3, MIN + 1]));")]
113132
/// ```
114133
#[inline]

crates/core_simd/src/ops.rs

-2
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,6 @@ impl_unsigned_int_ops! {
653653
u16 => SimdU16;
654654
u32 => SimdU32;
655655
u64 => SimdU64;
656-
u128 => SimdU128;
657656
usize => SimdUsize;
658657
}
659658

@@ -662,7 +661,6 @@ impl_signed_int_ops! {
662661
i16 => SimdI16;
663662
i32 => SimdI32;
664663
i64 => SimdI64;
665-
i128 => SimdI128;
666664
isize => SimdIsize;
667665
}
668666

crates/core_simd/src/vector/int.rs

-17
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,6 @@ from_transmute_x86! { unsafe isizex4 => __m256i }
6464
//#[cfg(target_pointer_width = "64")]
6565
//from_transmute_x86! { unsafe isizex8 => __m512i }
6666

67-
/// A SIMD vector of containing `LANES` `i128` values.
68-
#[repr(simd)]
69-
pub struct SimdI128<const LANES: usize>([i128; LANES])
70-
where
71-
Self: crate::LanesAtMost32;
72-
73-
impl_integer_vector! { SimdI128, i128, Mask128, SimdI128 }
74-
75-
from_transmute_x86! { unsafe i128x2 => __m256i }
76-
//from_transmute_x86! { unsafe i128x4 => __m512i }
77-
7867
/// A SIMD vector of containing `LANES` `i16` values.
7968
#[repr(simd)]
8069
pub struct SimdI16<const LANES: usize>([i16; LANES])
@@ -132,12 +121,6 @@ pub type isizex4 = SimdIsize<4>;
132121
/// Vector of eight `isize` values
133122
pub type isizex8 = SimdIsize<8>;
134123

135-
/// Vector of two `i128` values
136-
pub type i128x2 = SimdI128<2>;
137-
138-
/// Vector of four `i128` values
139-
pub type i128x4 = SimdI128<4>;
140-
141124
/// Vector of four `i16` values
142125
pub type i16x4 = SimdI16<4>;
143126

crates/core_simd/src/vector/uint.rs

-17
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,6 @@ from_transmute_x86! { unsafe usizex4 => __m256i }
4949
//#[cfg(target_pointer_width = "64")]
5050
//from_transmute_x86! { unsafe usizex8 => __m512i }
5151

52-
/// A SIMD vector of containing `LANES` `u128` values.
53-
#[repr(simd)]
54-
pub struct SimdU128<const LANES: usize>([u128; LANES])
55-
where
56-
Self: crate::LanesAtMost32;
57-
58-
impl_unsigned_vector! { SimdU128, u128 }
59-
60-
from_transmute_x86! { unsafe u128x2 => __m256i }
61-
//from_transmute_x86! { unsafe u128x4 => __m512i }
62-
6352
/// A SIMD vector of containing `LANES` `u16` values.
6453
#[repr(simd)]
6554
pub struct SimdU16<const LANES: usize>([u16; LANES])
@@ -117,12 +106,6 @@ pub type usizex4 = SimdUsize<4>;
117106
/// Vector of eight `usize` values
118107
pub type usizex8 = SimdUsize<8>;
119108

120-
/// Vector of two `u128` values
121-
pub type u128x2 = SimdU128<2>;
122-
123-
/// Vector of four `u128` values
124-
pub type u128x4 = SimdU128<4>;
125-
126109
/// Vector of four `u16` values
127110
pub type u16x4 = SimdU16<4>;
128111

crates/core_simd/tests/i128_ops.rs

-3
This file was deleted.

crates/core_simd/tests/mask_ops_impl/mask128.rs

-2
This file was deleted.

crates/core_simd/tests/mask_ops_impl/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ mod mask8;
55
mod mask16;
66
mod mask32;
77
mod mask64;
8-
mod mask128;
98
mod masksize;

crates/core_simd/tests/u128_ops.rs

-3
This file was deleted.

crates/test_helpers/src/lib.rs

-4
Original file line numberDiff line numberDiff line change
@@ -273,13 +273,11 @@ macro_rules! test_lanes {
273273
core_simd::SimdU16<$lanes>: core_simd::LanesAtMost32,
274274
core_simd::SimdU32<$lanes>: core_simd::LanesAtMost32,
275275
core_simd::SimdU64<$lanes>: core_simd::LanesAtMost32,
276-
core_simd::SimdU128<$lanes>: core_simd::LanesAtMost32,
277276
core_simd::SimdUsize<$lanes>: core_simd::LanesAtMost32,
278277
core_simd::SimdI8<$lanes>: core_simd::LanesAtMost32,
279278
core_simd::SimdI16<$lanes>: core_simd::LanesAtMost32,
280279
core_simd::SimdI32<$lanes>: core_simd::LanesAtMost32,
281280
core_simd::SimdI64<$lanes>: core_simd::LanesAtMost32,
282-
core_simd::SimdI128<$lanes>: core_simd::LanesAtMost32,
283281
core_simd::SimdIsize<$lanes>: core_simd::LanesAtMost32,
284282
core_simd::SimdF32<$lanes>: core_simd::LanesAtMost32,
285283
core_simd::SimdF64<$lanes>: core_simd::LanesAtMost32,
@@ -345,13 +343,11 @@ macro_rules! test_lanes_panic {
345343
core_simd::SimdU16<$lanes>: core_simd::LanesAtMost32,
346344
core_simd::SimdU32<$lanes>: core_simd::LanesAtMost32,
347345
core_simd::SimdU64<$lanes>: core_simd::LanesAtMost32,
348-
core_simd::SimdU128<$lanes>: core_simd::LanesAtMost32,
349346
core_simd::SimdUsize<$lanes>: core_simd::LanesAtMost32,
350347
core_simd::SimdI8<$lanes>: core_simd::LanesAtMost32,
351348
core_simd::SimdI16<$lanes>: core_simd::LanesAtMost32,
352349
core_simd::SimdI32<$lanes>: core_simd::LanesAtMost32,
353350
core_simd::SimdI64<$lanes>: core_simd::LanesAtMost32,
354-
core_simd::SimdI128<$lanes>: core_simd::LanesAtMost32,
355351
core_simd::SimdIsize<$lanes>: core_simd::LanesAtMost32,
356352
core_simd::SimdF32<$lanes>: core_simd::LanesAtMost32,
357353
core_simd::SimdF64<$lanes>: core_simd::LanesAtMost32,

0 commit comments

Comments
 (0)