Wrapper for SIMD registers. More...
#include <eve/arch/cpu/wide.hpp>
Required header: #include <eve/wide.hpp>
eve::wide is an architecture-agnostic representation of a SIMD register and provides standardized API to access informations, compute values and manipulate such register.
| Type | Type of value to store in the register |
| Cardinal | Cardinal of the register. By default, the best cardinal for current architecture is selected. |
Public Types | |
| using | value_type = Type |
| The type stored in the register. | |
| using | translated_element_type = translate_t< Type > |
| The type resulting from translating the current wide's elements type. | |
| using | translated_type = wide< translated_element_type, Cardinal > |
| The type resulting from translating the current wide type. | |
| using | abi_type = abi_t< translated_element_type, Cardinal > |
| The ABI tag for this register. | |
| using | storage_type = typename storage_base::storage_type |
| The type used for this register storage. | |
| using | cardinal_type = Cardinal |
| Type describing the number of lanes of current wide. | |
| using | size_type = std::ptrdiff_t |
| Type representing the size of the current wide. | |
| using | is_like = value_type |
| Opt-in for like concept. | |
| using | combined_type = wide< Type, typename Cardinal::combined_type > |
| Type representing a wide of the same type but with a cardinal twice the size. | |
| template<typename T , typename N = expected_cardinal_t<T>> | |
| using | rebind = wide< T, N > |
Generates a eve::wide from a different type T and cardinal N. If unspecified, N is computed as expected_cardinal_t<T>. | |
| template<typename N > | |
| using | rescale = wide< Type, N > |
Generates a eve::wide type from a different cardinal N. | |
Public Member Functions | |
Constructors | |
| wide () | |
Default constructor This operation is a no-op unless Type satisfies eve::product_type and has a non trivial default constructor. | |
| wide () | |
| This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. | |
| wide (storage_type const &r) noexcept | |
| Constructs from ABI-specific storage. | |
|
template<detail::range Range> requires (std::same_as<value_type_t<Range>, Type> && !std::same_as<storage_type, Range>) | |
| wide (Range &&r) noexcept | |
Constructs a eve::wide from a Container. Construction is done piecewise unless the Input Iterators extracted from r are [Random Access Iterators](https://en.cppreference.com/w/cpp/named_req/RandomAccessIterator. | |
| template<simd_compatible_ptr< wide > Ptr> | |
| wide (Ptr ptr) noexcept | |
| Constructs a eve::wide from a SIMD compatible pointer. | |
|
template<detail::data_source... Ptr> requires (kumi::product_type<Type>) | |
| wide (eve::soa_ptr< Ptr... > ptr) noexcept | |
| Constructs a eve::wide from a SIMD compatible pointer. | |
|
template<typename S > requires (std::constructible_from<Type, S> || (std::floating_point<S> && std::same_as<Type, eve::float16_t>)) | |
| wide (S const &v) noexcept | |
| Constructs a eve::wide by splatting a scalar value in all lanes. | |
|
template<scalar_value S0, scalar_value S1, scalar_value... Ss> requires ( (Cardinal::value == 2 + sizeof...(vs)) && std::is_convertible_v<S0,Type> && (std::is_convertible_v<S1, Type> && ... && std::is_convertible_v<Ss, Type>) ) | |
| wide (S0 v0, S1 v1, Ss... vs) noexcept | |
| Constructs a eve::wide from a sequence of scalar values of proper size. | |
|
template<typename S0 , typename... Ss> requires (kumi::sized_product_type_or_more<Type,1+sizeof...(Ss)>) | |
| wide (S0 const &v0, Ss const &...vs) noexcept | |
| Constructs a eve::wide from a sequence of values. | |
| template<eve::invocable< size_type, size_type > Generator> | |
| wide (Generator &&g) noexcept | |
| Constructs a eve::wide from a Callable Object. | |
| template<eve::invocable< size_type > Generator> | |
| wide (Generator &&g) noexcept | |
| Constructs a eve::wide from a Callable Object. | |
|
template<arithmetic_simd_value W0, arithmetic_simd_value W1, arithmetic_simd_value... Ws> requires (combinable_to<wide, W0, W1, Ws...>) | |
| wide (W0 w0, W1 w1, Ws... ws) noexcept | |
| Constructs a eve::wide by combining multiple wides of the same underlying type and which cardinals sums to the current cardinal. | |
Assignment operators | |
| wide & | operator= (storage_type const &r) |
| Assignment of an architecture-specific SIMD register. | |
| template<scalar_value S> | |
| wide & | operator= (S v) noexcept |
| Assignment of a scalar value by splatting it in all lanes. | |
Modifiers | |
| void | set (std::size_t i, scalar_value auto v) noexcept |
| Set the value of a given lane. | |
| Type | get (std::size_t i) const noexcept |
| Retrieve the value from a given lane. | |
| Type | back () const noexcept |
| Retrieve the value from the last lane. | |
| Type | front () const noexcept |
| Retrieve the value from the first lane. | |
| auto | slice () const |
Slice a eve::wide into two eve::wide of half cardinal. Does not participate in overload resolution if Cardinal::value == 1. | |
| template<std::size_t Slice> requires (Cardinal::value > 1) | |
| auto | slice (slice_t< Slice > s) const |
Return the upper or lower half-sized slice of a eve::wide. Does not participate in overload resolution if Cardinal::value == 1. | |
| void | swap (wide &other) |
| Exchange this value with another eve::wide. | |
| wide & | operator++ () noexcept |
| Pre-incrementation operator. | |
| wide & | operator-- () noexcept |
| Pre-decrementation operator. | |
| wide | operator++ (int) noexcept |
| Post-incrementation operator. | |
| wide | operator-- (int) noexcept |
| Post-decrementation operator. | |
Static Public Member Functions | |
Indexing and reordering | |
| static constexpr size_type | size () noexcept |
| Size of the wide in number of lanes. | |
| static constexpr size_type | max_size () noexcept |
| Maximal number of lanes for a given wide. | |
| static constexpr bool | empty () noexcept |
| Check if a wide contains 0 lanes. | |
Friends | |
| void | swap (wide &lhs, wide &rhs) noexcept |
Swaps the contents of lhs and rhs by calling lhs.swap(rhs). | |
| wide | operator~ (wide const &v) noexcept |
| Performs a bitwise complement on all the wide lanes. | |
| template<value V> | |
| wide & | operator&= (wide &w, V o) noexcept |
| Performs a compound bitwise and on all the wide lanes and assign the result to the current one. | |
| template<scalar_value U, typename M > | |
| wide | operator& (wide const &a, wide< U, M > const &b) noexcept |
Performs a bitwise and between all lanes of two wide instances. Do not participate to overload resolution if both wide doesnot have the same sizeof | |
| template<scalar_value S> | |
| wide | operator& (wide const &w, S s) noexcept |
Performs a bitwise and between all lanes of a eve::wide and a scalar Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| template<scalar_value S> | |
| wide< S, Cardinal > | operator& (S s, wide const &w) noexcept |
Performs a bitwise and between all lanes of a scalar and a eve::wide Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| template<value V> | |
| wide & | operator|= (wide &w, V o) noexcept |
| Performs a Compound bitwise or on all the wide lanes and assign the result to the current one. | |
| template<scalar_value U, typename M > | |
| wide | operator| (wide const &a, wide< U, M > const &b) noexcept |
Performs a bitwise or between all lanes of two wide instances. Do not participate to overload resolution if both wide doesn't has the same sizeof | |
| template<scalar_value S> | |
| wide | operator| (wide const &w, S s) noexcept |
Performs a bitwise or between all lanes of a scalar and a eve::wide Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| template<scalar_value S> | |
| wide< S, Cardinal > | operator| (S s, wide const &w) noexcept |
Performs a bitwise or between all lanes of a scalar and a eve::wide Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| template<value V> | |
| wide & | operator^= (wide &w, V o) noexcept |
| Performs a bitwise xor on all the wide lanes and assign the result to the current one. | |
| template<scalar_value U, typename M > | |
| wide | operator^ (wide const &a, wide< U, M > const &b) noexcept |
Performs a bitwise xor between all lanes of two wide instances. Do not participate to overload resolution if both wide doesn't has the same sizeof | |
| template<scalar_value S> | |
| wide | operator^ (wide const &w, S s) noexcept |
Performs a bitwise xor between all lanes of a scalar and a eve::wide Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| template<scalar_value S> | |
| wide< S, Cardinal > | operator^ (S s, wide const &w) noexcept |
Performs a bitwise xor between all lanes of a scalar and a eve::wide Do not participate to overload resolution if sizeof(Type) != sizeof(S) | |
| wide | operator+ (wide const &v) noexcept |
| Unary plus operator. | |
| wide | operator- (wide const &v) noexcept |
| Unary minus operator. See also: eve::minus. | |
|
template<value V> requires (!kumi::product_type<Type>) | |
| wide & | operator+= (wide &w, V v) noexcept |
| Performs the compound addition on all the wide lanes and assign the result to the current one. See also: eve::add. | |
| wide | operator+ (wide const &a, wide const &b) noexcept |
| Performs the addition between all lanes of its parameters See also: eve::add. | |
| wide | operator+ (plain_scalar_value auto s, wide const &v) noexcept |
| Performs the addition between a scalar and all lanes of a eve::wide See also: eve::add. | |
| wide | operator+ (wide const &v, plain_scalar_value auto s) noexcept |
| Performs the addition between all lanes of a eve::wide and a scalar See also: eve::add. | |
|
template<value V> requires (!kumi::product_type<Type>) | |
| wide & | operator-= (wide &w, V v) noexcept |
| Performs the compound difference on all the wide lanes and assign the result to the current one. See also: eve::sub. | |
| wide | operator- (wide const &a, wide const &b) noexcept |
| Performs the difference between all lanes of its parameters See also: eve::sub. | |
| wide | operator- (plain_scalar_value auto s, wide const &w) noexcept |
| Performs the difference between a scalar and all lanes of a eve::wide See also: eve::sub. | |
| wide | operator- (wide const &w, plain_scalar_value auto s) noexcept |
| Performs the difference between all lanes of a eve::wide and a scalar See also: eve::sub. | |
|
template<value V> requires (!kumi::product_type<Type>) | |
| wide & | operator*= (wide &w, V o) noexcept |
| Performs the compound product on all the wide lanes and assign the result to the current one. See also: eve::mul. | |
| wide | operator* (wide const &a, wide const &b) noexcept |
| Performs the product between all lanes of its parameters See also: eve::mul. | |
| wide | operator* (plain_scalar_value auto s, wide const &w) noexcept |
| Performs the product between a scalar and all lanes of a eve::wide See also: eve::mul. | |
| wide | operator* (wide const &w, plain_scalar_value auto s) noexcept |
| Performs the product between all lanes of a eve::wide and a scalar See also: eve::mul. | |
|
template<value V> requires (!kumi::product_type<Type>) | |
| wide & | operator/= (wide &w, V o) noexcept |
| Performs the compound division on all the wide lanes and assign the result to the current one. See also: eve::div. | |
| wide | operator/ (wide const &a, wide const &b) noexcept |
| Performs the division between all lanes of its parameters See also: eve::div. | |
| wide | operator/ (plain_scalar_value auto s, wide const &w) noexcept |
| Performs the division between a scalar and all lanes of a eve::wide See also: eve::div. | |
| wide | operator/ (wide const &v, plain_scalar_value auto s) noexcept |
| Performs the division between all lanes of a eve::wide and a scalar See also: eve::div. | |
| template<integral_value V> | |
| wide & | operator%= (wide &w, V o) noexcept |
Performs the compound modulo on all the wide lanes and assign the result to the current one. Does not participate in overload resolution if Type does not models integral_scalar_value. | |
| wide | operator% (wide const &a, wide const &b) noexcept |
Performs the modulo between all lanes of its parameters. Does not participate in overload resolution if Type does not models integral_scalar_value. | |
| template<integral_scalar_value S> | |
| auto | operator% (S s, wide const &w) noexcept |
Performs the modulo between a scalar and all lanes of a eve::wide Does not participate in overload resolution if Type does not models integral_scalar_value. | |
| auto | operator% (wide const &w, integral_scalar_value auto s) noexcept |
Performs the modulo between all lanes of a eve::wide and a scalar Does not participate in overload resolution if Type does not models integral_scalar_value. | |
| template<integral_value S> | |
| wide & | operator<<= (wide &w, S s) noexcept |
| Performs the compound left-shift on all the eve::wide lanes and assign the result to current one. | |
| template<std::ptrdiff_t V> | |
| wide & | operator<<= (wide &w, index_t< V > const &s) noexcept |
| Performs the compound left-shift on all the eve::wide lanes with a constant and assign the result to current one. | |
| template<integral_value S> | |
| wide | operator<< (wide w, S s) noexcept |
| Performs the left-shift between all lanes of a eve::wide and an integral scalar. | |
| template<std::ptrdiff_t V> | |
| wide | operator<< (wide w, index_t< V > const &s) noexcept |
| Performs the left-shift between all lanes of a eve::wide and an integral constant. | |
| template<integral_value S> | |
| wide & | operator>>= (wide &w, S s) noexcept |
| Performs the compound right-shift on all the eve::wide lanes and assign the result to current one. | |
| template<std::ptrdiff_t V> | |
| wide & | operator>>= (wide &w, index_t< V > const &s) noexcept |
| Performs the compound right-shift on all the eve::wide lanes and assign the result to current one. | |
| template<integral_value S> | |
| wide | operator>> (wide w, S s) noexcept |
| Performs the right-shift between all lanes of a eve::wide and an integral scalar. | |
| template<std::ptrdiff_t V> | |
| auto | operator>> (wide w, index_t< V > const &s) noexcept |
| Performs the right-shift between all lanes of a eve::wide and an integral constant. | |
| auto | operator== (wide a, wide b) noexcept |
| Element-wise equality comparison of two eve::wide. | |
|
template<scalar_value S> requires requires(S s) { wide {s}; } | |
| auto | operator== (wide w, S s) noexcept |
| Element-wise equality comparison of a eve::wide and a scalar value. | |
|
template<scalar_value S> requires requires(S s) { wide {s}; } | |
| auto | operator== (S s, wide w) noexcept |
| Element-wise equality comparison of a scalar value and a eve::wide. | |
| auto | operator!= (wide a, wide b) noexcept |
| Element-wise inequality comparison of two eve::wide. | |
|
template<scalar_value S> requires requires(S s) { wide {s}; } | |
| auto | operator!= (wide w, S s) noexcept |
| Element-wise inequality comparison of a eve::wide and a scalar value. | |
|
template<scalar_value S> requires requires(S s) { wide {s}; } | |
| auto | operator!= (S s, wide w) noexcept |
| Element-wise inequality comparison of a scalar value and a eve::wide. | |
| auto | operator< (wide a, wide b) noexcept |
| Element-wise less-than comparison between eve::wide. | |
| template<scalar_value S> | |
| auto | operator< (wide w, S s) noexcept |
| Element-wise less-than comparison between a eve::wide and a scalar. | |
| template<scalar_value S> | |
| auto | operator< (S s, wide w) noexcept |
| Element-wise less-than comparison between a scalar and a eve::wide. | |
| auto | operator> (wide a, wide b) noexcept |
| Element-wise greater-than comparison between eve::wide. | |
| template<scalar_value S> | |
| auto | operator> (wide w, S s) noexcept |
| Element-wise greater-than comparison between a eve::wide and a scalar. | |
| template<scalar_value S> | |
| auto | operator> (S s, wide w) noexcept |
| Element-wise greater-than comparison between a scalar and a eve::wide. | |
| auto | operator>= (wide a, wide b) noexcept |
| Element-wise greater-or-equal comparison between eve::wide. | |
| template<scalar_value S> | |
| auto | operator>= (wide w, S s) noexcept |
| Element-wise greater-or-equal comparison between a eve::wide and a scalar. | |
| template<scalar_value S> | |
| auto | operator>= (S s, wide w) noexcept |
| Element-wise greater-or-equal comparison between a scalar and a eve::wide. | |
| auto | operator<= (wide a, wide b) noexcept |
| Element-wise less-or-equal comparison between eve::wide. | |
| template<scalar_value S> | |
| auto | operator<= (wide w, S s) noexcept |
| Element-wise less-or-equal comparison between a eve::wide and a scalar. | |
| template<scalar_value S> | |
| auto | operator<= (S s, wide w) noexcept |
| Element-wise less-or-equal comparison between a scalar and a eve::wide. | |
| logical< wide > | operator! (wide v) noexcept |
| Computes the logical negation of its parameter. | |
| std::ostream & | operator<< (std::ostream &os, wide p) |
| Inserts a eve::wide into a output stream. | |