File indexing completed on 2025-01-31 10:25:42
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef VC_SCALAR_OPERATORS_H_
0029 #define VC_SCALAR_OPERATORS_H_
0030
0031 #include "macros.h"
0032
0033 namespace Vc_VERSIONED_NAMESPACE
0034 {
0035 namespace Detail
0036 {
0037
0038 #define Vc_OP(op_) \
0039 template <typename T> \
0040 Vc_INTRINSIC Scalar::Mask<T> operator op_(Scalar::Vector<T> a, Scalar::Vector<T> b) \
0041 { \
0042 return Scalar::Mask<T>(a.data() op_ b.data()); \
0043 }
0044 Vc_ALL_COMPARES(Vc_OP);
0045 #undef Vc_OP
0046
0047
0048 #define Vc_OP(symbol) \
0049 template <typename T> \
0050 Vc_INTRINSIC enable_if<std::is_integral<T>::value, Scalar::Vector<T>> \
0051 operator symbol(Scalar::Vector<T> a, Scalar::Vector<T> b) \
0052 { \
0053 return a.data() symbol b.data(); \
0054 } \
0055 template <typename T> \
0056 Vc_INTRINSIC enable_if<std::is_floating_point<T>::value, Scalar::Vector<T>> \
0057 operator symbol(Scalar::Vector<T> &lhs, Scalar::Vector<T> rhs) \
0058 { \
0059 using uinta = \
0060 MayAlias<typename std::conditional<sizeof(T) == sizeof(int), unsigned int, \
0061 unsigned long long>::type>; \
0062 uinta *left = reinterpret_cast<uinta *>(&lhs.data()); \
0063 const uinta *right = reinterpret_cast<const uinta *>(&rhs.data()); \
0064 *left symbol## = *right; \
0065 return lhs; \
0066 }
0067 Vc_ALL_BINARY(Vc_OP);
0068 #undef Vc_OP
0069
0070
0071 template <typename T>
0072 Vc_INTRINSIC Scalar::Vector<T> operator+(Scalar::Vector<T> a, Scalar::Vector<T> b)
0073 {
0074 return a.data() + b.data();
0075 }
0076 template <typename T>
0077 Vc_INTRINSIC Scalar::Vector<T> operator-(Scalar::Vector<T> a, Scalar::Vector<T> b)
0078 {
0079 return a.data() - b.data();
0080 }
0081 template <typename T>
0082 Vc_INTRINSIC Scalar::Vector<T> operator*(Scalar::Vector<T> a, Scalar::Vector<T> b)
0083 {
0084 return a.data() * b.data();
0085 }
0086 template <typename T>
0087 Vc_INTRINSIC Scalar::Vector<T> operator/(Scalar::Vector<T> a, Scalar::Vector<T> b)
0088 {
0089 return a.data() / b.data();
0090 }
0091 template <typename T>
0092 Vc_INTRINSIC Scalar::Vector<T> operator%(Scalar::Vector<T> a, Scalar::Vector<T> b)
0093 {
0094 return a.data() % b.data();
0095 }
0096
0097 }
0098 }
0099
0100 #endif
0101
0102