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 132 template <
typename SrcPacket,
typename TgtPacket>
133 EIGEN_DEVICE_FUNC
inline TgtPacket
134 pcast(
const SrcPacket& a) {
135 return static_cast<TgtPacket
>(a);
137 template <
typename SrcPacket,
typename TgtPacket>
138 EIGEN_DEVICE_FUNC
inline TgtPacket
139 pcast(
const SrcPacket& a,
const SrcPacket& ) {
140 return static_cast<TgtPacket
>(a);
143 template <
typename SrcPacket,
typename TgtPacket>
144 EIGEN_DEVICE_FUNC
inline TgtPacket
145 pcast(
const SrcPacket& a,
const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ) {
146 return static_cast<TgtPacket
>(a);
150 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 152 const Packet& b) {
return a+b; }
155 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 157 const Packet& b) {
return a-b; }
160 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 161 pnegate(
const Packet& a) {
return -a; }
165 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 166 pconj(
const Packet& a) {
return numext::conj(a); }
169 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 171 const Packet& b) {
return a*b; }
174 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 176 const Packet& b) {
return a/b; }
179 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 181 const Packet& b) {
return numext::mini(a, b); }
184 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 186 const Packet& b) {
return numext::maxi(a, b); }
189 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 190 pabs(
const Packet& a) {
using std::abs;
return abs(a); }
193 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 194 parg(
const Packet& a) {
using numext::arg;
return arg(a); }
197 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 198 pand(
const Packet& a,
const Packet& b) {
return a & b; }
201 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 205 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 206 pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
209 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 210 pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
213 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 217 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 221 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 225 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 233 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 242 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 244 {
return pload1<Packet>(from); }
255 template<
typename Packet> EIGEN_DEVICE_FUNC
259 a0 = pload1<Packet>(a+0);
260 a1 = pload1<Packet>(a+1);
261 a2 = pload1<Packet>(a+2);
262 a3 = pload1<Packet>(a+3);
272 template<
typename Packet> EIGEN_DEVICE_FUNC
276 a0 = pload1<Packet>(a+0);
277 a1 = pload1<Packet>(a+1);
281 template<
typename Packet>
inline Packet 285 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
289 template<
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); }
299 template<
typename Scalar> EIGEN_DEVICE_FUNC
inline void prefetch(
const Scalar* addr)
302 #if defined(__LP64__) 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);
319 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 320 preduxp(
const Packet* vecs) {
return vecs[0]; }
330 template<
typename Packet> EIGEN_DEVICE_FUNC
inline 332 predux_downto4(
const Packet& a)
348 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
352 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a)
357 return Packet(imag(a),real(a));
365 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
366 Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
369 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
370 Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
373 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
374 Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
377 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
378 Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
381 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
382 Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
385 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
386 Packet patan(
const Packet& a) {
using std::atan;
return atan(a); }
389 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
390 Packet psinh(
const Packet& a) {
using std::sinh;
return sinh(a); }
393 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
394 Packet pcosh(
const Packet& a) {
using std::cosh;
return cosh(a); }
397 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
398 Packet ptanh(
const Packet& a) {
using std::tanh;
return tanh(a); }
401 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
402 Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
405 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
406 Packet plog(
const Packet& a) {
using std::log;
return log(a); }
409 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
410 Packet plog1p(
const Packet& a) {
return numext::log1p(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
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); }
444 template<
typename Packet>
447 pstore(to, pset1<Packet>(a));
451 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 455 {
return padd(pmul(a, b),c); }
459 template<
typename Packet,
int Alignment>
463 return pload<Packet>(from);
465 return ploadu<Packet>(from);
470 template<
typename Scalar,
typename Packet,
int Alignment>
471 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
484 template<
typename Packet,
int LoadMode>
487 return ploadt<Packet, LoadMode>(from);
491 template<
int Offset,
typename PacketType>
513 template<
int Offset,
typename PacketType>
526 template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
527 {
return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
529 template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
530 {
return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
539 template <typename Packet,int N=unpacket_traits<Packet>::size>
struct PacketBlock {
543 template<
typename Packet> EIGEN_DEVICE_FUNC
inline void 556 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 558 return ifPacket.select[0] ? thenPacket : elsePacket;
562 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 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);
576 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet 583 for(
Index i=0; i<unpacket_traits<Packet>::size-1; ++i)
584 mask.select[i] =
false;
586 return pblend(mask, pset1<Packet>(b), a);
593 #endif // EIGEN_GENERIC_PACKET_MATH_H Definition: XprHelper.h:158
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:85
Definition: GenericPacketMath.h:96
Definition: GenericPacketMath.h:42
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:33
Definition: GenericPacketMath.h:122
Definition: GenericPacketMath.h:539
Definition: PacketMath.h:48
Definition: BandTriangularSolver.h:13
Definition: GenericPacketMath.h:492
Definition: TensorMeta.h:50
Definition: GenericPacketMath.h:552