23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
37 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
DivideVectors, srcA, srcB)
39 VCTR_FORCEDINLINE
constexpr value_type 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::div (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
51 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
54 Expression::IPP::div (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::div (srcA.getAVX (i), srcB.getAVX (i));
72 return Expression::SSE::div (srcA.getSSE (i), srcB.getSSE (i));
78template <
size_t extent,
class SrcType>
86 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
88 return single / src[i];
91 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
94 Expression::IPP::div (single, src.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
100 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
103 src.prepareAVXEvaluation();
104 singleSIMD.avx = Expression::AVX::broadcast (single);
108 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
110 return Expression::AVX::div (singleSIMD.avx, src.getAVX (i));
114 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
117 src.prepareSSEEvaluation();
118 singleSIMD.sse = Expression::SSE::broadcast (single);
122 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
124 return Expression::SSE::div (singleSIMD.sse, src.getSSE (i));
133template <
size_t extent,
class SrcType>
139 VCTR_COMMON_BINARY_SINGLE_VEC_EXPRESSION_MEMBERS (
DivideVecBySingle, src, single)
141 VCTR_FORCEDINLINE
constexpr auto operator[] (
size_t i)
const
143 return src[i] / single;
146 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
149 Expression::Accelerate::div (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
153 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
156 Expression::IPP::div (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
162 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
165 src.prepareAVXEvaluation();
166 singleSIMD.avx = Expression::AVX::broadcast (single);
170 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
172 return Expression::AVX::div (src.getAVX (i), singleSIMD.avx);
176 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
179 src.prepareSSEEvaluation();
180 singleSIMD.sse = Expression::SSE::broadcast (single);
184 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
186 return Expression::SSE::div (src.getSSE (i), singleSIMD.sse);
202template <
class SrcAType,
class SrcBType>
205constexpr auto operator/ (SrcAType&& a, SrcBType&& b)
208 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
218requires is::anyVctrOrExpression<Src>
219constexpr auto operator/ (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
229requires is::anyVctrOrExpression<Src>
230constexpr auto operator/ (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
Divides a single value by a vector.
Definition: Divide.h:80
Divides a vector like type by a single value.
Definition: Divide.h:135
Divides two vector like types.
Definition: Divide.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 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
Constrains a type to either be an expression template or any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:230
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 Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:284
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 auto operator/(SrcAType &&a, SrcBType &&b)
Returns an expression that divides vector or expression a by vector or expression b.
Definition: Divide.h:205
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
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: SSERegister.h:28
Helper template to define a union of all supported SIMD types.
Definition: ExpressionTemplate.h:123