summaryrefslogtreecommitdiff
path: root/library/portable-simd
diff options
context:
space:
mode:
authorRalf Jung <post@ralfj.de>2022-04-12 11:01:22 -0400
committerRalf Jung <post@ralfj.de>2022-04-12 11:09:26 -0400
commite886dc52eedf3d074c6cc66f0518a996f7bbe735 (patch)
tree51e1b45d799453310428aa60df354da9dcf7c111 /library/portable-simd
parent7f945b2b5b0d8123d6031bb655d2a9fe5c71ee01 (diff)
downloadrust-e886dc52eedf3d074c6cc66f0518a996f7bbe735.tar.gz
portable-simd: use simd_arith_offset to avoid ptr-int transmutation
Diffstat (limited to 'library/portable-simd')
-rw-r--r--library/portable-simd/crates/core_simd/src/intrinsics.rs4
-rw-r--r--library/portable-simd/crates/core_simd/src/vector/ptr.rs11
2 files changed, 15 insertions, 0 deletions
diff --git a/library/portable-simd/crates/core_simd/src/intrinsics.rs b/library/portable-simd/crates/core_simd/src/intrinsics.rs
index 426c4de6ab1..82508c6882d 100644
--- a/library/portable-simd/crates/core_simd/src/intrinsics.rs
+++ b/library/portable-simd/crates/core_simd/src/intrinsics.rs
@@ -61,6 +61,10 @@ extern "platform-intrinsic" {
/// xor
pub(crate) fn simd_xor<T>(x: T, y: T) -> T;
+ /// getelementptr (without inbounds)
+ #[cfg(not(bootstrap))]
+ pub(crate) fn simd_arith_offset<T, U>(ptrs: T, offsets: U) -> T;
+
/// fptoui/fptosi/uitofp/sitofp
/// casting floats to integers is truncating, so it is safe to convert values like e.g. 1.5
/// but the truncated value must fit in the target type or the result is poison.
diff --git a/library/portable-simd/crates/core_simd/src/vector/ptr.rs b/library/portable-simd/crates/core_simd/src/vector/ptr.rs
index 417d255c28d..68a9c67f795 100644
--- a/library/portable-simd/crates/core_simd/src/vector/ptr.rs
+++ b/library/portable-simd/crates/core_simd/src/vector/ptr.rs
@@ -1,5 +1,8 @@
//! Private implementation details of public gather/scatter APIs.
+#[cfg(not(bootstrap))]
+use crate::simd::intrinsics;
use crate::simd::{LaneCount, Simd, SupportedLaneCount};
+#[cfg(bootstrap)]
use core::mem;
/// A vector of *const T.
@@ -21,12 +24,16 @@ where
#[inline]
#[must_use]
pub fn wrapping_add(self, addend: Simd<usize, LANES>) -> Self {
+ #[cfg(bootstrap)]
// Safety: converting pointers to usize and vice-versa is safe
// (even if using that pointer is not)
unsafe {
let x: Simd<usize, LANES> = mem::transmute_copy(&self);
mem::transmute_copy(&{ x + (addend * Simd::splat(mem::size_of::<T>())) })
}
+ #[cfg(not(bootstrap))]
+ // Safety: this intrinsic doesn't have a precondition
+ unsafe { intrinsics::simd_arith_offset(self, addend) }
}
}
@@ -49,11 +56,15 @@ where
#[inline]
#[must_use]
pub fn wrapping_add(self, addend: Simd<usize, LANES>) -> Self {
+ #[cfg(bootstrap)]
// Safety: converting pointers to usize and vice-versa is safe
// (even if using that pointer is not)
unsafe {
let x: Simd<usize, LANES> = mem::transmute_copy(&self);
mem::transmute_copy(&{ x + (addend * Simd::splat(mem::size_of::<T>())) })
}
+ #[cfg(not(bootstrap))]
+ // Safety: this intrinsic doesn't have a precondition
+ unsafe { intrinsics::simd_arith_offset(self, addend) }
}
}