23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
34 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
SubtractVectors, srcA, srcB)
36 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
38 return srcA[i] - srcB[i];
41 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
44 Expression::Accelerate::sub (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
48 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
51 Expression::IPP::sub (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
60 return Expression::AVX::sub (srcA.getAVX (i), srcB.getAVX (i));
66 return Expression::AVX::sub (srcA.getAVX (i), srcB.getAVX (i));
74 return Expression::SSE::sub (srcA.getSSE (i), srcB.getSSE (i));
82 return Expression::Neon::sub (srcA.getNeon (i), srcB.getNeon (i));
88template <
size_t extent,
class SrcType>
96 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
98 return single - src[i];
101 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
104 auto fac = value_type (-1);
105 Expression::Accelerate::multiplyAdd (src.evalNextVectorOpInExpressionChain (dst), fac, single, dst, size());
109 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
112 Expression::IPP::sub (single, src.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
119 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
121 return Expression::AVX::sub (Expression::AVX::fromSSE (singleAsSSE, singleAsSSE), src.getAVX (i));
125 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isInt)
127 return Expression::AVX::sub (Expression::AVX::fromSSE (singleAsSSE, singleAsSSE), src.getAVX (i));
134 return Expression::SSE::sub (singleAsSSE, src.getSSE (i));
142 return Expression::Neon::sub (singleAsNeon, src.getNeon (i));
148template <
size_t extent,
class SrcType>
156 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
158 return src[i] - single;
161 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
164 Expression::Accelerate::add (src.evalNextVectorOpInExpressionChain (dst), -single, dst, size());
168 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
171 Expression::IPP::sub (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
178 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
180 return Expression::AVX::sub (src.getAVX (i), Expression::AVX::fromSSE (singleAsSSE, singleAsSSE));
184 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isInt)
186 return Expression::AVX::sub (src.getAVX (i), Expression::AVX::fromSSE (singleAsSSE, singleAsSSE));
193 return Expression::SSE::sub (src.getSSE (i), singleAsSSE);
201 return Expression::Neon::sub (src.getNeon (i), singleAsNeon);
214template <
class SrcAType,
class SrcBType>
217constexpr auto operator- (SrcAType&& a, SrcBType&& b)
220 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
230requires is::anyVctrOrExpression<Src>
231constexpr auto operator- (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
241requires is::anyVctrOrExpression<Src>
242constexpr 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:150
Subtracts a vector like type from a single value.
Definition: Subtract.h:90
Subtracts two vector like types.
Definition: Subtract.h:30
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:78
Constrains a type to have a member function getNeon (size_t) const.
Definition: ContainerAndExpressionConcepts.h:74
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:82
Constrains a type to either be an expression template or any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:212
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:303
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:242
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:250
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:324
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:278
constexpr auto operator-(SrcAType &&a, SrcBType &&b)
Returns an expression that subtracts vector or expression b from vector or expression a.
Definition: Subtract.h:217
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:253
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
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