Vc  1.3.0
SIMD Vector Classes for C++
vector.h
1 /* This file is part of the Vc library. {{{
2 Copyright © 2015 Matthias Kretz <kretz@kde.org>
3 
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are met:
6  * Redistributions of source code must retain the above copyright
7  notice, this list of conditions and the following disclaimer.
8  * Redistributions in binary form must reproduce the above copyright
9  notice, this list of conditions and the following disclaimer in the
10  documentation and/or other materials provided with the distribution.
11  * Neither the names of contributing organizations nor the
12  names of its contributors may be used to endorse or promote products
13  derived from this software without specific prior written permission.
14 
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
19 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 
26 }}}*/
27 
28 #ifndef VC_COMMON_VECTOR_H_
29 #define VC_COMMON_VECTOR_H_
30 
31 #include <ratio>
32 #include "elementreference.h"
33 #include "types.h"
34 #include "vectorabi.h"
35 #include "vectortraits.h"
36 #include "simdarrayfwd.h"
37 #include "loadstoreflags.h"
38 #include "writemaskedvector.h"
39 
40 namespace Vc_VERSIONED_NAMESPACE
41 {
53 template <typename T, typename Abi,
54  typename = enable_if<std::is_floating_point<T>::value>>
56 
90 template <typename T, typename Abi,
91  typename = enable_if<std::is_floating_point<T>::value>>
93 
101 template <typename T, typename Abi>
102 Vc_INTRINSIC Vc_CONST typename Vector<T, Abi>::MaskType isnegative(Vector<T, Abi> x)
103 {
104  return x < Vector<T, Abi>::Zero();
105 }
106 
121 template<typename T, typename Abi = VectorAbi::Best<T>> class Vector
122 {
123 public:
138  static constexpr size_t size() { return VectorTraits<T, Abi>::size(); }
139 
144  static constexpr size_t MemoryAlignment = VectorTraits<T, Abi>::memoryAlignment();
145 
147  using abi = Abi;
148 
150  using EntryType = typename VectorTraits<T, Abi>::EntryType;
153 
154  using VectorEntryType = typename VectorTraits<T, Abi>::VectorEntryType;
158  using VectorType = typename VectorTraits<T, Abi>::VectorType;
162  using vector_type = VectorType;
163 
168 
169  using MaskArgument = MaskType;
170  using VectorArgument = Vector;
171 
176 
177  using reference = Detail::ElementReference<Vector>;
178 
184  static inline Vector Zero();
185 
189  static inline Vector One();
190 
194  static inline Vector IndexesFromZero();
195 
209  static inline Vector Random();
210 
212  template <typename G> static inline Vector generate(G gen);
214 
217 
226  inline Vector() = default;
227 
233  explicit inline Vector(VectorSpecialInitializerZero);
234 
240  explicit inline Vector(VectorSpecialInitializerOne);
241 
247  explicit inline Vector(VectorSpecialInitializerIndexesFromZero);
249 
252 
255  template <typename U>
256  inline Vector(Vector<U, abi> x,
257  enable_if<Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
258 
259 #if Vc_IS_VERSION_1
270  template <typename U>
271  Vc_DEPRECATED("use simd_cast instead of explicit type casting to convert between "
272  "vector types") inline explicit Vector(
273  Vector<U, abi> x,
274  enable_if<!Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
275 #endif
276 
284  inline Vector(EntryType a);
285  template <typename U>
286  inline Vector(U a, enable_if<std::is_same<U, int>::value &&
287  !std::is_same<U, EntryType>::value> = nullarg);
289 
293 #include "../common/loadinterface.h"
295 #include "../common/storeinterface.h"
297 
301  inline void setZero();
302 
310  inline void setZero(MaskType mask);
311 
319  inline void setZeroInverted(MaskType mask);
320 
324  inline void setQnan();
325 
331  inline void setQnan(MaskType mask);
332 
333 #define Vc_CURRENT_CLASS_NAME Vector
334 #include "../common/gatherinterface.h"
335 #include "../common/scatterinterface.h"
336 #undef Vc_CURRENT_CLASS_NAME
337 
340 
352  inline reference operator[](size_t index) noexcept;
361  inline EntryType operator[](size_t index) const noexcept;
363 
366 
371  inline MaskType operator!() const;
372 
380  inline Vector operator~() const;
381 
383  inline Vector operator-() const;
385  inline Vector operator+() const;
398  inline Vector &operator++(); // prefix
400  inline Vector operator++(int); // postfix
401  inline Vector &operator--(); // prefix
402  inline Vector operator--(int); // postfix
404 
405 #define Vc_OP(symbol) \
406  inline Vc_PURE Vector operator symbol(const Vector &x) const;
407 
432  Vc_ALL_ARITHMETICS(Vc_OP);
435 
454  Vc_ALL_BINARY(Vc_OP);
457 
475  Vc_ALL_SHIFTS(Vc_OP);
478 #undef Vc_OP
479 
497 #define Vc_CMP_OP(symbol) inline Vc_PURE MaskType operator symbol(const Vector &x) const;
499  Vc_ALL_COMPARES(Vc_CMP_OP);
500 #undef Vc_CMP_OP
501 
522  inline Common::WriteMaskedVector<Vector, MaskType> operator()(MaskType mask);
523 
538 
541  inline EntryType min() const;
543  inline EntryType max() const;
545  inline EntryType product() const;
547  inline EntryType sum() const;
549  inline Vector partialSum() const;
551  inline EntryType min(MaskType mask) const;
553  inline EntryType max(MaskType mask) const;
555  inline EntryType product(MaskType mask) const;
557  inline EntryType sum(MaskType mask) const;
559 
601 
604  inline Vector shifted(int amount) const;
627  inline Vector shifted(int amount, Vector shiftIn) const;
629  inline Vector rotated(int amount) const;
631  inline Vector reversed() const;
633 
664  inline Vector sorted() const;
665 
694 
697  template <typename F> void callWithValuesSorted(F &&f);
699  template <typename F> inline void call(F &&f) const;
701  template <typename F> inline void call(F &&f, MaskType mask) const;
702 
704  template <typename F> inline Vector apply(F &&f) const;
706  template <typename F> inline Vector apply(F &&f, MaskType mask) const;
707 
709  template <typename IndexT> inline void fill(EntryType(&f)(IndexT));
711  inline void fill(EntryType(&f)());
713 
718  inline Vector interleaveLow(Vector x) const;
723  inline Vector interleaveHigh(Vector x) const;
724 
728  inline void assign(const Vector &v, const MaskType &m);
729 
735  inline VectorType &data();
737  inline const VectorType &data() const;
739 
742 
750  Vc_DEPRECATED("use exponent(x) instead") inline Vector exponent() const;
751 
759  Vc_DEPRECATED("use isnegative(x) instead") inline MaskType isNegative() const;
760 
763  static constexpr size_t Size = VectorTraits<T, Abi>::size();
764 
772  template <typename V2> inline V2 staticCast() const;
773 
781  template <typename V2>
782  Vc_DEPRECATED("use reinterpret_components_cast instead") inline V2
783  reinterpretCast() const;
784 
795  Vc_DEPRECATED("use copysign(x, y) instead") inline Vector
796  copySign(Vector reference) const;
798 
799  Vc_FREE_STORE_OPERATORS_ALIGNED(alignof(Vector));
800 
801 private:
802  VectorType d;
803 };
804 
823 template <typename V, typename T, typename Abi>
824 Vc_ALWAYS_INLINE Vc_CONST enable_if<
825  (V::size() == Vector<T, Abi>::size() &&
826  sizeof(typename V::VectorEntryType) ==
827  sizeof(typename Vector<T, Abi>::VectorEntryType) &&
828  sizeof(V) == sizeof(Vector<T, Abi>) && alignof(V) <= alignof(Vector<T, Abi>)),
829  V>
830 reinterpret_components_cast(const Vector<T, Abi> &x)
831 {
832  return reinterpret_cast<const V &>(x);
833 }
834 
835 #define Vc_OP(symbol) \
836  template <typename T, typename Abi> \
837  inline Vector<T, Abi> &operator symbol##=(Vector<T, Abi> &, \
838  const Vector<T, Abi> &x);
839  //Vc_ALL_ARITHMETICS(Vc_OP);
840  //Vc_ALL_BINARY(Vc_OP);
841  //Vc_ALL_SHIFTS(Vc_OP);
842 #undef Vc_OP
843 
844 } // namespace Vc
845 
846 #endif // VC_COMMON_VECTOR_H_
847 
848 // vim: foldmethod=marker
static constexpr size_t size()
Returns the number of scalar components ( ) in a vector of this type.
Definition: vector.h:138
The main vector class for expressing data parallelism.
Definition: types.h:44
constexpr VectorSpecialInitializerIndexesFromZero IndexesFromZero
The special object Vc::IndexesFromZero can be used to construct Vector objects initialized to values ...
Definition: types.h:94
Vc::Vector< T > min(const Vc::Vector< T > &x, const Vc::Vector< T > &y)
result_vector_type< L, R > operator-(L &&lhs, R &&rhs)
Applies - component-wise and concurrently.
Definition: simdarray.h:1603
Vc::Vector< T > max(const Vc::Vector< T > &x, const Vc::Vector< T > &y)
Data-parallel arithmetic type with user-defined number of elements.
Definition: simdarray.h:559
Abi abi
The ABI tag type of the current template instantiation.
Definition: vector.h:147
Vector< T, Abi > exponent(Vector< T, Abi > x)
Extracts the exponent of each floating-point vector component.
enable_if< (V::size()==Vector< T, Abi >::size()&&sizeof(typename V::VectorEntryType)==sizeof(typename Vector< T, Abi >::VectorEntryType)&&sizeof(V)==sizeof(Vector< T, Abi >)&&alignof(V)<=alignof(Vector< T, Abi >)), V > reinterpret_components_cast(const Vector< T, Abi > &x)
Constructs a new Vector object of type V from the Vector x, reinterpreting the bits of x for the new ...
Definition: vector.h:830
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently.
Definition: simdarray.h:1603
static constexpr std::size_t size()
Returns N, the number of scalar components in an object of this type.
Definition: simdarray.h:612
Vector< T, Abi > copysign(Vector< T, Abi > magnitude, Vector< T, Abi > sign)
Copies the sign(s) of sign to the value(s) in magnitude and returns the resulting vector...
EntryType value_type
The type of the entries in the vector.
Definition: vector.h:152
void assign(Adapter< S, T, N > &a, size_t i, const S &x)
Assigns one scalar object x to a SIMD slot at offset i in the simdized object a.
Definition: simdize.h:1008
Vector< T, Abi >::MaskType isnegative(Vector< T, Abi > x)
Returns for each vector component whether it stores a negative value.
Definition: vector.h:102
The main SIMD mask class.
Definition: mask.h:41
constexpr VectorSpecialInitializerZero Zero
The special object Vc::Zero can be used to construct Vector and Mask objects initialized to zero/fals...
Definition: types.h:84
Adapter< S, T, N > shifted(const Adapter< S, T, N > &a, int shift)
Returns a new vectorized object where each entry is shifted by shift.
Definition: simdize.h:1069
constexpr VectorSpecialInitializerOne One
The special object Vc::One can be used to construct Vector and Mask objects initialized to one/true...
Definition: types.h:89
Vector(const S1 *array, const S2 S1::*member1, const EntryType S2::*member2, IT indexes)
Definition: vector.h:286
constexpr std::size_t MemoryAlignment
Specifies the most conservative memory alignment necessary for aligned loads and stores of Vector typ...
Definition: vector.h:218
typename VectorTraits< T, Abi >::EntryType EntryType
The type of the entries in the vector.
Definition: vector.h:150