Vc  1.3.2-dev
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 
356  inline reference operator[](size_t index) noexcept;
365  inline EntryType operator[](size_t index) const noexcept;
367 
370 
375  inline MaskType operator!() const;
376 
384  inline Vector operator~() const;
385 
387  inline Vector operator-() const;
389  inline Vector operator+() const;
391 
402  inline Vector &operator++(); // prefix
404  inline Vector operator++(int); // postfix
405  inline Vector &operator--(); // prefix
406  inline Vector operator--(int); // postfix
408 
409 #define Vc_OP(symbol) \
410  inline Vc_PURE Vector operator symbol(const Vector &x) const;
411 
436  Vc_ALL_ARITHMETICS(Vc_OP);
439 
458  Vc_ALL_BINARY(Vc_OP);
461 
479  Vc_ALL_SHIFTS(Vc_OP);
482 #undef Vc_OP
483 
501 #define Vc_CMP_OP(symbol) inline Vc_PURE MaskType operator symbol(const Vector &x) const;
503  Vc_ALL_COMPARES(Vc_CMP_OP);
504 #undef Vc_CMP_OP
505 
526  inline Common::WriteMaskedVector<Vector, MaskType> operator()(MaskType mask);
527 
542 
545  inline EntryType min() const;
547  inline EntryType max() const;
549  inline EntryType product() const;
551  inline EntryType sum() const;
553  inline Vector partialSum() const;
555  inline EntryType min(MaskType mask) const;
557  inline EntryType max(MaskType mask) const;
559  inline EntryType product(MaskType mask) const;
561  inline EntryType sum(MaskType mask) const;
563 
605 
608  inline Vector shifted(int amount) const;
631  inline Vector shifted(int amount, Vector shiftIn) const;
633  inline Vector rotated(int amount) const;
635  inline Vector reversed() const;
637 
668  inline Vector sorted() const;
669 
698 
701  template <typename F> void callWithValuesSorted(F &&f);
703  template <typename F> inline void call(F &&f) const;
705  template <typename F> inline void call(F &&f, MaskType mask) const;
706 
708  template <typename F> inline Vector apply(F &&f) const;
710  template <typename F> inline Vector apply(F &&f, MaskType mask) const;
711 
713  template <typename IndexT> inline void fill(EntryType(&f)(IndexT));
715  inline void fill(EntryType(&f)());
717 
722  inline Vector interleaveLow(Vector x) const;
727  inline Vector interleaveHigh(Vector x) const;
728 
732  inline void assign(const Vector &v, const MaskType &m);
733 
739  inline VectorType &data();
741  inline const VectorType &data() const;
743 
746 
754  Vc_DEPRECATED("use exponent(x) instead") inline Vector exponent() const;
755 
763  Vc_DEPRECATED("use isnegative(x) instead") inline MaskType isNegative() const;
764 
767  static constexpr size_t Size = VectorTraits<T, Abi>::size();
768 
776  template <typename V2> inline V2 staticCast() const;
777 
785  template <typename V2>
786  Vc_DEPRECATED("use reinterpret_components_cast instead") inline V2
787  reinterpretCast() const;
788 
799  Vc_DEPRECATED("use copysign(x, y) instead") inline Vector
800  copySign(Vector reference) const;
802 
803  Vc_FREE_STORE_OPERATORS_ALIGNED(alignof(Vector));
804 
805 private:
806  VectorType d;
807 };
808 
827 template <typename V, typename T, typename Abi>
828 Vc_ALWAYS_INLINE Vc_CONST enable_if<
829  (V::size() == Vector<T, Abi>::size() &&
830  sizeof(typename V::VectorEntryType) ==
831  sizeof(typename Vector<T, Abi>::VectorEntryType) &&
832  sizeof(V) == sizeof(Vector<T, Abi>) && alignof(V) <= alignof(Vector<T, Abi>)),
833  V>
834 reinterpret_components_cast(const Vector<T, Abi> &x)
835 {
836  return reinterpret_cast<const V &>(x);
837 }
838 
839 #define Vc_OP(symbol) \
840  template <typename T, typename Abi> \
841  inline Vector<T, Abi> &operator symbol##=(Vector<T, Abi> &, \
842  const Vector<T, Abi> &x);
843  //Vc_ALL_ARITHMETICS(Vc_OP);
844  //Vc_ALL_BINARY(Vc_OP);
845  //Vc_ALL_SHIFTS(Vc_OP);
846 #undef Vc_OP
847 
848 } // namespace Vc
849 
850 #endif // VC_COMMON_VECTOR_H_
851 
852 // 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:1611
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:565
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:834
result_vector_type< L, R > operator+(L &&lhs, R &&rhs)
Applies + component-wise and concurrently.
Definition: simdarray.h:1611
static constexpr std::size_t size()
Returns N, the number of scalar components in an object of this type.
Definition: simdarray.h:618
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