Jubilee [Fri, 3 Dec 2021 01:41:30 +0000 (17:41 -0800)]
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.
Jubilee Young [Wed, 24 Nov 2021 01:55:14 +0000 (17:55 -0800)]
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.
Jubilee Young [Wed, 24 Nov 2021 01:36:54 +0000 (17:36 -0800)]
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.
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.
Jubilee Young [Wed, 24 Nov 2021 00:43:02 +0000 (16:43 -0800)]
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.
Jubilee Young [Wed, 24 Nov 2021 00:15:19 +0000 (16:15 -0800)]
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.
Jubilee Young [Wed, 10 Nov 2021 07:49:16 +0000 (23:49 -0800)]
Dynamically detect AVX512 in CI
We would like to check for errors with AVX512,
but we don't pick our CPU. So, detect available features.
This variance in checks stochastically reveals issues.
Nondeterminism is acceptable as our goal is protecting downstream.
Proloy Mishra [Tue, 9 Nov 2021 01:28:43 +0000 (06:58 +0530)]
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.
Jubilee Young [Fri, 22 Oct 2021 01:20:06 +0000 (18:20 -0700)]
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.
Jubilee Young [Sun, 19 Sep 2021 01:31:49 +0000 (18:31 -0700)]
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).
Jubilee Young [Wed, 28 Jul 2021 02:59:50 +0000 (19:59 -0700)]
Rename to portable-simd and remove other names
Clean up references to the repo's previous name.
Removes the authors field, which is non-obligatory since RFC 3052.
Better to omit than confound: let git log be our witness.
Jubilee [Mon, 2 Aug 2021 06:18:24 +0000 (23:18 -0700)]
Merge pull request #152 from rust-lang/feature/const_eval_checked
Feature/const eval checked
Adds the const_evaluatable_checked cargo feature for some experimental (but very useful) function implementations. Adds testing all cargo features to CI.
Merge pull request #142 from rust-lang/feature/traits
Combine LanesAtMost32 and SimdArray into a single trait "Vector"
Attempts to fix some unresolved questions in #139 regarding `SimdArray` having a generic parameter.
In particular, this made it not appropriate for replacing `LanesAtMost32`. Additionally, it made it impossible to use in a context where you otherwise don't know the lane count, e.g. `impl Vector`.
An unfortunate side effect of this change is that scatter/gather no longer work in the trait (nor does anything else that references the lane count in a type. This requires the super-unstable `const_evaluatable_checked` feature).
I also threw in the change from `as_slice` to `as_array` as discussed in zulip, and fixes #51.
Jubilee [Thu, 24 Jun 2021 03:47:51 +0000 (20:47 -0700)]
Merge pull request #139 from rust-lang/feat/gather
Add SimdArray trait and safe gather/scatter API (rust-lang/stdsimd#139)
This PR has four parts, without which it doesn't make a lot of sense:
- The introduction of the SimdArray trait for abstraction over vectors.
- The implementation of private vector-of-pointers types.
- Using these to allow constructing vectors with SimdArray::gather_{or, or_default, select}.
- Using these to allow writing vectors using SimdArray::scatter{,_select}.