VCTR
Loading...
Searching...
No Matches
Abs.h
1/*
2 ==============================================================================
3 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
5 Copyright 2022- by sonible GmbH.
6
7 This file is part of VCTR - Versatile Container Templates Reconceptualized.
8
9 VCTR is free software: you can redistribute it and/or modify
10 it under the terms of the GNU Lesser General Public License version 3
11 only, as published by the Free Software Foundation.
12
13 VCTR is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU Lesser General Public License version 3 for more details.
17
18 You should have received a copy of the GNU Lesser General Public License
19 version 3 along with VCTR. If not, see <https://www.gnu.org/licenses/>.
20 ==============================================================================
21*/
22
23namespace vctr::expressions
24{
25
26template <size_t extent, class SrcType>
28{
29public:
30 using value_type = RealType<ValueType<SrcType>>;
31
32 VCTR_COMMON_UNARY_EXPRESSION_MEMBERS (Abs, src)
33
34 VCTR_FORCEDINLINE constexpr value_type operator[] (size_t i) const
36 {
37 auto value = src[i];
38
39 if (std::is_constant_evaluated())
40 {
42 return gcem::abs (value);
43 else
44 return gcem::sqrt (value.real() * value.real() + value.imag() * value.imag());
45 }
46
47 return std::abs (value);
48 }
49
50 VCTR_FORCEDINLINE constexpr value_type operator[] (size_t i) const
52 {
53 return src[i];
54 }
55
56 // clang-format off
57 VCTR_FORCEDINLINE const value_type* evalNextVectorOpInExpressionChain (value_type* dst) const
58 requires is::suitableForAccelerateRealFloatVectorOp <SrcType, value_type, detail::dontPreferIfIppAndAccelerateAreAvailable> ||
60 // clang-format on
61 {
62 Expression::Accelerate::abs (src.evalNextVectorOpInExpressionChain (dst), dst, size());
63 return dst;
64 }
65
66 // clang-format off
67 VCTR_FORCEDINLINE const value_type* evalNextVectorOpInExpressionChain (value_type* dst) const
68 requires is::suitableForIppRealSingedInt32VectorOp <SrcType, value_type, detail::preferIfIppAndAccelerateAreAvailable> ||
69 is::suitableForIppRealFloatVectorOp <SrcType, value_type, detail::preferIfIppAndAccelerateAreAvailable> ||
71 // clang-format on
72 {
73 Expression::IPP::abs (src.evalNextVectorOpInExpressionChain (dst), dst, sizeToInt (size()));
74 return dst;
75 }
76
77 //==============================================================================
78 VCTR_FORWARD_PREPARE_SIMD_EVALUATION_UNARY_EXPRESSION_MEMBER_FUNCTIONS
79
80 NeonRegister<value_type> getNeon (size_t i) const
81 requires (archARM && has::getNeon<SrcType> && Expression::CommonElement::isSigned)
82 {
83 return Expression::Neon::abs (src.getNeon (i));
84 }
85
86 NeonRegister<value_type> getNeon (size_t i) const
87 requires (archARM && has::getNeon<SrcType> && ! Expression::CommonElement::isSigned)
88 {
89 return src.getNeon (i); // unsigned integers are always positive
90 }
91
92 // AVX Implementation
93 VCTR_FORCEDINLINE VCTR_TARGET ("fma") AVXRegister<value_type> getAVX (size_t i) const
94 requires (archX64 && has::getAVX<SrcType> && Expression::CommonElement::isRealFloat)
95 {
96 static const auto avxSignBit = Expression::AVX::broadcast (typename Expression::CommonElement::Type (-0.0));
97
98 return Expression::AVX::bitwiseAndNot (src.getAVX (i), avxSignBit);
99 }
100
101 VCTR_FORCEDINLINE VCTR_TARGET ("avx2") AVXRegister<value_type> getAVX (size_t i) const
102 requires (archX64 && has::getAVX<SrcType> && Expression::CommonElement::isInt32)
103 {
104 return Expression::AVX::abs (src.getAVX (i));
105 }
106
107 VCTR_FORCEDINLINE VCTR_TARGET ("avx2") AVXRegister<value_type> getAVX (size_t i) const
108 requires (archX64 && has::getAVX<SrcType> && Expression::CommonElement::isUnsigned)
109 {
110 return src.getAVX (i); // unsigned integers are always positive
111 }
112
113 // SSE Implementation
114 VCTR_FORCEDINLINE VCTR_TARGET ("sse4.1") SSERegister<value_type> getSSE (size_t i) const
115 requires (archX64 && has::getSSE<SrcType> && Expression::CommonElement::isRealFloat)
116 {
117 static const auto sseSignBit = Expression::SSE::broadcast (typename Expression::CommonElement::Type (-0.0));
118
119 return Expression::SSE::bitwiseAndNot (src.getSSE (i), sseSignBit);
120 }
121
122 VCTR_FORCEDINLINE VCTR_TARGET ("sse4.1") SSERegister<value_type> getSSE (size_t i) const
123 requires (archX64 && has::getSSE<SrcType> && Expression::CommonElement::isInt32)
124 {
125 return Expression::SSE::abs (src.getSSE (i));
126 }
127
128 VCTR_FORCEDINLINE VCTR_TARGET ("sse4.1") SSERegister<value_type> getSSE (size_t i) const
129 requires (archX64 && has::getSSE<SrcType> && Expression::CommonElement::isUnsigned)
130 {
131 return src.getSSE (i); // unsigned integers are always positive
132 }
133};
134
135} // namespace vctr::expressions
136
137namespace vctr
138{
146
147} // namespace vctr
Definition: Abs.h:28
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 represent a real valued number.
Definition: NumericTypeConcepts.h:79
Constrains a type to represent a real valued signed number (e.g.
Definition: NumericTypeConcepts.h:65
A combined concept to check if Apple Accelerate is a suitable option for a floating point vector oper...
Definition: ContainerAndExpressionConcepts.h:303
A combined concept to check if Intel IPP is a suitable option for a floating point vector operation t...
Definition: ContainerAndExpressionConcepts.h:331
Constrains a type to represent a real valued unsigned integer number.
Definition: NumericTypeConcepts.h:74
constexpr ExpressionChainBuilder< expressions::Abs > abs
Computes the absolute value of the source values.
Definition: Abs.h:145
The main namespace of the VCTR project.
Definition: Array.h:24
typename detail::RealType< std::remove_cvref_t< T > >::Type RealType
If T is any instance of std::complex, this will be the real value_type, otherwise this will be T.
Definition: Traits.h:211
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:170
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: NeonRegister.h:28
Definition: SSERegister.h:28