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
42 struct default_packet_traits
84 template<
typename T>
struct packet_traits : default_packet_traits
108 template<
typename T>
struct packet_traits<const T> : packet_traits<T> { };
110 template <
typename Src,
typename Tgt>
struct type_casting_traits {
120 template <
typename SrcPacket,
typename TgtPacket>
121 EIGEN_DEVICE_FUNC
inline TgtPacket
122 pcast(
const SrcPacket& a) {
123 return static_cast<TgtPacket
>(a);
125 template <
typename SrcPacket,
typename TgtPacket>
126 EIGEN_DEVICE_FUNC
inline TgtPacket
127 pcast(
const SrcPacket& a,
const SrcPacket& ) {
128 return static_cast<TgtPacket
>(a);
133 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
134 padd(
const Packet& a,
135 const Packet& b) {
return a+b; }
138 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
139 psub(
const Packet& a,
140 const Packet& b) {
return a-b; }
143 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
144 pnegate(
const Packet& a) {
return -a; }
148 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
149 pconj(
const Packet& a) {
return numext::conj(a); }
152 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
153 pmul(
const Packet& a,
154 const Packet& b) {
return a*b; }
157 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
158 pdiv(
const Packet& a,
159 const Packet& b) {
return a/b; }
162 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
163 pmin(
const Packet& a,
164 const Packet& b) {
return numext::mini(a, b); }
167 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
168 pmax(
const Packet& a,
169 const Packet& b) {
return numext::maxi(a, b); }
172 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
173 pabs(
const Packet& a) {
using std::abs;
return abs(a); }
176 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
177 parg(
const Packet& a) {
using numext::arg;
return arg(a); }
180 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
181 pand(
const Packet& a,
const Packet& b) {
return a & b; }
184 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
185 por(
const Packet& a,
const Packet& b) {
return a | b; }
188 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
189 pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
192 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
193 pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
196 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
197 pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
200 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
201 ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
204 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
205 pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
208 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
209 pload1(
const typename unpacket_traits<Packet>::type *a) {
return pset1<Packet>(*a); }
216 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
217 ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
225 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
226 ploadquad(
const typename unpacket_traits<Packet>::type* from)
227 {
return pload1<Packet>(from); }
238 template<
typename Packet> EIGEN_DEVICE_FUNC
239 inline void pbroadcast4(
const typename unpacket_traits<Packet>::type *a,
240 Packet& a0, Packet& a1, Packet& a2, Packet& a3)
242 a0 = pload1<Packet>(a+0);
243 a1 = pload1<Packet>(a+1);
244 a2 = pload1<Packet>(a+2);
245 a3 = pload1<Packet>(a+3);
255 template<
typename Packet> EIGEN_DEVICE_FUNC
256 inline void pbroadcast2(
const typename unpacket_traits<Packet>::type *a,
257 Packet& a0, Packet& a1)
259 a0 = pload1<Packet>(a+0);
260 a1 = pload1<Packet>(a+1);
264 template<
typename Packet>
inline Packet
265 plset(
const typename unpacket_traits<Packet>::type& a) {
return a; }
268 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
272 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstoreu(Scalar* to,
const Packet& from)
275 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pgather(
const Scalar* from, Index )
276 {
return ploadu<Packet>(from); }
278 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pscatter(Scalar* to,
const Packet& from, Index )
279 { pstore(to, from); }
282 template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
285 #if defined(__LP64__)
287 asm(
" prefetch.L1 [ %1 ];" :
"=l"(addr) :
"l"(addr));
290 asm(
" prefetch.L1 [ %1 ];" :
"=r"(addr) :
"r"(addr));
292 #elif !EIGEN_COMP_MSVC
293 __builtin_prefetch(addr);
298 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
302 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
303 preduxp(
const Packet* vecs) {
return vecs[0]; }
306 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
313 template<
typename Packet> EIGEN_DEVICE_FUNC
inline
314 typename conditional<(unpacket_traits<Packet>::size%8)==0,
typename unpacket_traits<Packet>::half,Packet>::type
315 predux4(
const Packet& a)
319 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
323 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
327 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
331 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
334 template<
size_t offset,
typename Packet>
345 template<
size_t offset,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet protate(
const Packet& a)
347 return offset ? protate_impl<offset, Packet>::run(a) : a;
351 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a)
356 return Packet(imag(a),real(a));
364 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
365 Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
368 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
369 Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
372 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
373 Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
376 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
377 Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
380 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
381 Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
384 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
385 Packet patan(
const Packet& a) {
using std::atan;
return atan(a); }
388 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
389 Packet psinh(
const Packet& a) {
using std::sinh;
return sinh(a); }
392 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
393 Packet pcosh(
const Packet& a) {
using std::cosh;
return cosh(a); }
396 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
397 Packet ptanh(
const Packet& a) {
using std::tanh;
return tanh(a); }
400 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
401 Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
404 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
405 Packet plog(
const Packet& a) {
using std::log;
return log(a); }
408 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
409 Packet plog10(
const Packet& a) {
using std::log10;
return log10(a); }
412 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
413 Packet psqrt(
const Packet& a) {
using std::sqrt;
return sqrt(a); }
416 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
417 Packet prsqrt(
const Packet& a) {
418 return pdiv(pset1<Packet>(1), psqrt(a));
422 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
423 Packet pround(
const Packet& a) {
using numext::round;
return round(a); }
426 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
427 Packet pfloor(
const Packet& a) {
using numext::floor;
return floor(a); }
430 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
431 Packet pceil(
const Packet& a) {
using numext::ceil;
return ceil(a); }
439 template<
typename Packet>
440 inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
442 pstore(to, pset1<Packet>(a));
446 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
447 pmadd(
const Packet& a,
450 {
return padd(pmul(a, b),c); }
454 template<
typename Packet,
int Alignment>
455 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
457 if(Alignment >= unpacket_traits<Packet>::alignment)
458 return pload<Packet>(from);
460 return ploadu<Packet>(from);
465 template<
typename Scalar,
typename Packet,
int Alignment>
466 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
468 if(Alignment >= unpacket_traits<Packet>::alignment)
479 template<
typename Packet,
int LoadMode>
480 inline Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from)
482 return ploadt<Packet, LoadMode>(from);
486 template<
int Offset,
typename PacketType>
490 static inline void run(PacketType&,
const PacketType&) {}
508 template<
int Offset,
typename PacketType>
509 inline void palign(PacketType& first,
const PacketType& second)
511 palign_impl<Offset,PacketType>::run(first,second);
521 template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
522 {
return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
524 template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
525 {
return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
534 template <typename Packet,int N=unpacket_traits<Packet>::size>
struct PacketBlock {
538 template<
typename Packet> EIGEN_DEVICE_FUNC
inline void
539 ptranspose(PacketBlock<Packet,1>& ) {
547 template <
size_t N>
struct Selector {
551 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
552 pblend(
const Selector<unpacket_traits<Packet>::size>& ifPacket,
const Packet& thenPacket,
const Packet& elsePacket) {
553 return ifPacket.select[0] ? thenPacket : elsePacket;
560 #endif // EIGEN_GENERIC_PACKET_MATH_H
Definition: Eigen_Colamd.h:54