23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
37 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
AddVectors, srcA, srcB)
39 VCTR_FORCEDINLINE
constexpr auto operator[] (
size_t i)
const
41 return srcA[i] + srcB[i];
44 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
47 Expression::Accelerate::add (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
51 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
54 Expression::IPP::add (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
59 VCTR_FORWARD_PREPARE_SIMD_EVALUATION_BINARY_EXPRESSION_MEMBER_FUNCTIONS (srcA, srcB)
65 return Expression::AVX::add (srcA.getAVX (i), srcB.getAVX (i));
71 return Expression::AVX::add (srcA.getAVX (i), srcB.getAVX (i));
79 return Expression::SSE::add (srcA.getSSE (i), srcB.getSSE (i));
87 return Expression::Neon::add (srcA.getNeon (i), srcB.getNeon (i));
93template <
size_t extent,
class SrcType>
99 VCTR_COMMON_BINARY_SINGLE_VEC_EXPRESSION_MEMBERS (
AddSingleToVec, src, single)
101 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
103 return single + src[i];
106 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
109 Expression::Accelerate::add (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
113 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
116 Expression::IPP::add (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
122 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
125 src.prepareAVXEvaluation();
126 singleSIMD.avx = Expression::AVX::broadcast (single);
130 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
132 return Expression::AVX::add (singleSIMD.avx, src.getAVX (i));
136 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isInt)
138 return Expression::AVX::add (singleSIMD.avx, src.getAVX (i));
142 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
145 src.prepareSSEEvaluation();
146 singleSIMD.sse = Expression::SSE::broadcast (single);
152 return Expression::SSE::add (singleSIMD.sse, src.getSSE (i));
161template <
size_t extent,
class SrcType, is::constant ConstantType>
167 static constexpr auto constant = value_type (ConstantType::value);
171 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
173 return constant + src[i];
176 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
179 Expression::Accelerate::add (src.evalNextVectorOpInExpressionChain (dst), constant, dst, size());
183 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
186 Expression::IPP::add (src.evalNextVectorOpInExpressionChain (dst), constant, dst,
sizeToInt (size()));
192 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
195 src.prepareAVXEvaluation();
196 constantSIMD.avx = Expression::AVX::broadcast (constant);
200 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
202 return Expression::AVX::add (constantSIMD.avx, src.getAVX (i));
206 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
209 src.prepareSSEEvaluation();
210 constantSIMD.sse = Expression::SSE::broadcast (constant);
214 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
216 return Expression::SSE::add (constantSIMD.sse, src.getSSE (i));
232template <is::anyVctrOrExpression SrcAType, is::anyVctrOrExpression SrcBType>
236 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
245template <is::anyVctrOrExpression Src>
246constexpr auto operator+ (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
255template <is::anyVctrOrExpression Src>
256constexpr auto operator+ (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
265template <auto constantValue>
Adds a single compile time constant value to a vector like type.
Definition: Add.h:163
Adds a single value to a vector like type.
Definition: Add.h:95
Adds two vector like types.
Definition: Add.h:30
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:92
Constrains a type to have a member function getNeon (size_t) const.
Definition: ContainerAndExpressionConcepts.h:84
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:100
Constrains a type to have a member function prepareAVXEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:88
Constrains a type to have a member function prepareSSEEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:96
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:260
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:329
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:268
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:342
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:296
constexpr ExpressionChainBuilder< expressions::AddConstantToVec, Constant< constantValue > > addConstant
Returns an expression that adds a compile time constant to a vector or expression source.
Definition: Add.h:266
constexpr auto operator+(SrcAType &&a, SrcBType &&b)
Returns an expression that adds two vector or expression sources.
Definition: Add.h:233
The main namespace of the VCTR project.
Definition: Array.h:24
constexpr void assertCommonSize(const A &a, const B &b)
Ensures that both sources have the same size.
Definition: Traits.h:256
typename detail::ValueType< std::remove_cvref_t< T > >::Type ValueType
If T is an expression template, it equals its return type, if it's a type that defines value_type as ...
Definition: Traits.h:201
typename detail::CommonVecExpressionType< A, B, op >::type CommonVecExpressionType
Used to figure out the value_type for binary vector-vector operations.
Definition: ExpressionTemplate.h:177
int sizeToInt(size_t size)
Casts the size_t argument to an int.
Definition: PlatformVectorOpsHelpers.h:27
Definition: AVXRegister.h:28
An expression chain builder is an object which supplies various operator<< overloads which build chai...
Definition: ExpressionChainBuilder.h:157
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: NeonRegister.h:28
Definition: SSERegister.h:28
Helper template to define a union of all supported SIMD types.
Definition: ExpressionTemplate.h:123