11#ifndef EIGEN_GENERIC_PACKET_MATH_H
12#define EIGEN_GENERIC_PACKET_MATH_H
26#ifndef EIGEN_DEBUG_ALIGNED_LOAD
27#define EIGEN_DEBUG_ALIGNED_LOAD
30#ifndef EIGEN_DEBUG_UNALIGNED_LOAD
31#define EIGEN_DEBUG_UNALIGNED_LOAD
34#ifndef EIGEN_DEBUG_ALIGNED_STORE
35#define EIGEN_DEBUG_ALIGNED_STORE
38#ifndef EIGEN_DEBUG_UNALIGNED_STORE
39#define EIGEN_DEBUG_UNALIGNED_STORE
42struct default_packet_traits
71template<
typename T>
struct packet_traits : default_packet_traits
94template<
typename Packet>
inline Packet
96 const Packet& b) {
return a+b; }
99template<
typename Packet>
inline Packet
101 const Packet& b) {
return a-b; }
104template<
typename Packet>
inline Packet
105pnegate(
const Packet& a) {
return -a; }
108template<
typename Packet>
inline Packet
109pconj(
const Packet& a) {
return numext::conj(a); }
112template<
typename Packet>
inline Packet
114 const Packet& b) {
return a*b; }
117template<
typename Packet>
inline Packet
119 const Packet& b) {
return a/b; }
122template<
typename Packet>
inline Packet
124 const Packet& b) {
using std::min;
return (min)(a, b); }
127template<
typename Packet>
inline Packet
129 const Packet& b) {
using std::max;
return (max)(a, b); }
132template<
typename Packet>
inline Packet
133pabs(
const Packet& a) {
using std::abs;
return abs(a); }
136template<
typename Packet>
inline Packet
137pand(
const Packet& a,
const Packet& b) {
return a & b; }
140template<
typename Packet>
inline Packet
141por(
const Packet& a,
const Packet& b) {
return a | b; }
144template<
typename Packet>
inline Packet
145pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
148template<
typename Packet>
inline Packet
149pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
152template<
typename Packet>
inline Packet
153pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
156template<
typename Packet>
inline Packet
157ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
164template<
typename Packet>
inline Packet
165ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
168template<
typename Packet>
inline Packet
169pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
172template<
typename Scalar>
inline typename packet_traits<Scalar>::type
173plset(
const Scalar& a) {
return a; }
176template<
typename Scalar,
typename Packet>
inline void pstore(Scalar* to,
const Packet& from)
180template<
typename Scalar,
typename Packet>
inline void pstoreu(Scalar* to,
const Packet& from)
184template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
186#if (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC)
187 __builtin_prefetch(addr);
192template<
typename Packet>
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
196template<
typename Packet>
inline Packet
197preduxp(
const Packet* vecs) {
return vecs[0]; }
200template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
204template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
208template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
212template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
216template<
typename Packet>
inline Packet preverse(
const Packet& a)
221template<
typename Packet>
inline Packet pcplxflip(
const Packet& a)
226 return Packet(imag(a),real(a));
234template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
235Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
238template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
239Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
242template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
243Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
246template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
247Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
250template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
251Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
254template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
255Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
258template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
259Packet plog(
const Packet& a) {
using std::log;
return log(a); }
262template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
263Packet psqrt(
const Packet& a) {
using std::sqrt;
return sqrt(a); }
271template<
typename Packet>
272inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
274 pstore(to, pset1<Packet>(a));
278template<
typename Packet>
inline Packet
279pmadd(
const Packet& a,
282{
return padd(pmul(a, b),c); }
286template<
typename Packet,
int LoadMode>
287inline Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
290 return pload<Packet>(from);
292 return ploadu<Packet>(from);
297template<
typename Scalar,
typename Packet,
int LoadMode>
298inline void pstoret(Scalar* to,
const Packet& from)
307template<
int Offset,
typename PacketType>
311 static inline void run(PacketType&,
const PacketType&) {}
329template<
int Offset,
typename PacketType>
330inline void palign(PacketType& first,
const PacketType& second)
332 palign_impl<Offset,PacketType>::run(first,second);
339template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
340{
return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
342template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
343{
return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
@ Aligned
Definition Constants.h:194