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
96template<
typename T>
struct packet_traits : default_packet_traits
120template<
typename T>
struct packet_traits<const T> : packet_traits<T> { };
122template <
typename Src,
typename Tgt>
struct type_casting_traits {
132template <
typename SrcPacket,
typename TgtPacket>
133EIGEN_DEVICE_FUNC
inline TgtPacket
134pcast(
const SrcPacket& a) {
135 return static_cast<TgtPacket
>(a);
137template <
typename SrcPacket,
typename TgtPacket>
138EIGEN_DEVICE_FUNC
inline TgtPacket
139pcast(
const SrcPacket& a,
const SrcPacket& ) {
140 return static_cast<TgtPacket
>(a);
143template <
typename SrcPacket,
typename TgtPacket>
144EIGEN_DEVICE_FUNC
inline TgtPacket
145pcast(
const SrcPacket& a,
const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ) {
146 return static_cast<TgtPacket
>(a);
150template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
152 const Packet& b) {
return a+b; }
155template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
157 const Packet& b) {
return a-b; }
160template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
161pnegate(
const Packet& a) {
return -a; }
165template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
166pconj(
const Packet& a) {
return numext::conj(a); }
169template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
171 const Packet& b) {
return a*b; }
174template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
176 const Packet& b) {
return a/b; }
179template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
181 const Packet& b) {
return numext::mini(a, b); }
184template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
186 const Packet& b) {
return numext::maxi(a, b); }
189template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
190pabs(
const Packet& a) {
using std::abs;
return abs(a); }
193template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
194parg(
const Packet& a) {
using numext::arg;
return arg(a); }
197template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
198pand(
const Packet& a,
const Packet& b) {
return a & b; }
201template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
202por(
const Packet& a,
const Packet& b) {
return a | b; }
205template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
206pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
209template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
210pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
213template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
214pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
217template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
218ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
221template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
222pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
225template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
226pload1(
const typename unpacket_traits<Packet>::type *a) {
return pset1<Packet>(*a); }
233template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
234ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
242template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
243ploadquad(
const typename unpacket_traits<Packet>::type* from)
244{
return pload1<Packet>(from); }
255template<
typename Packet> EIGEN_DEVICE_FUNC
256inline void pbroadcast4(
const typename unpacket_traits<Packet>::type *a,
257 Packet& a0, Packet& a1, Packet& a2, Packet& a3)
259 a0 = pload1<Packet>(a+0);
260 a1 = pload1<Packet>(a+1);
261 a2 = pload1<Packet>(a+2);
262 a3 = pload1<Packet>(a+3);
272template<
typename Packet> EIGEN_DEVICE_FUNC
273inline void pbroadcast2(
const typename unpacket_traits<Packet>::type *a,
274 Packet& a0, Packet& a1)
276 a0 = pload1<Packet>(a+0);
277 a1 = pload1<Packet>(a+1);
281template<
typename Packet>
inline Packet
282plset(
const typename unpacket_traits<Packet>::type& a) {
return a; }
285template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
289template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstoreu(Scalar* to,
const Packet& from)
292 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pgather(
const Scalar* from,
Index )
293 {
return ploadu<Packet>(from); }
295 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pscatter(Scalar* to,
const Packet& from,
Index )
296 { pstore(to, from); }
299template<
typename Scalar> EIGEN_DEVICE_FUNC
inline void prefetch(
const Scalar* addr)
304 asm(
" prefetch.L1 [ %1 ];" :
"=l"(addr) :
"l"(addr));
307 asm(
" prefetch.L1 [ %1 ];" :
"=r"(addr) :
"r"(addr));
309#elif (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC)
310 __builtin_prefetch(addr);
315template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
319template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
320preduxp(
const Packet* vecs) {
return vecs[0]; }
323template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
330template<
typename Packet> EIGEN_DEVICE_FUNC
inline
331typename conditional<(unpacket_traits<Packet>::size%8)==0,
typename unpacket_traits<Packet>::half,Packet>::type
332predux_downto4(
const Packet& a)
336template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
340template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
344template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
348template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
352template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a)
365template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
366Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
369template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
370Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
373template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
374Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
377template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
378Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
381template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
382Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
385template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
386Packet patan(
const Packet& a) {
using std::atan;
return atan(a); }
389template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
390Packet psinh(
const Packet& a) {
using std::sinh;
return sinh(a); }
393template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
394Packet pcosh(
const Packet& a) {
using std::cosh;
return cosh(a); }
397template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
398Packet ptanh(
const Packet& a) {
using std::tanh;
return tanh(a); }
401template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
402Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
405template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
406Packet plog(
const Packet& a) {
using std::log;
return log(a); }
409template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
410Packet plog1p(
const Packet& a) {
return numext::log1p(a); }
413template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
414Packet plog10(
const Packet& a) {
using std::log10;
return log10(a); }
417template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
418Packet psqrt(
const Packet& a) {
using std::sqrt;
return sqrt(a); }
421template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
422Packet prsqrt(
const Packet& a) {
423 return pdiv(pset1<Packet>(1), psqrt(a));
427template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
428Packet pround(
const Packet& a) {
using numext::round;
return round(a); }
431template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
432Packet pfloor(
const Packet& a) {
using numext::floor;
return floor(a); }
435template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
436Packet pceil(
const Packet& a) {
using numext::ceil;
return ceil(a); }
444template<
typename Packet>
445inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
447 pstore(to, pset1<Packet>(a));
451template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
452pmadd(
const Packet& a,
455{
return padd(pmul(a, b),c); }
459template<
typename Packet,
int Alignment>
460EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
462 if(Alignment >= unpacket_traits<Packet>::alignment)
463 return pload<Packet>(from);
465 return ploadu<Packet>(from);
470template<
typename Scalar,
typename Packet,
int Alignment>
471EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
473 if(Alignment >= unpacket_traits<Packet>::alignment)
484template<
typename Packet,
int LoadMode>
485inline Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from)
487 return ploadt<Packet, LoadMode>(from);
491template<
int Offset,
typename PacketType>
495 static inline void run(PacketType&,
const PacketType&) {}
513template<
int Offset,
typename PacketType>
514inline void palign(PacketType& first,
const PacketType& second)
516 palign_impl<Offset,PacketType>::run(first,second);
526template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
529template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
539template <typename Packet,int N=unpacket_traits<Packet>::size>
struct PacketBlock {
543template<
typename Packet> EIGEN_DEVICE_FUNC
inline void
544ptranspose(PacketBlock<Packet,1>& ) {
552template <
size_t N>
struct Selector {
556template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
557pblend(
const Selector<unpacket_traits<Packet>::size>& ifPacket,
const Packet& thenPacket,
const Packet& elsePacket) {
558 return ifPacket.select[0] ? thenPacket : elsePacket;
562template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
563pinsertfirst(
const Packet& a,
typename unpacket_traits<Packet>::type b)
567 Selector<unpacket_traits<Packet>::size> mask;
568 mask.select[0] =
true;
570 for(
Index i=1; i<unpacket_traits<Packet>::size; ++i)
571 mask.select[i] =
false;
572 return pblend(mask, pset1<Packet>(b), a);
576template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
577pinsertlast(
const Packet& a,
typename unpacket_traits<Packet>::type b)
581 Selector<unpacket_traits<Packet>::size> mask;
583 for(
Index i=0; i<unpacket_traits<Packet>::size-1; ++i)
584 mask.select[i] =
false;
585 mask.select[unpacket_traits<Packet>::size-1] =
true;
586 return pblend(mask, pset1<Packet>(b), a);
Namespace containing all symbols from the Eigen library.
Definition: Core:287
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cosh_op< typename Derived::Scalar >, const Derived > cosh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_real_op< typename Derived::Scalar >, const Derived > real(const Eigen::ArrayBase< Derived > &x)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_atan_op< typename Derived::Scalar >, const Derived > atan(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_round_op< typename Derived::Scalar >, const Derived > round(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_imag_op< typename Derived::Scalar >, const Derived > imag(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_asin_op< typename Derived::Scalar >, const Derived > asin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_acos_op< typename Derived::Scalar >, const Derived > acos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sinh_op< typename Derived::Scalar >, const Derived > sinh(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_arg_op< typename Derived::Scalar >, const Derived > arg(const Eigen::ArrayBase< Derived > &x)