29 #ifndef VC_COMMON_TRIGONOMETRIC_H_
30 #define VC_COMMON_TRIGONOMETRIC_H_
34 namespace Vc_VERSIONED_NAMESPACE
38 template<Vc::Implementation Impl>
struct MapImpl {
enum Dummy { Value = Impl }; };
39 template<>
struct MapImpl<
Vc::
SSE42Impl> {
enum Dummy { Value = MapImpl<Vc::SSE41Impl>::Value }; };
41 template<Vc::Implementation Impl>
using TrigonometricImplementation =
42 ImplementationT<MapImpl<Impl>::Value
43 #if defined(Vc_IMPL_XOP) && defined(Vc_IMPL_FMA4)
52 template<
typename Impl>
struct Trigonometric
54 template<
typename T>
static T
sin(
const T &_x);
55 template<
typename T>
static T
cos(
const T &_x);
56 template<
typename T>
static void sincos(
const T &_x, T *_sin, T *_cos);
57 template<
typename T>
static T
asin (
const T &_x);
58 template<
typename T>
static T
atan (
const T &_x);
59 template<
typename T>
static T
atan2(
const T &y,
const T &x);
67 template <
typename T,
typename Abi>
68 using Trig = Common::Trigonometric<Detail::TrigonometricImplementation<
69 (std::is_same<Abi, VectorAbi::Sse>::value
77 template <
typename T,
typename Abi> Vc_INTRINSIC Vector<T, Abi>
atan2(
const Vector<T, Abi> &y,
const Vector<T, Abi> &x) {
return Detail::Trig<T, Abi>::atan2(y, x); }
78 template <
typename T,
typename Abi> Vc_INTRINSIC
void sincos(
const Vector<T, Abi> &x, Vector<T, Abi> *
sin, Vector<T, Abi> *
cos) { Detail::Trig<T, Abi>::sincos(x, sin, cos); }
82 #endif // VC_COMMON_TRIGONOMETRIC_H_
Vc::Vector< T > sin(const Vc::Vector< T > &v)
Vc::Vector< T > cos(const Vc::Vector< T > &v)
Support for XOP instructions.
Vc::Vector< T > atan2(const Vc::Vector< T > &y, const Vc::Vector< T > &x)
Calculates the angle given the lengths of the opposite and adjacent legs in a right triangle...
Vc::Vector< T > atan(const Vc::Vector< T > &v)
Vc::Vector< T > asin(const Vc::Vector< T > &v)
x86 SSE + SSE2 + SSE3 + SSSE3 + SSE4.1 + SSE4.2
Support for FMA4 instructions.
Vector Classes Namespace.
uses only fundamental types