15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_ATAN2PACK_H__ 16 #define __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_ATAN2PACK_H__ 21 #include <IPSDKUtil/InstructionSet/Arithmetic/detail/Atan2Reg.h> 26 #include <boost/type_traits/is_float.hpp> 41 template <eInstructionSet::domain instructionSet,
typename T,
50 typename boost::enable_if<boost::is_float<T> >::type>
75 template <eInstructionSet::domain IS,
typename T>
76 struct Atan2Pack<IS, T,
77 typename
boost::enable_if<boost::is_float<T> >::type>
86 act(yPack, xPack, outPack);
94 act(
const typename IS2Pack<IS, T>::Type& yPack,
95 const typename IS2Pack<IS, T>::Type& xPack,
96 typename IS2Pack<IS, T>::Type& outPack)
99 typedef typename IS2Pack<IS, T>::Type PackT;
100 typedef typename IS2MaskPack<IS, T>::Type MaskPackT;
101 const T epsilon = NumericLimits<T>::sqrt_epsilon();
102 PackT cste0Pack, csteEpsilonPack, cste1Pack, cstePiPack, csteMPiPack, cstePiD2Pack, csteMPiD2Pack;
103 simd::assign<IS>(cste0Pack, 0);
104 simd::assign<IS>(csteEpsilonPack, epsilon);
105 simd::assign<IS>(cste1Pack, 1);
106 simd::assign<IS>(cstePiPack,
static_cast<T
>(M_PI));
107 simd::assign<IS>(csteMPiPack, -
static_cast<T
>(M_PI));
108 simd::assign<IS>(cstePiD2Pack,
static_cast<T
>(M_PI_2));
109 simd::assign<IS>(csteMPiD2Pack, -
static_cast<T
>(M_PI_2));
112 PackT absXPack, absYPack;
113 simd::abs<IS>(xPack, absXPack);
114 simd::abs<IS>(yPack, absYPack);
117 MaskPackT testAbsXEpsilonPack, testAbsYEpsilonPack, testX0Pack, testY0Pack;
118 simd::isGreater<IS>(absXPack, csteEpsilonPack, testAbsXEpsilonPack);
119 simd::isGreater<IS>(absYPack, csteEpsilonPack, testAbsYEpsilonPack);
120 simd::isGreater<IS>(xPack, cste0Pack, testX0Pack);
121 simd::isGreater<IS>(yPack, cste0Pack, testY0Pack);
124 PackT usedValuePack, resValuePack;
125 simd::ifElse<IS>(testAbsXEpsilonPack, xPack, cste1Pack, usedValuePack);
126 simd::div<IS>(yPack, usedValuePack, usedValuePack);
127 resValuePack = simd::atan<IS>(usedValuePack);
131 simd::ifElse<IS>(testY0Pack, cstePiPack, csteMPiPack, wPack);
132 simd::ifElse<IS>(testX0Pack, cste0Pack, wPack, wPack);
133 simd::add<IS>(resValuePack, wPack, resValuePack);
137 simd::ifElse<IS>(testY0Pack, cstePiD2Pack, csteMPiD2Pack, ePack);
138 simd::ifElse<IS>(testAbsYEpsilonPack, ePack, cste0Pack, ePack);
139 simd::ifElse<IS>(testAbsXEpsilonPack, resValuePack, ePack, outPack);
152 #endif // __IPSDKUTIL_INSTRUCTIONSET_ARITHMETIC_DETAIL_ATAN2PACK_H__ Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: Atan2Pack.h:43
structure used to retrieve pack type from enumerate instruction set value and data type ...
Definition: DataItemNodeHdrMacrosDetails.h:48
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Predefined types associated to instruction set management.
atan function; returns the calculation of the arctan function on all the elements of one input pack o...
Definition of import/export macro for library.
Atan2Reg template specialization for instruction set Standard.
Definition: Atan2Reg.h:31
compiler optimisations only
Definition: InstructionSetTypes.h:34
Definition: BinaryPackOp.h:31