Skip to content

Commit

Permalink
pub use std::simd::StdFloat;
Browse files Browse the repository at this point in the history
Make available the remaining float intrinsics that require runtime support
from a platform's libm, and thus cannot be included in a no-deps libcore,
by exposing them through a sealed trait, `std::simd::StdFloat`.

We might use the trait approach a bit more in the future, or maybe not.
Ideally, this trait doesn't stick around, even if so.
If we don't need to intermesh it with std, it can be used as a crate,
but currently that is somewhat uncertain.
  • Loading branch information
workingjubilee committed Jan 27, 2022
1 parent cde7bdc commit e96159e
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 14 deletions.
22 changes: 20 additions & 2 deletions library/std/src/lib.rs
Expand Up @@ -313,6 +313,7 @@
#![feature(panic_internals)]
#![feature(panic_unwind)]
#![feature(pin_static_ref)]
#![feature(platform_intrinsics)]
#![feature(portable_simd)]
#![feature(prelude_import)]
#![feature(ptr_as_uninit)]
Expand Down Expand Up @@ -465,8 +466,6 @@ pub use core::pin;
pub use core::ptr;
#[stable(feature = "rust1", since = "1.0.0")]
pub use core::result;
#[unstable(feature = "portable_simd", issue = "86656")]
pub use core::simd;
#[unstable(feature = "async_stream", issue = "79024")]
pub use core::stream;
#[stable(feature = "i128", since = "1.26.0")]
Expand Down Expand Up @@ -513,6 +512,25 @@ pub mod time;
#[unstable(feature = "once_cell", issue = "74465")]
pub mod lazy;

// Pull in `std_float` crate into libstd. The contents of
// `std_float` are in a different repository: rust-lang/portable-simd.
#[path = "../../portable-simd/crates/std_float/src/lib.rs"]
#[allow(missing_debug_implementations, dead_code, unsafe_op_in_unsafe_fn, unused_unsafe)]
#[allow(rustdoc::bare_urls)]
#[unstable(feature = "portable_simd", issue = "86656")]
#[cfg(not(all(miri, doctest)))] // Miri does not support all SIMD intrinsics
mod std_float;

#[cfg(not(all(miri, doctest)))] // Miri does not support all SIMD intrinsics
#[doc = include_str!("../../portable-simd/crates/core_simd/src/core_simd_docs.md")]
#[unstable(feature = "portable_simd", issue = "86656")]
pub mod simd {
#[doc(inline)]
pub use crate::std_float::StdFloat;
#[doc(inline)]
pub use core::simd::*;
}

#[stable(feature = "futures_api", since = "1.36.0")]
pub mod task {
//! Types and Traits for working with asynchronous tasks.
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/simd/libm_std_can_float.rs
@@ -0,0 +1,23 @@
// run-pass

// This is the converse of the other libm test.
#![feature(portable_simd)]
use std::simd::f32x4;
use std::simd::StdFloat;

// For SIMD float ops, the LLIR version which is used to implement the portable
// forms of them may become calls to math.h AKA libm. So, we can't guarantee
// we can compile them for #![no_std] crates.
//
// However, we can expose some of these ops via an extension trait.
fn main() {
let x = f32x4::from_array([0.1, 0.5, 0.6, -1.5]);
let x2 = x + x;
let _xc = x.ceil();
let _xf = x.floor();
let _xr = x.round();
let _xt = x.trunc();
let _xfma = x.mul_add(x, x);
let _xsqrt = x.sqrt();
let _ = x2.abs() * x2;
}
3 changes: 2 additions & 1 deletion src/test/ui/simd/portable-intrinsics-arent-exposed.rs
@@ -1,7 +1,8 @@
// May not matter, since people can use them with a nightly feature.
// However this tests to guarantee they don't leak out via portable_simd,
// and thus don't accidentally get stabilized.
use std::simd::intrinsics; //~ERROR E0603
use core::simd::intrinsics; //~ERROR E0433
use std::simd::intrinsics; //~ERROR E0432

fn main() {
()
Expand Down
23 changes: 12 additions & 11 deletions src/test/ui/simd/portable-intrinsics-arent-exposed.stderr
@@ -1,15 +1,16 @@
error[E0603]: module `intrinsics` is private
--> $DIR/portable-intrinsics-arent-exposed.rs:4:16
error[E0433]: failed to resolve: maybe a missing crate `core`?
--> $DIR/portable-intrinsics-arent-exposed.rs:4:5
|
LL | use std::simd::intrinsics;
| ^^^^^^^^^^ private module
|
note: the module `intrinsics` is defined here
--> $SRC_DIR/core/src/lib.rs:LL:COL
LL | use core::simd::intrinsics;
| ^^^^ maybe a missing crate `core`?

error[E0432]: unresolved import `std::simd::intrinsics`
--> $DIR/portable-intrinsics-arent-exposed.rs:5:5
|
LL | pub use crate::core_simd::simd::*;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
LL | use std::simd::intrinsics;
| ^^^^^^^^^^^^^^^^^^^^^ no `intrinsics` in `simd`

error: aborting due to previous error
error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0603`.
Some errors have detailed explanations: E0432, E0433.
For more information about an error, try `rustc --explain E0432`.

0 comments on commit e96159e

Please sign in to comment.