Vc  1.2.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 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7  * Redistributions of source code must retain the above copyright
8  notice, this list of conditions and the following disclaimer.
9  * Redistributions in binary form must reproduce the above copyright
10  notice, this list of conditions and the following disclaimer in the
11  documentation and/or other materials provided with the distribution.
12  * Neither the names of contributing organizations nor the
13  names of its contributors may be used to endorse or promote products
14  derived from this software without specific prior written permission.
15 
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
20 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 
27 }}}*/
28 
29 #ifndef VC_COMMON_VECTOR_H_
30 #define VC_COMMON_VECTOR_H_
31 
32 #include <ratio>
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 
125 template <typename V, typename T, typename Abi>
126 Vc_ALWAYS_INLINE Vc_CONST enable_if<
127  (V::size() == Vector<T, Abi>::size() &&
128  sizeof(typename V::VectorEntryType) ==
129  sizeof(typename Vector<T, Abi>::VectorEntryType) &&
130  sizeof(V) == sizeof(Vector<T, Abi>) && alignof(V) <= alignof(Vector<T, Abi>)),
131  V>
133 {
134  return reinterpret_cast<const V &>(x);
135 }
136 
151 template<typename T, typename Abi = VectorAbi::Best<T>> class Vector
152 {
153 public:
168  static constexpr size_t size() { return VectorTraits<T, Abi>::size(); }
169 
174  static constexpr size_t MemoryAlignment = VectorTraits<T, Abi>::memoryAlignment();
175 
177  using abi = Abi;
178 
180  using EntryType = typename VectorTraits<T, Abi>::EntryType;
184  using VectorEntryType = typename VectorTraits<T, Abi>::VectorEntryType;
188  using VectorType = typename VectorTraits<T, Abi>::VectorType;
192  using vector_type = VectorType;
198 
199  using MaskArgument = MaskType;
200  using VectorArgument = Vector;
201 
206 
212  static inline Vector Zero();
217  static inline Vector One();
218 
222  static inline Vector IndexesFromZero();
223 
237  static inline Vector Random();
238 
240  template <typename G> static inline Vector generate(G gen);
242 
245 
254  inline Vector() = default;
255 
261  explicit inline Vector(VectorSpecialInitializerZero);
262 
268  explicit inline Vector(VectorSpecialInitializerOne);
269 
275  explicit inline Vector(VectorSpecialInitializerIndexesFromZero);
277 
280 
283  template <typename U>
284  inline Vector(Vector<U, abi> x,
285  enable_if<Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
286 
297  template <typename U>
298  inline explicit Vector(
299  Vector<U, abi> x,
300  enable_if<!Traits::is_implicit_cast_allowed<U, T>::value> = nullarg);
301 
309  inline Vector(EntryType a);
310  template <typename U>
311  inline Vector(U a, enable_if<std::is_same<U, int>::value &&
312  !std::is_same<U, EntryType>::value> = nullarg);
314 
318 #include "../common/loadinterface.h"
320 #include "../common/storeinterface.h"
322 
326  inline void setZero();
327 
335  inline void setZero(MaskType mask);
336 
344  inline void setZeroInverted(MaskType mask);
345 
349  inline void setQnan();
350 
356  inline void setQnan(MaskType mask);
358 #define Vc_CURRENT_CLASS_NAME Vector
359 #include "../common/gatherinterface.h"
360 #include "../common/scatterinterface.h"
361 #undef Vc_CURRENT_CLASS_NAME
362 
365 
377  inline EntryType &operator[](size_t index);
386  inline EntryType operator[](size_t index) const;
388 
391 
396  inline MaskType operator!() const;
397 
405  inline Vector operator~() const;
406 
408  inline Vector operator-() const;
410  inline Vector operator+() const;
412 
423  inline Vector &operator++(); // prefix
425  inline Vector operator++(int); // postfix
426  inline Vector &operator--(); // prefix
427  inline Vector operator--(int); // postfix
429 
430 #define Vc_OP(symbol) \
431  inline Vc_PURE Vector operator symbol(const Vector &x) const;
457  Vc_ALL_ARITHMETICS(Vc_OP);
460 
479  Vc_ALL_BINARY(Vc_OP);
500  Vc_ALL_SHIFTS(Vc_OP);
503 #undef Vc_OP
504 
522 #define Vc_CMP_OP(symbol) inline Vc_PURE MaskType operator symbol(const Vector &x) const;
524  Vc_ALL_COMPARES(Vc_CMP_OP);
525 #undef Vc_CMP_OP
526 
547  inline Common::WriteMaskedVector<Vector, MaskType> operator()(MaskType mask);
548 
563 
566  inline EntryType min() const;
568  inline EntryType max() const;
570  inline EntryType product() const;
572  inline EntryType sum() const;
574  inline Vector partialSum() const;
576  inline EntryType min(MaskType mask) const;
578  inline EntryType max(MaskType mask) const;
580  inline EntryType product(MaskType mask) const;
582  inline EntryType sum(MaskType mask) const;
584 
626 
629  inline Vector shifted(int amount) const;
652  inline Vector shifted(int amount, Vector shiftIn) const;
654  inline Vector rotated(int amount) const;
656  inline Vector reversed() const;
658 
689  inline Vector sorted() const;
690 
719 
722  template <typename F> void callWithValuesSorted(F &&f);
724  template <typename F> inline void call(F &&f) const;
726  template <typename F> inline void call(F &&f, MaskType mask) const;
727 
729  template <typename F> inline Vector apply(F &&f) const;
731  template <typename F> inline Vector apply(F &&f, MaskType mask) const;
732 
734  template <typename IndexT> inline void fill(EntryType(&f)(IndexT));
736  inline void fill(EntryType(&f)());
738 
743  inline Vector interleaveLow(Vector x) const;
748  inline Vector interleaveHigh(Vector x) const;
749 
753  inline void assign(const Vector &v, const MaskType &m);
754 
760  inline VectorType &data();
762  inline const VectorType &data() const;
764 
767 
775  inline Vc_DEPRECATED("use exponent(x) instead") Vector exponent() const;
776 
784  inline Vc_DEPRECATED("use isnegative(x) instead") MaskType isNegative() const;
785 
788  static constexpr size_t Size = VectorTraits<T, Abi>::size();
789 
797  template <typename V2> inline V2 staticCast() const;
798 
806  template <typename V2>
807  inline Vc_DEPRECATED("use reinterpret_components_cast instead") V2
808  reinterpretCast() const;
809 
820  inline Vc_DEPRECATED("use copysign(x, y) instead") Vector
821  copySign(Vector reference) const;
823 
824  Vc_FREE_STORE_OPERATORS_ALIGNED(alignof(Vector));
825 
826 private:
827  VectorType d;
828 };
829 
830 #define Vc_OP(symbol) \
831  template <typename T, typename Abi> \
832  inline Vector<T, Abi> &operator symbol##=(Vector<T, Abi> &, \
833  const Vector<T, Abi> &x);
834  //Vc_ALL_ARITHMETICS(Vc_OP);
835  //Vc_ALL_BINARY(Vc_OP);
836  //Vc_ALL_SHIFTS(Vc_OP);
837 #undef Vc_OP
838 
839 } // namespace Vc
840 
841 #endif // VC_COMMON_VECTOR_H_
842 
843 // vim: foldmethod=marker
static constexpr size_t size()
Returns the number of scalar components ( ) in a vector of this type.
Definition: vector.h:168
The main vector class for expressing data parallelism.
Definition: types.h:45
constexpr VectorSpecialInitializerIndexesFromZero IndexesFromZero
The special object Vc::IndexesFromZero can be used to construct Vector objects initialized to values ...
Definition: types.h:95
Vector(const S1 *array, const S2 S1::*member1, const EntryType S2::*member2, const IT indexes, MaskArgument mask)
Definition: vector.h:311
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:1444
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:506
Abi abi
The ABI tag type of the current template instantiation.
Definition: vector.h:177
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:132
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently.
Definition: simdarray.h:1444
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:182
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:932
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:42
constexpr VectorSpecialInitializerZero Zero
The special object Vc::Zero can be used to construct Vector and Mask objects initialized to zero/fals...
Definition: types.h:85
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:993
constexpr VectorSpecialInitializerOne One
The special object Vc::One can be used to construct Vector and Mask objects initialized to one/true...
Definition: types.h:90
constexpr std::size_t MemoryAlignment
Specifies the most conservative memory alignment necessary for aligned loads and stores of Vector typ...
Definition: vector.h:219
typename VectorTraits< T, Abi >::EntryType EntryType
The type of the entries in the vector.
Definition: vector.h:180