23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
37 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
SubtractVectors, 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::sub (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
51 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
54 Expression::IPP::sub (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::sub (srcA.getAVX (i), srcB.getAVX (i));
71 return Expression::AVX::sub (srcA.getAVX (i), srcB.getAVX (i));
78 return Expression::SSE::sub (srcA.getSSE (i), srcB.getSSE (i));
85 return Expression::Neon::sub (srcA.getNeon (i), srcB.getNeon (i));
91template <
size_t extent,
class SrcType>
99 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
101 return single - src[i];
104 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
107 auto fac = value_type (-1);
108 Expression::Accelerate::multiplyAdd (src.evalNextVectorOpInExpressionChain (dst), fac, single, dst, size());
112 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
115 Expression::IPP::sub (single, src.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
121 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
124 src.prepareAVXEvaluation();
125 singleSIMD.avx = Expression::AVX::broadcast (single);
129 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
131 return Expression::AVX::sub (singleSIMD.avx, src.getAVX (i));
135 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isInt)
137 return Expression::AVX::sub (singleSIMD.avx, src.getAVX (i));
141 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
144 src.prepareSSEEvaluation();
145 singleSIMD.sse = Expression::SSE::broadcast (single);
151 return Expression::SSE::sub (singleSIMD.sse, src.getSSE (i));
155 void prepareNeonEvaluation()
const
158 src.prepareNeonEvaluation();
159 singleSIMD.neon = Expression::Neon::broadcast (single);
165 return Expression::Neon::sub (singleSIMD.neon, src.getNeon (i));
174template <
size_t extent,
class SrcType>
182 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
184 return src[i] - single;
187 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
190 Expression::Accelerate::add (src.evalNextVectorOpInExpressionChain (dst), -single, dst, size());
194 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
197 Expression::IPP::sub (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
202 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
205 src.prepareAVXEvaluation();
206 singleSIMD.avx = Expression::AVX::broadcast (single);
209 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
212 src.prepareSSEEvaluation();
213 singleSIMD.sse = Expression::SSE::broadcast (single);
216 void prepareNeonEvaluation()
const
219 src.prepareNeonEvaluation();
220 singleSIMD.neon = Expression::Neon::broadcast (single);
225 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
227 return Expression::AVX::sub (src.getAVX (i), singleSIMD.avx);
231 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isInt)
233 return Expression::AVX::sub (src.getAVX (i), singleSIMD.avx);
240 return Expression::SSE::sub (src.getSSE (i), singleSIMD.sse);
247 return Expression::Neon::sub (src.getNeon (i), singleSIMD.neon);
263template <
class SrcAType,
class SrcBType>
266constexpr auto operator- (SrcAType&& a, SrcBType&& b)
269 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
279requires is::anyVctrOrExpression<Src>
280constexpr auto operator- (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
290requires is::anyVctrOrExpression<Src>
291constexpr auto operator- (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
Subtracts a single value from a vector like type.
Definition: Subtract.h:176
Subtracts a vector like type from a single value.
Definition: Subtract.h:93
Subtracts two vector like types.
Definition: Subtract.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 prepareNeonEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:80
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:321
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: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 auto operator-(SrcAType &&a, SrcBType &&b)
Returns an expression that subtracts vector or expression b from vector or expression a.
Definition: Subtract.h:266
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: NeonRegister.h:28
Definition: SSERegister.h:28
Helper template to define a union of all supported SIMD types.
Definition: ExpressionTemplate.h:123