Commit Graph

345 Commits

Author SHA1 Message Date
Sean Stangl
21b070ce43 Correct the Mask docs, and get them to fit in search results 2022-04-03 16:15:27 -06:00
Sean Stangl
c73f1fbdde
Update crates/core_simd/src/masks.rs
Co-authored-by: Jacob Lifshay <programmerjake@gmail.com>
2022-04-03 15:59:22 -06:00
Sean Stangl
4e14017f3d Standardize documentation for SIMD vector and mask types 2022-04-03 15:20:00 -06:00
Jubilee
0711e11593
rust-lang/portable-simd#267: fix big-endian bitmasks smaller than a byte 2022-03-21 00:05:38 -07:00
Ralf Jung
35e16a1e06
rust-lang/portable-simd#266: reduce Miri test count in round.rs 2022-03-20 16:17:33 -07:00
Ralf Jung
60555b57f1 fix big-endian bitmasks smaller than a byte 2022-03-17 10:42:39 -04:00
Ralf Jung
50fbfa4eba add bitmask roundtrip test for vector length below 8 2022-03-16 20:28:18 -04:00
Caleb Zulawski
60486e08ed SimdPartialOrd implies SimdPartialEq 2022-03-15 00:17:14 +00:00
Caleb Zulawski
2a02c4d9cb Create SimdFloat trait 2022-03-13 19:57:06 +00:00
Caleb Zulawski
80469c66d6 Move comparisons to SimdPartialOrd and SimdOrd traits 2022-03-13 19:07:36 +00:00
Jubilee
72df4c4505
portable-simd#261: Rename horizontal_* to reduce_* 2022-03-12 15:34:58 -08:00
Ralf Jung
49043f4434
rust-lang/portable-simd#262: also implement clamp for integer vectors
* add test from issue rust-lang/portable-simd#253
2022-03-12 15:32:28 -08:00
Jacob Lifshay
c196b8abaa replace horizontal_* with reduce_* 2022-03-11 14:49:06 -08:00
Jorge Leitao
86b9f69622
rust-lang/portable-simd#260: Add .min and .max for integers 2022-03-10 15:12:40 -08:00
Ralf Jung
adbd47973e reduce number of tests being run under Miri 2022-03-09 07:54:49 -05:00
Jubilee Young
2d13059ae9 Clean up use of cargo feature "std" 2022-03-08 13:36:29 -08:00
Jubilee Young
2e5e0ec380 Remove #![feature(const_fn_trait_bound)] 2022-03-08 13:36:29 -08:00
Ralf Jung
4ddcc006a9
rust-lang/portable-simd#252: extern blocks don't have doc comments 2022-03-04 11:14:49 -08:00
Jubilee
30975615b7
rust-lang/portable-simd#250: Add bitmask i{N <8} -> u8 impls
...and copy the notes for why they're legal.
2022-03-01 16:10:49 -08:00
Jubilee
a5789d17bf
rust-lang/portable-simd#248: Remove default features
Now that we are thoroughly embedded in libcore, we don't need these on by default.
Indeed, their presence may provide confusing results during integration attempts.
2022-02-28 19:56:31 -08:00
Jubilee
5f49d4c843
rust-lang/portable-simd#239: Bitmask conversion trait
Another approach that fixes rust-lang/portable-simd#223, as an alternative to rust-lang/portable-simd#238.

This adds the `ToBitMask` trait, which is implemented on a vector for each bitmask type it supports.  This includes all unsigned integers with enough bits to contain it.  The byte array variant has been separated out for now into rust-lang/portable-simd#246 and still requires `generic_const_exprs`, but the integer variants no longer require it and can make it to nightly.
2022-02-26 12:56:23 -08:00
Caleb Zulawski
20fa4b7623 Make internal mask implementation safe 2022-02-24 18:04:02 -08:00
Caleb Zulawski
11c3eefa35 Manually implement for supported lanes 2022-02-24 18:03:40 -08:00
Caleb Zulawski
842ac87747 Use bitmask trait 2022-02-24 18:02:39 -08:00
Jubilee
78a18c3433
rust-lang/portable-simd#245: Explain unsafe contracts of core::simd
* Explain unsafe contracts of core::simd

This permeates the module with remarks on safety for pub methods,
layout of the Simd type, correct use of intrinsics, et cetera.
This is mostly to help others curious about how core::simd works,
including other Rust contributors, `unsafe` library authors,
and eventually ourselves.
2022-02-10 09:32:44 -08:00
Caleb Zulawski
dddfffcfb3 Add some safety comments 2022-02-09 16:15:01 -08:00
Jubilee
5d52455c65 Review for clarity and concision
Co-authored-by: Caleb Zulawski <caleb.zulawski@gmail.com>
2022-02-08 17:43:26 -08:00
Jubilee Young
e628a2991c Document Simd is Simd<Wrapping<T>, N>
and other quirks like panicking
and the equivalence to zipping and mapping binary ops
2022-02-08 15:40:52 -08:00
Jubilee Young
672bfebfd8 Remove overflow panic from divrem
Includes some remarks in intrinsics.rs,
generated while auditing the interface for remaining UB.
2022-02-08 15:39:55 -08:00
Jubilee Young
4910274686 Genericize to_int_unchecked 2022-02-03 03:46:16 -08:00
Jubilee Young
ebf65de2ce Delete outmoded fn round_from_int 2022-02-03 03:46:16 -08:00
Jubilee
01350a222a
Merge portable-simd#203 - deantvv/add-spectral-norm
Add spectral_norm example from packed_simd
2022-02-01 23:17:17 -08:00
Jubilee Young
03f6fbb21e Omit Simd::cast during bootstrap 2022-01-27 10:59:23 -08:00
Jubilee Young
0031b02cee Add core_simd/tests/cast.rs 2022-01-26 21:04:47 -08:00
Jubilee Young
a991d48e95 Add Simd::cast 2022-01-26 18:37:02 -08:00
Caleb Zulawski
36cca22f16
Update crates/core_simd/src/vector/float.rs
Co-authored-by: Alexander Ronald Altman <alexanderaltman@me.com>
2022-01-24 20:11:17 -05:00
Alec Goncharow
4fc62c2082
fix documentation typo
Remove redundant "neither" in the documentation comment.
2022-01-23 16:42:57 -05:00
Jubilee Young
56566d816d Annotate signed type in int_divrem_guard
The way the macro expands, it may sometimes infer
"this is a uint, but doesn't impl Neg???"
Also, I made the "wrong path for intrinsics" error.
These fixes allow integration into libcore.
2022-01-20 19:22:14 -08:00
Jubilee Young
a4f5f01b8a Use intrinsics for Mask::{to,from}_array
This significantly simplifies codegen and should improve mask perf.

Co-authored-by: Jacob Lifshay <programmerjake@gmail.com>
2022-01-19 21:00:21 -08:00
Caleb Zulawski
138b9cf4bf Use intrinsic for min/max 2022-01-13 17:59:55 -05:00
Caleb Zulawski
65cb2c90a0 Fix mask alias 2022-01-09 13:12:22 -05:00
Jubilee
09fa72ae84 Merge portable-simd#219 - ./std-float
impl std::simd::StdFloat

 This introduces an extension trait to allow use of floating point methods
 that need runtime support. It is *excessively* documented because its mere
 existence is quite vexing, as the entire thing constitutes a leakage of
 implementation details into user observable space. Eventually the entire
 thing will ideally be folded into core and restructured to match the rest
 of the library, whatever that structure might look like at the time. This
 is preferred in lieu of the "lang item" path because any energy the lang
 items require (and it will be significant, by Simulacrum's estimation) is
 better spent on implementing our libmvec.
2021-12-31 15:50:20 -08:00
Jubilee Young
af26e3b9fd Tear down and rewrite support for float testing 2021-12-31 14:28:14 -08:00
Jubilee Young
ecc00efee0 impl std::simd::StdFloat
While consulting with Simulacrum on how to make available the float
functions that currently require runtime support for `Simd<f32, N>` and
`Simd<f64, N>`, we realized breaking coherence with the classic approach
of lang items was, since `{core,std}::simd::Simd` is a `ty::Adt`, likely
to be quite a bit nasty. The project group has a long-term plan for how
to get around this kind of issue and move the associated functions into
libcore, but that will likely take time as well. Since all routes
forward are temporally costly, we probably will skip the lang item
approach entirely and go the "proper" route, but in the interests of
having something this year for people to play around with, this
extension trait was whipped up.

For now, while it involves a lot of fairly internal details most users
shouldn't have to care about, I went ahead and fully documented the
situation for any passerby to read on the trait, as the situation is
quite unusual and puzzling to begin with.
2021-12-31 14:22:34 -08:00
Jubilee
4bbef261b6
Merge portable-simd#210 - ./wrap-shifts
Refactor ops.rs with wrapping shifts

This approaches reducing macro nesting in a slightly different way. Instead of just flattening details, make one macro apply another. This allows specifying all details up-front in the first macro invocation, making it easier to audit and refactor in the future.

This refactor also has some functional changes. Only one is a true behavior change, however:
- The visible one is that SIMD shifts are now wrapping, not panicking on overflow
- `core::simd` now has a lot more instances of `#[must_use]`, which merely lints
- div/rem now perform a SIMD check but remain as before, which should improve performance but be invisible
2021-12-30 01:22:01 -08:00
Jubilee Young
a42420583b Use Mask::any in div check 2021-12-23 23:17:13 -08:00
Jubilee Young
bc326a2bbc Refactor ops.rs with a recursive macro
This approaches reducing macro nesting in a slightly different way.
Instead of just flattening details, make one macro apply another.
This allows specifying all details up-front in the first macro
invocation, making it easier to audit and refactor in the future.
2021-12-22 15:37:05 -08:00
Jubilee Young
533f0fc81a Use relative intrinsics paths for bitmasks 2021-12-10 22:11:27 -08:00
Jubilee Young
5dcd397f47 Finish refactoring ints in ops.rs
This should perform a SIMD check for whether or not we can div/rem,
so that we can panic several times faster!
2021-12-09 13:23:45 -08:00
Jubilee Young
049e8ca7f7 Refactor float arith with #[must_use] 2021-12-08 18:09:46 -08:00
Jubilee Young
8aef340b8b Refactor bitops with #[must_use] 2021-12-08 18:09:32 -08:00
Jubilee Young
b6d0eec3de Wrap bitshifts in ops.rs
For all other operators, we use wrapping logic where applicable.
This is another case it applies. Per rust-lang/rust#91237, we may
wish to specify this as the natural behavior of `simd_{shl,shr}`.
2021-12-08 18:08:18 -08:00
Caleb Zulawski
d9f82f9c4d Remove Select trait 2021-12-04 05:54:15 +00:00
Jubilee
a8385522ad
Merge portable-simd#195 - portable-simd:trait-ops
Generic `core::ops` for `Simd<T, _>`

In order to maintain type soundness, we need to be sure we only implement an operation for `Simd<T, _> where T: SimdElement`... and also valid for that operation in general. While we could do this purely parametrically, it is more sound to implement the operators directly for the base scalar type arguments and then use type parameters to extend the operators to the "higher order" operations.

This implements that strategy and cleans up `simd::ops` into a few submodules:
- assign.rs: `core::ops::*Assign`
- deref.rs:  `core::ops` impls which "deref" borrowed versions of the arguments
- unary.rs: encloses the logic for unary operators on `Simd`, as unary ops are much simpler

This is possible since everything need not be nested in a single maze of macros anymore. The result simplifies the logic and allows reasoning about what operators are valid based on the expressed trait bounds, and also reduces the size of the trait implementation output in rustdoc, for a huge win of 4 MB off the size of `struct.Simd.html`! This addresses a common user complaint, as the original was over 5.5 MB and capable of crashing browsers!

This also carries a fix for a type-inference-related breakage, by removing the autosplatting (vector + scalar binop) impls, as unfortunately the presence of autosplatting was capable of busting type inference. We will likely need to see results from a Crater run before we can understand how to re-land autosplatting.
2021-12-02 17:41:30 -08:00
Jubilee Young
8003b04323 impl Op<&'_ RHS> for &'_ LHS 2021-12-01 15:45:01 -08:00
Jubilee Young
257fa7aa6d Drop splats for Simd<T, _>
Unfortunately, splatting impls currently break several crates.
Rust needs more time to review possible mitigations, so
drop the impls for the `impl Add<T> for Simd<T, _>` pattern, for now.
2021-12-01 15:40:53 -08:00
Jubilee Young
6094f22ceb impl unary.rs for Simd<{i,u}{8,16,32,64,size}, _>
In order to assure type soundness, these "base" impls
need to go directly on Simd<T, _> for every scalar type argument.
A bit of cleanup of ops.rs is still warranted.
2021-12-01 15:40:46 -08:00
Dean Li
861a6e85e1
Add spectral_norm example from packed_simd 2021-11-28 15:19:01 +08:00
Alexander Ronald Altman
b2dac7124b Uncomment AVX512 byte vector conversions
Resolves my comment in #197, at least for now; #187 is pending but since these are already here, just commented, it seemed to make sense to me to re-enable them anyway.
2021-11-26 13:48:52 -08:00
Jubilee Young
ae612100d2 Generically implement horizontal_{and,or,xor} 2021-11-24 08:07:41 -08:00
Jubilee Young
51ff925925 impl assign.rs<U> for Simd<T, _>
Instead of implementing {Op}Assign traits for individual scalar type args
to Simd<_, _>, use parametric impls that reassert the bounds of the binary op.
2021-11-23 18:11:48 -08:00
Jubilee Young
0a6992f5bf impl deref.rs<&Self> for Simd<T, _>
Instead of implementing each "deref" pattern for every single scalar,
we can use type parameters for Simd operating on &Self.
We can use a macro, but keep it cleaner and more explicit.
2021-11-23 18:11:48 -08:00
Jubilee Young
ced3a05526 Attempt to support to 64 lanes 2021-11-23 15:19:01 -08:00
Jubilee Young
f7b0358573 Sprinkle the crate with #[must_use] 2021-11-14 12:11:35 -08:00
Caleb Zulawski
36e198b97a Use new bitmask intrinsics with byte arrays 2021-11-13 13:22:06 -08:00
Jubilee Young
1ce1c645cf Rewrite Arm transmutes, reading std::arch closer 2021-11-12 16:56:14 -08:00
Jubilee Young
6ddf7ad8e1 Restrict Arm types to Arm v7+
This mostly mirrors the restrictions in std::arch.
It can be loosened slightly with later refactoring.
2021-11-11 11:40:18 -08:00
Jubilee Young
949f71c0dc Deny warnings in CI and fix 2021-11-10 14:40:32 -08:00
Jubilee
081240a663
Merge pull request #175 from rust-lang/feature/more-actions
Delete travis config, move tests to github actions.
2021-11-09 20:12:47 -08:00
Caleb Zulawski
349a61143c Delete travis config, move tests to github actions. 2021-11-10 02:18:41 +00:00
Caleb Zulawski
0ecf9871fc
Merge pull request #181 from rust-lang/rotate_lanes
rotate_{left,right} -> rotate_lanes_{left,right}
2021-11-08 23:01:05 -05:00
Proloy Mishra
d2e87281fc
add Simd::from_slice (#177)
* add `Simd::from_slice`

uses a zeroed initial array and loops so that it can be const.
unfortunately, parameterizing the assert with slice length
needs `#![feature(const_fn_fn_ptr_basics)]` to work.
2021-11-08 17:28:43 -08:00
Caleb Zulawski
4e00aa68c7 rotate_{left,right} -> rotate_lanes_{left,right} 2021-11-06 00:34:23 +00:00
Caleb Zulawski
772bf2090e Hide select impl in sealed trait 2021-10-22 00:10:44 -07:00
Caleb Zulawski
7c2d295a76 Hide mask impl details in sealed trait. 2021-10-22 00:10:44 -07:00
Jubilee Young
ab8eec7cba Fixup import pathing for core
This changes simd_swizzle! to a decl_macro to give it a path,
so it can be imported using a path and not the crate root.
It also adds various uses that were missed and adjusts paths.
2021-10-21 18:20:06 -07:00
Caleb Zulawski
5b4282edcd Improve docs 2021-10-11 13:18:59 -07:00
Caleb Zulawski
765bee6362 Update crates/core_simd/src/swizzle.rs
Co-authored-by: Jubilee <46493976+workingjubilee@users.noreply.github.com>
2021-10-11 13:18:59 -07:00
Caleb Zulawski
cd7ecba19f Remove adt_const_params feature 2021-10-11 13:18:59 -07:00
Caleb Zulawski
37797d9c0a simd_shuffle -> simd_swizzle 2021-10-11 13:18:59 -07:00
Caleb Zulawski
98e4fcae5a Fix macro in core
Co-authored-by: Jubilee <46493976+workingjubilee@users.noreply.github.com>
2021-10-11 13:18:59 -07:00
Caleb Zulawski
10168fb7c4 Add new swizzle API
Expand swizzle API and migrate existing functions. Add rotate_left, rotate_right.

Hide implementation details

Add simd_shuffle macro
2021-10-11 13:18:59 -07:00
Jubilee
a16b481a08 Simplify language for scatter/gather
Co-authored-by: Caleb Zulawski <caleb.zulawski@gmail.com>
2021-10-03 14:35:07 -07:00
Jubilee Young
9be26656d2 Rewrite gather/scatter docs
Headings with # Safety and # Examples are more "std style".
Use terms like "enable" and "disable", rather than "mask" jargon.
2021-10-03 14:33:56 -07:00
Jubilee
01e9816ace docs: fix typo gather -> scatter
Co-authored-by: Jacob Lifshay <programmerjake@gmail.com>
2021-10-03 11:04:58 -07:00
Jubilee Young
6d23662689 Add {gather,scatter}_select_unchecked
This unsafe variant allows the thinnest API, in case LLVM cannot
perform loop-invariant code motion on a hot loop when the safe
form is used.

An unchecked variant could be added to other forms, but doesn't
seem likely to improve anything, since it would just add heavier
codegen.
2021-10-03 11:04:58 -07:00
Jubilee
436ca7f7aa
Add lanes() and associated LANES const 2021-09-29 14:19:45 -07:00
Jubilee Young
b506e3e28e Renovate for Edition 2021
In a still-future edition, `unsafe_op_in_unsafe_fn` may error.
Let's get ahead of that.
2021-09-29 14:11:40 -07:00
Magnus Ulimoen
ec05dfbbf9 Add associated LANES const 2021-09-29 17:20:07 +00:00
Magnus Ulimoen
4fbccafc66 Add lanes() 2021-09-29 16:38:03 +00:00
Jubilee Young
afd7c5a5ee Make sure MaskElement is in bitmasks.rs 2021-09-27 15:27:34 -07:00
Jubilee Young
c2f59483f9 Feature-flag fused mul-add to block libcalls 2021-09-21 19:42:31 -07:00
Jubilee Young
6d3d07abfe Feature-flag doc tests so they run for core 2021-09-21 17:19:35 -07:00
Jubilee Young
8342fe75f2 Cleanup more for std::simd also 2021-09-21 10:31:37 -07:00
Jubilee Young
b25ed7f86d Restructure crate as core module
Aligns module with rust-lang/library/core, creating an... unusual
architecture that is easier to pull in as a module, as core itself can
have no dependencies (as we haven't built core yet).
2021-09-18 23:26:10 -07:00
Caleb Zulawski
8cf7a62e5d
Fix cargo features for nightly (#155)
* Fix cargo features for nightly
2021-09-08 17:01:16 -07:00
Jubilee
d42875302d
Merge pull request #154 from rust-lang/feature/generic-element-type
Change vectors to be generic over element type.
2021-08-17 12:10:44 -07:00
Caleb Zulawski
4aafd8e779 Rename element type variable 2021-08-16 16:38:30 -04:00
Caleb Zulawski
cf653c7b93
Update crates/core_simd/src/vector.rs
Co-authored-by: Jubilee <46493976+workingjubilee@users.noreply.github.com>
2021-08-13 20:40:05 -04:00
Caleb Zulawski
00165ed5be Remove mask aliases 2021-08-07 21:22:10 +00:00