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
125template <
typename SrcPacket,
typename TgtPacket>
130template <
typename SrcPacket,
typename TgtPacket>
138template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
140 const Packet& b) {
return a+b; }
143template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
145 const Packet& b) {
return a-b; }
148template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
149pnegate(
const Packet& a) {
return -a; }
153template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
154pconj(
const Packet& a) {
return numext::conj(a); }
157template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
159 const Packet& b) {
return a*b; }
162template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
164 const Packet& b) {
return a/b; }
167template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
169 const Packet& b) {
return numext::mini(a, b); }
172template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
174 const Packet& b) {
return numext::maxi(a, b); }
177template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
178pabs(
const Packet& a) {
using std::abs;
return abs(a); }
181template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
182parg(
const Packet& a) {
using numext::arg;
return arg(a); }
185template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
186pand(
const Packet& a,
const Packet& b) {
return a & b; }
189template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
190por(
const Packet& a,
const Packet& b) {
return a | b; }
193template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
194pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
197template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
198pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
201template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
202pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
205template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
206ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
209template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
210pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
213template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
214pload1(
const typename unpacket_traits<Packet>::type *a) {
return pset1<Packet>(*a); }
221template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
222ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
230template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
231ploadquad(
const typename unpacket_traits<Packet>::type* from)
232{
return pload1<Packet>(from); }
243template<
typename Packet> EIGEN_DEVICE_FUNC
244inline 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);
260template<
typename Packet> EIGEN_DEVICE_FUNC
261inline 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);
269template<
typename Packet>
inline Packet
270plset(
const typename unpacket_traits<Packet>::type& a) {
return a; }
273template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
277template<
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); }
287template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
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);
303template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type pfirst(
const Packet& a)
307template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
308preduxp(
const Packet* vecs) {
return vecs[0]; }
311template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux(
const Packet& a)
318template<
typename Packet> EIGEN_DEVICE_FUNC
inline
319typename conditional<(unpacket_traits<Packet>::size%8)==0,
typename unpacket_traits<Packet>::half,Packet>::type
320predux4(
const Packet& a)
324template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
const Packet& a)
328template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
const Packet& a)
332template<
typename Packet> EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
const Packet& a)
336template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
339template<
size_t offset,
typename Packet>
350template<
size_t offset,
typename Packet>
EIGEN_DEVICE_FUNC inline Packet protate(
const Packet& a)
356template<
typename Packet>
EIGEN_DEVICE_FUNC inline Packet pcplxflip(
const Packet& a)
361 return Packet(imag(a),real(a));
369template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
370Packet psin(
const Packet& a) {
using std::sin;
return sin(a); }
373template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
374Packet pcos(
const Packet& a) {
using std::cos;
return cos(a); }
377template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
378Packet ptan(
const Packet& a) {
using std::tan;
return tan(a); }
381template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
382Packet pasin(
const Packet& a) {
using std::asin;
return asin(a); }
385template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
386Packet pacos(
const Packet& a) {
using std::acos;
return acos(a); }
389template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
390Packet patan(
const Packet& a) {
using std::atan;
return atan(a); }
393template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
394Packet psinh(
const Packet& a) {
using std::sinh;
return sinh(a); }
397template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
398Packet pcosh(
const Packet& a) {
using std::cosh;
return cosh(a); }
401template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
402Packet ptanh(
const Packet& a) {
using std::tanh;
return tanh(a); }
405template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
406Packet pexp(
const Packet& a) {
using std::exp;
return exp(a); }
409template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
410Packet plog(
const Packet& a) {
using std::log;
return log(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); }
439template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
440Packet plgamma(
const Packet& a) {
using numext::lgamma;
return lgamma(a); }
443template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
444Packet perf(
const Packet& a) {
using numext::erf;
return erf(a); }
447template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
448Packet perfc(
const Packet& a) {
using numext::erfc;
return erfc(a); }
456template<
typename Packet>
457inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
459 pstore(to, pset1<Packet>(a));
463template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
464pmadd(
const Packet& a,
467{
return padd(pmul(a, b),c); }
471template<
typename Packet,
int Alignment>
472EIGEN_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);
482template<
typename Scalar,
typename Packet,
int Alignment>
483EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
485 if(Alignment >= unpacket_traits<Packet>::alignment)
496template<
typename Packet,
int LoadMode>
497inline Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from)
499 return ploadt<Packet, LoadMode>(from);
503template<
int Offset,
typename PacketType>
507 static inline void run(PacketType&,
const PacketType&) {}
525template<
int Offset,
typename PacketType>
526inline void palign(PacketType& first,
const PacketType& second)
538template<>
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)); }
541template<>
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)); }
Pseudo expression representing a solving operation.
Definition Solve.h:63
Definition GenericPacketMath.h:551
Definition GenericPacketMath.h:564
Definition GenericPacketMath.h:43
Definition GenericPacketMath.h:90
Definition GenericPacketMath.h:505
Definition GenericPacketMath.h:341
Definition GenericPacketMath.h:115
Definition XprHelper.h:119