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 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) {
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; }
160template<
typename Packet>
inline Packet
161ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
164template<
typename Packet>
inline Packet
165pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
168template<
typename Scalar>
inline typename packet_traits<Scalar>::type
169plset(
const Scalar& a) {
return a; }
172template<
typename Scalar,
typename Packet>
inline void pstore(Scalar* to,
const Packet& from)
176template<
typename Scalar,
typename Packet>
inline void pstoreu(Scalar* to,
const Packet& from)
180template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
182#if !defined(_MSC_VER)
183__builtin_prefetch(addr);
188template<
typename Packet>
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
192template<
typename Packet>
inline Packet
193preduxp(
const Packet* vecs) {
return vecs[0]; }
196template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
200template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
204template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
208template<
typename Packet>
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
212template<
typename Packet>
inline Packet preverse(
const Packet& a)
217template<
typename Packet>
inline Packet pcplxflip(
const Packet& a)
218{
return Packet(imag(a),real(a)); }
225template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
226Packet psin(
const Packet& a) {
return sin(a); }
229template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
230Packet pcos(
const Packet& a) {
return cos(a); }
233template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
234Packet ptan(
const Packet& a) {
return tan(a); }
237template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
238Packet pasin(
const Packet& a) {
return asin(a); }
241template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
242Packet pacos(
const Packet& a) {
return acos(a); }
245template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
246Packet pexp(
const Packet& a) {
return exp(a); }
249template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
250Packet plog(
const Packet& a) {
return log(a); }
253template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
254Packet psqrt(
const Packet& a) {
return sqrt(a); }
262template<
typename Packet>
263inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
265 pstore(to, pset1<Packet>(a));
269template<
typename Packet>
inline Packet
270pmadd(
const Packet& a,
273{
return padd(pmul(a, b),c); }
277template<
typename Packet,
int LoadMode>
278inline Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
281 return pload<Packet>(from);
283 return ploadu<Packet>(from);
288template<
typename Scalar,
typename Packet,
int LoadMode>
289inline void pstoret(Scalar* to,
const Packet& from)
298template<
int Offset,
typename PacketType>
302 static inline void run(PacketType&,
const PacketType&) {}
307template<
int Offset,
typename PacketType>
308inline void palign(PacketType& first,
const PacketType& second)
310 palign_impl<Offset,PacketType>::run(first,second);
317template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
318{
return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
320template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
321{
return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
@ Aligned
Definition Constants.h:189