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
89 template<
typename T>
struct packet_traits : default_packet_traits
113 template<
typename T>
struct packet_traits<const T> : packet_traits<T> { };
115 template <
typename Src,
typename Tgt>
struct type_casting_traits {
125 template <
typename SrcPacket,
typename TgtPacket>
126 EIGEN_DEVICE_FUNC
inline TgtPacket
127 pcast(
const SrcPacket& a) {
128 return static_cast<TgtPacket
>(a);
130 template <
typename SrcPacket,
typename TgtPacket>
131 EIGEN_DEVICE_FUNC
inline TgtPacket
132 pcast(
const SrcPacket& a,
const SrcPacket& ) {
133 return static_cast<TgtPacket
>(a);
138 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
139 padd(
const Packet& a,
140 const Packet& b) {
return a+b; }
143 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
144 psub(
const Packet& a,
145 const Packet& b) {
return a-b; }
148 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
149 pnegate(
const Packet& a) {
return -a; }
153 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
154 pconj(
const Packet& a) {
return numext::conj(a); }
157 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
158 pmul(
const Packet& a,
159 const Packet& b) {
return a*b; }
162 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
163 pdiv(
const Packet& a,
164 const Packet& b) {
return a/b; }
167 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
168 pmin(
const Packet& a,
169 const Packet& b) {
return numext::mini(a, b); }
172 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
173 pmax(
const Packet& a,
174 const Packet& b) {
return numext::maxi(a, b); }
177 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
178 pabs(
const Packet& a) {
using std::abs;
return abs(a); }
181 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
182 parg(
const Packet& a) {
using numext::arg;
return arg(a); }
185 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
186 pand(
const Packet& a,
const Packet& b) {
return a & b; }
189 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
190 por(
const Packet& a,
const Packet& b) {
return a | b; }
193 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
194 pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
197 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
198 pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
201 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
202 pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
205 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
206 ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
209 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
210 pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
213 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
214 pload1(
const typename unpacket_traits<Packet>::type *a) {
return pset1<Packet>(*a); }
221 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
222 ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
230 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
231 ploadquad(
const typename unpacket_traits<Packet>::type* from)
232 {
return pload1<Packet>(from); }
243 template<
typename Packet> EIGEN_DEVICE_FUNC
244 inline void pbroadcast4(
const typename unpacket_traits<Packet>::type *a,
245 Packet& a0, Packet& a1, Packet& a2, Packet& a3)
247 a0 = pload1<Packet>(a+0);
248 a1 = pload1<Packet>(a+1);
249 a2 = pload1<Packet>(a+2);
250 a3 = pload1<Packet>(a+3);
260 template<
typename Packet> EIGEN_DEVICE_FUNC
261 inline void pbroadcast2(
const typename unpacket_traits<Packet>::type *a,
262 Packet& a0, Packet& a1)
264 a0 = pload1<Packet>(a+0);
265 a1 = pload1<Packet>(a+1);
269 template<
typename Packet>
inline Packet
270 plset(
const typename unpacket_traits<Packet>::type& a) {
return a; }
273 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
277 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstoreu(Scalar* to,
const Packet& from)
280 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pgather(
const Scalar* from, Index )
281 {
return ploadu<Packet>(from); }
283 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pscatter(Scalar* to,
const Packet& from, Index )
284 { pstore(to, from); }
287 template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
290 #if defined(__LP64__) 292 asm(
" prefetch.L1 [ %1 ];" :
"=l"(addr) :
"l"(addr));
295 asm(
" prefetch.L1 [ %1 ];" :
"=r"(addr) :
"r"(addr));
297 #elif !EIGEN_COMP_MSVC 298 __builtin_prefetch(addr);
303 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
307 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
308 preduxp(
const Packet* vecs) {
return vecs[0]; }
311 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
318 template<
typename Packet> EIGEN_DEVICE_FUNC
inline 319 typename conditional<(unpacket_traits<Packet>::size%8)==0,
typename unpacket_traits<Packet>::half,Packet>::type
320 predux4(
const Packet& a)
324 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
328 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
332 template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
336 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
339 template<
size_t offset,
typename Packet>
350 template<
size_t offset,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet protate(
const Packet& a)
352 return offset ? protate_impl<offset, Packet>::run(a) : a;
356 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a)
361 return Packet(imag(a),real(a));
369 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
370 Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
373 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
374 Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
377 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
378 Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
381 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
382 Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
385 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
386 Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
389 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
390 Packet patan(
const Packet& a) {
using std::atan;
return atan(a); }
393 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
394 Packet psinh(
const Packet& a) {
using std::sinh;
return sinh(a); }
397 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
398 Packet pcosh(
const Packet& a) {
using std::cosh;
return cosh(a); }
401 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
402 Packet ptanh(
const Packet& a) {
using std::tanh;
return tanh(a); }
405 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
406 Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
409 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
410 Packet plog(
const Packet& a) {
using std::log;
return log(a); }
413 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
414 Packet plog10(
const Packet& a) {
using std::log10;
return log10(a); }
417 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
418 Packet psqrt(
const Packet& a) {
using std::sqrt;
return sqrt(a); }
421 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
422 Packet prsqrt(
const Packet& a) {
423 return pdiv(pset1<Packet>(1), psqrt(a));
427 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
428 Packet pround(
const Packet& a) {
using numext::round;
return round(a); }
431 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
432 Packet pfloor(
const Packet& a) {
using numext::floor;
return floor(a); }
435 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
436 Packet pceil(
const Packet& a) {
using numext::ceil;
return ceil(a); }
439 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
440 Packet plgamma(
const Packet& a) {
using numext::lgamma;
return lgamma(a); }
443 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
444 Packet perf(
const Packet& a) {
using numext::erf;
return erf(a); }
447 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
448 Packet perfc(
const Packet& a) {
using numext::erfc;
return erfc(a); }
456 template<
typename Packet>
457 inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
459 pstore(to, pset1<Packet>(a));
463 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
464 pmadd(
const Packet& a,
467 {
return padd(pmul(a, b),c); }
471 template<
typename Packet,
int Alignment>
472 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
474 if(Alignment >= unpacket_traits<Packet>::alignment)
475 return pload<Packet>(from);
477 return ploadu<Packet>(from);
482 template<
typename Scalar,
typename Packet,
int Alignment>
483 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
485 if(Alignment >= unpacket_traits<Packet>::alignment)
496 template<
typename Packet,
int LoadMode>
497 inline Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from)
499 return ploadt<Packet, LoadMode>(from);
503 template<
int Offset,
typename PacketType>
507 static inline void run(PacketType&,
const PacketType&) {}
525 template<
int Offset,
typename PacketType>
526 inline void palign(PacketType& first,
const PacketType& second)
528 palign_impl<Offset,PacketType>::run(first,second);
538 template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
539 {
return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
541 template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
542 {
return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
551 template <typename Packet,int N=unpacket_traits<Packet>::size>
struct PacketBlock {
555 template<
typename Packet> EIGEN_DEVICE_FUNC
inline void 556 ptranspose(PacketBlock<Packet,1>& ) {
564 template <
size_t N>
struct Selector {
568 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
569 pblend(
const Selector<unpacket_traits<Packet>::size>& ifPacket,
const Packet& thenPacket,
const Packet& elsePacket) {
570 return ifPacket.select[0] ? thenPacket : elsePacket;
577 #endif // EIGEN_GENERIC_PACKET_MATH_H
Definition: Eigen_Colamd.h:54