Skip to content

Portable SIMD subtree update #118077

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 78 commits into from
Dec 2, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
11c43c0
Fix is_subnormal on architectures that flush subnormals to zero
calebzulawski Jul 21, 2023
dc0ba78
Don't require strict equality when subnormals are flushed
calebzulawski Jul 21, 2023
38c7ba0
Handle subnormal numbers exactly
calebzulawski Jul 22, 2023
8c89a72
Enable more cross tests
calebzulawski Jul 22, 2023
36c8bf3
Improve cross tests
calebzulawski Jul 22, 2023
40f0435
Fix workflow
calebzulawski Jul 22, 2023
415b50f
Flush subnormals in f32::fract test
calebzulawski Jul 22, 2023
1948b02
Don't use native cpu in cross
calebzulawski Jul 22, 2023
94f2014
Enable v extension on riscv
calebzulawski Jul 22, 2023
5c6405b
Disable riscv v extension
calebzulawski Jul 22, 2023
49e92a2
Improve powerpc subnormal flushing check
calebzulawski Jul 22, 2023
e73d029
Specify emulated CPUs
calebzulawski Jul 22, 2023
d07ce3c
Account for possible qemu bug
calebzulawski Jul 22, 2023
ad747af
Apply workaround to ppc64
calebzulawski Jul 22, 2023
ca12492
Revert some CI changes
calebzulawski Jul 22, 2023
52d6397
Flush subnormals in reduce tests
calebzulawski Jul 22, 2023
bd4e661
Adjust clamp test
calebzulawski Jul 23, 2023
616cb6e
Disable simd_clamp test on ppc64
calebzulawski Jul 23, 2023
fd712fe
Fix test skip
calebzulawski Jul 23, 2023
dbcbc3e
Disable misbehaving targets
calebzulawski Jul 27, 2023
cb461ac
Only flush comparison in test
calebzulawski Jul 27, 2023
baa5791
Document odd test behavior
calebzulawski Jul 27, 2023
5e57453
Disable big endian ppc64
calebzulawski Jul 27, 2023
6e8d21e
Define portability
calebzulawski Jul 27, 2023
927139d
Add scalar shifts
calebzulawski Jul 27, 2023
5c97c0d
Add wrapping negation
calebzulawski Jul 27, 2023
e51ee24
Add tests
calebzulawski Jul 29, 2023
3da6055
Add footnote
calebzulawski Jul 29, 2023
490b5cf
Merge pull request #360 from rust-lang/shift-scalar
calebzulawski Jul 29, 2023
8101074
Add various integer ops
calebzulawski Jul 30, 2023
b1245ff
Fix bad copy-paste
calebzulawski Jul 30, 2023
c948b70
Simplify signed leading_ones/trailing_ones
calebzulawski Aug 1, 2023
29392c0
Commit Cargo.lock
bjorn3 Aug 26, 2023
d08b2a5
Allow internal_features lint
bjorn3 Aug 26, 2023
6d10cd1
Merge pull request #363 from bjorn3/cargo_lock
calebzulawski Aug 26, 2023
b6e03e5
Merge pull request #357 from rust-lang/subnormals
calebzulawski Sep 10, 2023
f2ac32f
Merge pull request #361 from rust-lang/wrapping-negation
calebzulawski Sep 10, 2023
7ce6ec9
Merge pull request #359 from rust-lang/what-is-portable
calebzulawski Sep 10, 2023
0a1e745
Return unsigned integers from some signed integer functions
calebzulawski Sep 10, 2023
22f50df
Merge pull request #362 from rust-lang/int-ops
calebzulawski Sep 10, 2023
eb3c050
Fix lints
calebzulawski Sep 23, 2023
4825b2a
Fix lint
calebzulawski Oct 2, 2023
a93ded5
Remove generic_const_exprs
calebzulawski Oct 2, 2023
b070f0f
Fix cargo features in CI and enable them for testing
calebzulawski Oct 2, 2023
b411cb4
Simplify macro
calebzulawski Oct 2, 2023
afe28b1
Add various bounds
calebzulawski Oct 2, 2023
6a3c45e
Eliminate use of #[cfg_attr(not(doc), repr(transparent))]
dtolnay Oct 14, 2023
d21ba25
Merge pull request #370 from dtolnay-contrib/notdoctransparent
calebzulawski Oct 14, 2023
3e4e13c
Merge pull request #368 from rust-lang/remove-generic-const-exprs
calebzulawski Oct 20, 2023
596aabe
Add num, ptr, and cmp modules
calebzulawski Sep 23, 2023
21fa6af
Merge pull request #365 from rust-lang/modules
calebzulawski Oct 21, 2023
4fc3ce7
Simplify Swizzle trait and condense all swizzles into this trait
calebzulawski Oct 1, 2023
7a7faf6
Fix formatting
calebzulawski Oct 1, 2023
6e0de19
Fix variable and comment
calebzulawski Oct 20, 2023
f510c6b
Merge pull request #367 from rust-lang/simpler-swizzle-trait
calebzulawski Oct 21, 2023
b962b61
Change lane to element in documentation
calebzulawski Oct 21, 2023
0f59409
Change LANES to LEN and self.lanes() to self.len()
calebzulawski Oct 21, 2023
32b195a
Change generic LANES to N
calebzulawski Oct 21, 2023
4f7b025
Fix formatting
calebzulawski Oct 21, 2023
56b6ee0
Fix test import
calebzulawski Oct 21, 2023
d06dc5c
Fix bitmasks
calebzulawski Oct 21, 2023
4cc260e
Update crates/core_simd/src/masks.rs
calebzulawski Oct 23, 2023
6b1e7f6
Merge pull request #371 from rust-lang/lane_to_element
calebzulawski Nov 15, 2023
8d9bcda
Fix or silence lints
calebzulawski Nov 17, 2023
4ca9f04
Simplify bitmasks
calebzulawski Nov 17, 2023
082e3c8
Workaround simd_bitmask limitations
calebzulawski Nov 17, 2023
0ad68db
Use u8xN for bitmasks
calebzulawski Nov 18, 2023
7e5c03a
Merge pull request #375 from rust-lang/bitmask
calebzulawski Nov 19, 2023
62bbb36
Add first_set
calebzulawski Nov 17, 2023
384be9f
Merge pull request #376 from rust-lang/find-first-set
calebzulawski Nov 19, 2023
64ea088
remove repetitive words
cuishuang Jul 15, 2023
5739caa
Follow-up fixes for to_bitmask
calebzulawski Nov 19, 2023
e0e9a45
Merge pull request #377 from rust-lang/bitmask-followup
calebzulawski Nov 19, 2023
830b387
Merge commit 'e0e9a4517f9fc021283514da387e70a56061bd3e' into sync-por…
calebzulawski Nov 26, 2023
89b9388
Fix library tests
calebzulawski Nov 19, 2023
f0f795d
Use inner docs to fix links
calebzulawski Nov 19, 2023
4d96078
Update std::simd usage and test outputs
calebzulawski Nov 20, 2023
bcb1c41
Remove link to core::arch::x86_64
calebzulawski Dec 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use u8xN for bitmasks
  • Loading branch information
calebzulawski committed Nov 18, 2023
commit 0ad68db91a3149885bc62ae11d2d83e7d401fc25
4 changes: 2 additions & 2 deletions crates/core_simd/src/masks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ where
/// The remaining bits are unset.
#[inline]
#[must_use = "method returns a new integer and does not mutate the original value"]
pub fn to_bitmask_vector(self) -> Simd<T, N> {
pub fn to_bitmask_vector(self) -> Simd<u8, N> {
self.0.to_bitmask_vector()
}

Expand All @@ -295,7 +295,7 @@ where
/// For each bit, if it is set, the corresponding element in the mask is set to `true`.
#[inline]
#[must_use = "method returns a new mask and does not mutate the original value"]
pub fn from_bitmask_vector(bitmask: Simd<T, N>) -> Self {
pub fn from_bitmask_vector(bitmask: Simd<u8, N>) -> Self {
Self(mask_impl::Mask::from_bitmask_vector(bitmask))
}
}
Expand Down
39 changes: 6 additions & 33 deletions crates/core_simd/src/masks/bitmask.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,45 +121,18 @@ where

#[inline]
#[must_use = "method returns a new vector and does not mutate the original value"]
pub fn to_bitmask_vector(self) -> Simd<T, N> {
let mut bitmask = Self::splat(false).to_int();

assert!(
core::mem::size_of::<Simd<T, N>>()
>= core::mem::size_of::<<LaneCount<N> as SupportedLaneCount>::BitMask>()
);

// Safety: the bitmask vector is big enough to hold the bitmask
unsafe {
core::ptr::copy_nonoverlapping(
self.0.as_ref().as_ptr(),
bitmask.as_mut_array().as_mut_ptr() as _,
self.0.as_ref().len(),
);
}

pub fn to_bitmask_vector(self) -> Simd<u8, N> {
let mut bitmask = Simd::splat(0);
bitmask.as_mut_array()[..self.0.as_ref().len()].copy_from_slice(self.0.as_ref());
bitmask
}

#[inline]
#[must_use = "method returns a new mask and does not mutate the original value"]
pub fn from_bitmask_vector(bitmask: Simd<T, N>) -> Self {
pub fn from_bitmask_vector(bitmask: Simd<u8, N>) -> Self {
let mut bytes = <LaneCount<N> as SupportedLaneCount>::BitMask::default();

assert!(
core::mem::size_of::<Simd<T, N>>()
>= core::mem::size_of::<<LaneCount<N> as SupportedLaneCount>::BitMask>()
);

// Safety: the bitmask vector is big enough to hold the bitmask
unsafe {
core::ptr::copy_nonoverlapping(
bitmask.as_array().as_ptr() as _,
bytes.as_mut().as_mut_ptr(),
bytes.as_ref().len(),
);
}

let len = bytes.as_ref().len();
bytes.as_mut().copy_from_slice(&bitmask.as_array()[..len]);
Self(bytes, PhantomData)
}

Expand Down
27 changes: 6 additions & 21 deletions crates/core_simd/src/masks/full_masks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,8 +143,8 @@ where

#[inline]
#[must_use = "method returns a new vector and does not mutate the original value"]
pub fn to_bitmask_vector(self) -> Simd<T, N> {
let mut bitmask = Self::splat(false).to_int();
pub fn to_bitmask_vector(self) -> Simd<u8, N> {
let mut bitmask = Simd::splat(0);

// Safety: Bytes is the right size array
unsafe {
Expand All @@ -159,36 +159,21 @@ where
}
}

assert!(
core::mem::size_of::<Simd<T, N>>()
>= core::mem::size_of::<<LaneCount<N> as SupportedLaneCount>::BitMask>()
);
core::ptr::copy_nonoverlapping(
bytes.as_ref().as_ptr(),
bitmask.as_mut_array().as_mut_ptr() as _,
bytes.as_ref().len(),
);
bitmask.as_mut_array()[..bytes.as_ref().len()].copy_from_slice(bytes.as_ref());
}

bitmask
}

#[inline]
#[must_use = "method returns a new mask and does not mutate the original value"]
pub fn from_bitmask_vector(bitmask: Simd<T, N>) -> Self {
pub fn from_bitmask_vector(bitmask: Simd<u8, N>) -> Self {
let mut bytes = <LaneCount<N> as SupportedLaneCount>::BitMask::default();

// Safety: Bytes is the right size array
unsafe {
assert!(
core::mem::size_of::<Simd<T, N>>()
>= core::mem::size_of::<<LaneCount<N> as SupportedLaneCount>::BitMask>()
);
core::ptr::copy_nonoverlapping(
bitmask.as_array().as_ptr() as _,
bytes.as_mut().as_mut_ptr(),
bytes.as_mut().len(),
);
let len = bytes.as_ref().len();
bytes.as_mut().copy_from_slice(&bitmask.as_array()[..len]);

// LLVM assumes bit order should match endianness
if cfg!(target_endian = "big") {
Expand Down