4

Generic `core::ops` for `Simd<T, _>` by workingjubilee · Pull Request #195...

 2 years ago
source link: https://github.com/rust-lang/portable-simd/pull/195
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Copy link

Contributor

workingjubilee commented 23 days ago

edited

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.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK