-
Notifications
You must be signed in to change notification settings - Fork 269
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
_MM_SHUFFLE has incorrect return type #522
Comments
cc @bitshifter |
Oops. Will look into it. |
Hm it also looks like this isn't |
@alexcrichton this is a helper macro in C. I think that making it const (or a macro in Rust) is not only fine, but necessary, since its result needs to be passed to other intrinsics taking immediate mode arguments, which only accept constant expressions (so if we don't make this const, or a macro, this becomes unusable). Also, this is not an intrinsic per se, in the sense that it does not require target features (it is a helper macro in C), so I don't know why it should be unsafe. We map other helper macros to just |
Hm ok if that's the case can it be marked as unstable for now? I'd prefer to not stabilize this behavior immediately personally |
Sure. FWIW, I think we screwed up. Ideally, we should do a breaking change and fix the argument type of If we don't fix the argument type of |
FYI, the bug of Making |
For now I'd leave this as unstable and maybe publish a crate on crates.io with the fixed intrisnics and/or a macro? I think we'll want to avoid for now exporting more macros from the standard library (stability is a hard thing there) |
This did start out as a macro as it is in C but I couldn't work out how to declare it in coresimd and rexport it to stdsimd. So I'm not sure what the solution should be here. |
I think let's originally start out with destabilizing the function and go from there? @bitshifter would you be up for sending that PR? |
Yep sure. |
I don't understand why we want to limit the number of macros in the standard library. Is the issue that the same macro's interface might not be stable from one rust release to the another? |
@Paul-E oh it's mostly related to stability where macros have had to be insta-stable in the past and we can't have an unstable macro exported from libstd. Times may have changed though! |
@alexcrichton so we can't mark macros as requiring a feature flag? Do you know who might know the state of support for this? (nrc maybe ?) |
I think we should just add A macro is a particular bad hack for this, the |
In the case |
Note that you can work around that with unions already
|
Are there still plans to fix Also, |
@alexcrichton could we do a crater run of changing the argument type of |
So we did a crater run (#586) and it appears that nothing breaks due to changing the argument type of That does not mean that we should do that change. To summarize the changes, there is a bug in the Intel intrinsics guide: the There are other intrinsics in the library that are buggy too, e.g., @GabrielMajeri pointed out that We haven't fixed any of these bugs because:
Our stance here has been that if these bugs annoy you enough, then just write a wrapper, put it in a crate, and use that instead. However, this does not mean that these are not bugs, these bugs are annoying, they cost time to our users and to us, etc. So I see a couple of ways to proceed here:
So honestly, I don't think we should fix these bugs, breaking Rust users is not worth the value these fixes add, and a wrapper can add the same value if done right. in particular, the intent of the RFC was never for In the particular case of In general, we should open an issue to track these types of bugs (EDIT: I've opened #587 for that), and add new ones there as they pop up so that anyone that wants to write a wrapper knows where to start. |
Thanks for writing that up @gnzlbg! I think I agree with everything, although I'd perhaps personally take a less hard stance on not fixing bugs. I think that, like soundness issues, fixing bugs in intrinsics is worth it and should be pursued if there's enough motivation. There's thousands of intrinsics and likely more bugs in the spec than we've already discovered, so this is quite likely to keep coming up. I think if we do crater runs, message changes, and work quickly with any unexpected fallout we can continue to make minor tweaks where necessary. |
Maybe we can have a mini-FCP on this with the libs team? If they sign off on fixing these bugs I'd be fine with it. Maybe we can fix them as long as crater doesn't return any breakage, or minor breakage that we can send PRs to workaround (e.g. if its a single crate, and the author accepts PRs, then we might be able to avoid breakage, etc.). |
Certainly! I do think it's good to have some requirements for breakage of course, and those could be something like:
(something like that) |
Pkgsrc changes: * NetBSD/sparc64 disabling of "packed" removed ("packed" removed upstream) * Adapt src_libstd_build.rs patch, update sed'ing of .cargo-checksum.json Build verified on NetBSD 8.0/amd64. Upstream changes: Version 1.36.0 (2019-07-04) ========================== Language -------- - [Non-Lexical Lifetimes are now enabled on the 2015 edition.][59114] - [The order of traits in trait objects no longer affects the semantics of that object.][59445] e.g. `dyn Send + fmt::Debug` is now equivalent to `dyn fmt::Debug + Send`, where this was previously not the case. Libraries --------- - [`HashMap`'s implementation has been replaced with `hashbrown::HashMap` implem entation.][58623] - [`TryFromSliceError` now implements `From<Infallible>`.][60318] - [`mem::needs_drop` is now available as a const fn.][60364] - [`alloc::Layout::from_size_align_unchecked` is now available as a const fn.][6 0370] - [`String` now implements `BorrowMut<str>`.][60404] - [`io::Cursor` now implements `Default`.][60234] - [Both `NonNull::{dangling, cast}` are now const fns.][60244] - [The `alloc` crate is now stable.][59675] `alloc` allows you to use a subset of `std` (e.g. `Vec`, `Box`, `Arc`) in `#![no_std]` environments if the environment has access to heap memory allocation. - [`String` now implements `From<&String>`.][59825] - [You can now pass multiple arguments to the `dbg!` macro.][59826] `dbg!` will return a tuple of each argument when there is multiple arguments. - [`Result::{is_err, is_ok}` are now `#[must_use]` and will produce a warning if not used.][59648] Stabilized APIs --------------- - [`VecDeque::rotate_left`] - [`VecDeque::rotate_right`] - [`Iterator::copied`] - [`io::IoSlice`] - [`io::IoSliceMut`] - [`Read::read_vectored`] - [`Write::write_vectored`] - [`str::as_mut_ptr`] - [`mem::MaybeUninit`] - [`pointer::align_offset`] - [`future::Future`] - [`task::Context`] - [`task::RawWaker`] - [`task::RawWakerVTable`] - [`task::Waker`] - [`task::Poll`] Cargo ----- - [Cargo will now produce an error if you attempt to use the name of a required dependency as a feature.][cargo/6860] - [You can now pass the `--offline` flag to run cargo without accessing the netw ork.][cargo/6934] You can find further change's in [Cargo's 1.36.0 release notes][cargo-1-36-0]. Clippy ------ There have been numerous additions and fixes to clippy, see [Clippy's 1.36.0 rel ease notes][clippy-1-36-0] for more details. Misc ---- Compatibility Notes ------------------- - [`std::arch::x86::_rdtsc` returns `u64` instead of `i64`][stdsimd/559] - [`std::arch::x86_64::_mm_shuffle_ps` takes an `i32` instead of `u32` for `mask `][stdsimd/522] - With the stabilisation of `mem::MaybeUninit`, `mem::uninitialized` use is no longer recommended, and will be deprecated in 1.38.0. [60318]: rust-lang/rust#60318 [60364]: rust-lang/rust#60364 [60370]: rust-lang/rust#60370 [60404]: rust-lang/rust#60404 [60234]: rust-lang/rust#60234 [60244]: rust-lang/rust#60244 [58623]: rust-lang/rust#58623 [59648]: rust-lang/rust#59648 [59675]: rust-lang/rust#59675 [59825]: rust-lang/rust#59825 [59826]: rust-lang/rust#59826 [59445]: rust-lang/rust#59445 [59114]: rust-lang/rust#59114 [cargo/6860]: rust-lang/cargo#6860 [cargo/6934]: rust-lang/cargo#6934 [`VecDeque::rotate_left`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_left [`VecDeque::rotate_right`]: https://doc.rust-lang.org/std/collections/struct.VecDeque.html#method.rotate_right [`Iterator::copied`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#tymethod.copied [`io::IoSlice`]: https://doc.rust-lang.org/std/io/struct.IoSlice.html [`io::IoSliceMut`]: https://doc.rust-lang.org/std/io/struct.IoSliceMut.html [`Read::read_vectored`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_vectored [`Write::write_vectored`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_vectored [`str::as_mut_ptr`]: https://doc.rust-lang.org/std/primitive.str.html#method.as_mut_ptr [`mem::MaybeUninit`]: https://doc.rust-lang.org/std/mem/union.MaybeUninit.html [`pointer::align_offset`]: https://doc.rust-lang.org/std/primitive.pointer.html#method.align_offset [`future::Future`]: https://doc.rust-lang.org/std/future/trait.Future.html [`task::Context`]: https://doc.rust-lang.org/beta/std/task/struct.Context.html [`task::RawWaker`]: https://doc.rust-lang.org/beta/std/task/struct.RawWaker.html [`task::RawWakerVTable`]: https://doc.rust-lang.org/beta/std/task/struct.RawWakerVTable.html [`task::Waker`]: https://doc.rust-lang.org/beta/std/task/struct.Waker.html [`task::Poll`]: https://doc.rust-lang.org/beta/std/task/enum.Poll.html [clippy-1-36-0]: https://github.com/rust-lang/rust-clippy/blob/master/CHANGELOG.md#rust-136 [cargo-1-36-0]: https://github.com/rust-lang/cargo/blob/master/CHANGELOG.md#cargo-136-2019-07-04 [stdsimd/522]: rust-lang/stdarch#522 [stdsimd/559]: rust-lang/stdarch#559
The arguments should probably also be renamed to match xmmintrin.h. pub fn _MM_SHUFFLE(z: u32, y: u32, x: u32, w: u32) -> i32 #define _MM_SHUFFLE(fp3,fp2,fp1,fp0) \
(((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | (fp0)) |
_MM_SHUFFLE
was added recently in #479 . Currently_MM_SHUFFLE
returns au32
, but the functions it's output is used with take ani32
, eg_mm_shuffle_epi32
.Although normally this isn't an issue as you could just transmute the results, the input to
_mm_shuffle_epi32
requires the shuffle argument to be constant.The text was updated successfully, but these errors were encountered: