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
94 HasGammaSampleDerAlpha = 0,
142 template<
typename T,
int unique_
id = 0>
145 EIGEN_ALWAYS_INLINE
operator T&() {
return m_val; }
146 EIGEN_ALWAYS_INLINE
operator const T&()
const {
return m_val; }
158 template <
typename SrcPacket,
typename TgtPacket>
159 EIGEN_DEVICE_FUNC
inline TgtPacket
160 pcast(
const SrcPacket& a) {
161 return static_cast<TgtPacket
>(a);
163 template <
typename SrcPacket,
typename TgtPacket>
164 EIGEN_DEVICE_FUNC
inline TgtPacket
165 pcast(
const SrcPacket& a,
const SrcPacket& ) {
166 return static_cast<TgtPacket
>(a);
168 template <
typename SrcPacket,
typename TgtPacket>
169 EIGEN_DEVICE_FUNC
inline TgtPacket
170 pcast(
const SrcPacket& a,
const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ) {
171 return static_cast<TgtPacket
>(a);
173 template <
typename SrcPacket,
typename TgtPacket>
174 EIGEN_DEVICE_FUNC
inline TgtPacket
175 pcast(
const SrcPacket& a,
const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ,
176 const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ,
const SrcPacket& ) {
177 return static_cast<TgtPacket
>(a);
181 template <
typename Target,
typename Packet>
182 EIGEN_DEVICE_FUNC
inline Target
183 preinterpret(
const Packet& a);
186 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
187 padd(
const Packet& a,
const Packet& b) {
return a+b; }
189 template<> EIGEN_DEVICE_FUNC
inline bool
190 padd(
const bool& a,
const bool& b) {
return a || b; }
193 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
194 psub(
const Packet& a,
const Packet& b) {
return a-b; }
197 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
198 pnegate(
const Packet& a) {
return -a; }
200 template<> EIGEN_DEVICE_FUNC
inline bool
201 pnegate(
const bool& a) {
return !a; }
204 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
205 pconj(
const Packet& a) {
return numext::conj(a); }
208 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
209 pmul(
const Packet& a,
const Packet& b) {
return a*b; }
211 template<> EIGEN_DEVICE_FUNC
inline bool
212 pmul(
const bool& a,
const bool& b) {
return a && b; }
215 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
216 pdiv(
const Packet& a,
const Packet& b) {
return a/b; }
219 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
220 ptrue(
const Packet& ) { Packet b; memset((
void*)&b, 0xff,
sizeof(b));
return b;}
223 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
224 pzero(
const Packet& ) { Packet b; memset((
void*)&b, 0,
sizeof(b));
return b;}
227 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
228 pcmp_le(
const Packet& a,
const Packet& b) {
return a<=b ? ptrue(a) : pzero(a); }
231 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
232 pcmp_lt(
const Packet& a,
const Packet& b) {
return a<b ? ptrue(a) : pzero(a); }
235 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
236 pcmp_eq(
const Packet& a,
const Packet& b) {
return a==b ? ptrue(a) : pzero(a); }
239 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
240 pcmp_lt_or_nan(
const Packet& a,
const Packet& b) {
return a>=b ? pzero(a) : ptrue(a); }
241 template<> EIGEN_DEVICE_FUNC
inline float pzero<float>(
const float& a) {
242 EIGEN_UNUSED_VARIABLE(a)
246 template<> EIGEN_DEVICE_FUNC
inline double pzero<double>(
const double& a) {
247 EIGEN_UNUSED_VARIABLE(a)
251 template <
typename RealScalar>
252 EIGEN_DEVICE_FUNC
inline std::complex<RealScalar> ptrue(
const std::complex<RealScalar>& ) {
255 return std::complex<RealScalar>(b, b);
258 template <
typename Packet,
typename Op>
259 EIGEN_DEVICE_FUNC
inline Packet bitwise_helper(
const Packet& a,
const Packet& b, Op op) {
260 const unsigned char* a_ptr =
reinterpret_cast<const unsigned char*
>(&a);
261 const unsigned char* b_ptr =
reinterpret_cast<const unsigned char*
>(&b);
263 unsigned char* c_ptr =
reinterpret_cast<unsigned char*
>(&c);
264 for (
size_t i = 0; i <
sizeof(Packet); ++i) {
265 *c_ptr++ = op(*a_ptr++, *b_ptr++);
271 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
272 pand(
const Packet& a,
const Packet& b) {
273 #if defined(EIGEN_HIP_DEVICE_COMPILE)
274 return bitwise_helper(a ,b, std::bit_and<unsigned char>());
276 EIGEN_USING_STD(bit_and);
277 return bitwise_helper(a ,b, bit_and<unsigned char>());
282 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
283 por(
const Packet& a,
const Packet& b) {
284 #if defined(EIGEN_HIP_DEVICE_COMPILE)
285 return bitwise_helper(a ,b, std::bit_or<unsigned char>());
287 EIGEN_USING_STD(bit_or);
288 return bitwise_helper(a ,b, bit_or<unsigned char>());
293 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
294 pxor(
const Packet& a,
const Packet& b) {
295 #if defined(EIGEN_HIP_DEVICE_COMPILE)
296 return bitwise_helper(a ,b, std::bit_xor<unsigned char>());
298 EIGEN_USING_STD(bit_xor);
299 return bitwise_helper(a ,b, bit_xor<unsigned char>());
304 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
305 pandnot(
const Packet& a,
const Packet& b) {
return pand(a, pxor(ptrue(b), b)); }
308 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
309 pselect(
const Packet& mask,
const Packet& a,
const Packet& b) {
310 return por(pand(a,mask),pandnot(b,mask));
313 template<> EIGEN_DEVICE_FUNC
inline float pselect<float>(
314 const float& cond,
const float& a,
const float&b) {
315 return numext::equal_strict(cond,0.f) ? b : a;
318 template<> EIGEN_DEVICE_FUNC
inline double pselect<double>(
319 const double& cond,
const double& a,
const double& b) {
320 return numext::equal_strict(cond,0.) ? b : a;
323 template<> EIGEN_DEVICE_FUNC
inline bool pselect<bool>(
324 const bool& cond,
const bool& a,
const bool& b) {
330 template<
int NaNPropagation>
332 template <
typename Packet,
typename Op>
342 template <
typename Packet,
typename Op>
344 Packet not_nan_mask_a = pcmp_eq(a, a);
345 Packet not_nan_mask_b = pcmp_eq(b, b);
346 return pselect(not_nan_mask_a,
347 pselect(not_nan_mask_b, op(a, b), b),
357 template <
typename Packet,
typename Op>
359 Packet not_nan_mask_a = pcmp_eq(a, a);
360 Packet not_nan_mask_b = pcmp_eq(b, b);
361 return pselect(not_nan_mask_a,
362 pselect(not_nan_mask_b, op(a, b), a),
368 #ifndef SYCL_DEVICE_ONLY
369 #define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) Func
371 #define EIGEN_BINARY_OP_NAN_PROPAGATION(Type, Func) \
372 [](const Type& a, const Type& b) { \
378 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
379 pmin(
const Packet& a,
const Packet& b) {
return numext::mini(a,b); }
383 template <
int NaNPropagation,
typename Packet>
384 EIGEN_DEVICE_FUNC
inline Packet pmin(
const Packet& a,
const Packet& b) {
385 return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet, (pmin<Packet>)));
390 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
391 pmax(
const Packet& a,
const Packet& b) {
return numext::maxi(a, b); }
395 template <
int NaNPropagation,
typename Packet>
396 EIGEN_DEVICE_FUNC
inline Packet pmax(
const Packet& a,
const Packet& b) {
397 return pminmax_impl<NaNPropagation>::run(a, b, EIGEN_BINARY_OP_NAN_PROPAGATION(Packet,(pmax<Packet>)));
401 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
402 pabs(
const Packet& a) {
return numext::abs(a); }
403 template<> EIGEN_DEVICE_FUNC
inline unsigned int
404 pabs(
const unsigned int& a) {
return a; }
405 template<> EIGEN_DEVICE_FUNC
inline unsigned long
406 pabs(
const unsigned long& a) {
return a; }
407 template<> EIGEN_DEVICE_FUNC
inline unsigned long long
408 pabs(
const unsigned long long& a) {
return a; }
411 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
412 parg(
const Packet& a) {
using numext::arg;
return arg(a); }
416 template<
int N> EIGEN_DEVICE_FUNC
inline int
417 parithmetic_shift_right(
const int& a) {
return a >> N; }
418 template<
int N> EIGEN_DEVICE_FUNC
inline long int
419 parithmetic_shift_right(
const long int& a) {
return a >> N; }
422 template<
int N> EIGEN_DEVICE_FUNC
inline int
423 plogical_shift_right(
const int& a) {
return static_cast<int>(
static_cast<unsigned int>(a) >> N); }
424 template<
int N> EIGEN_DEVICE_FUNC
inline long int
425 plogical_shift_right(
const long int& a) {
return static_cast<long>(
static_cast<unsigned long>(a) >> N); }
428 template<
int N> EIGEN_DEVICE_FUNC
inline int
429 plogical_shift_left(
const int& a) {
return a << N; }
430 template<
int N> EIGEN_DEVICE_FUNC
inline long int
431 plogical_shift_left(
const long int& a) {
return a << N; }
436 template <
typename Packet>
437 EIGEN_DEVICE_FUNC
inline Packet pfrexp(
const Packet& a, Packet& exponent) {
439 EIGEN_USING_STD(frexp);
440 Packet result = frexp(a, &exp);
441 exponent =
static_cast<Packet
>(exp);
448 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
449 pldexp(
const Packet &a,
const Packet &exponent) {
450 EIGEN_USING_STD(ldexp)
451 return ldexp(a,
static_cast<int>(exponent));
455 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
456 pabsdiff(
const Packet& a,
const Packet& b) {
return pselect(pcmp_lt(a, b), psub(b, a), psub(a, b)); }
459 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
460 pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
463 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
464 ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
470 template<
typename Packet> EIGEN_DEVICE_FUNC
inline
471 typename enable_if<unpacket_traits<Packet>::masked_load_available, Packet>::type
472 ploadu(
const typename unpacket_traits<Packet>::type* from,
typename unpacket_traits<Packet>::mask_t umask);
475 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
476 pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
479 template<
typename Packet,
typename BitsType> EIGEN_DEVICE_FUNC
inline Packet
480 pset1frombits(BitsType a);
483 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
484 pload1(
const typename unpacket_traits<Packet>::type *a) {
return pset1<Packet>(*a); }
491 template<
typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
492 ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
500 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
501 ploadquad(
const typename unpacket_traits<Packet>::type* from)
502 {
return pload1<Packet>(from); }
513 template<
typename Packet> EIGEN_DEVICE_FUNC
514 inline void pbroadcast4(
const typename unpacket_traits<Packet>::type *a,
515 Packet& a0, Packet& a1, Packet& a2, Packet& a3)
517 a0 = pload1<Packet>(a+0);
518 a1 = pload1<Packet>(a+1);
519 a2 = pload1<Packet>(a+2);
520 a3 = pload1<Packet>(a+3);
530 template<
typename Packet> EIGEN_DEVICE_FUNC
531 inline void pbroadcast2(
const typename unpacket_traits<Packet>::type *a,
532 Packet& a0, Packet& a1)
534 a0 = pload1<Packet>(a+0);
535 a1 = pload1<Packet>(a+1);
539 template<
typename Packet> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet
540 plset(
const typename unpacket_traits<Packet>::type& a) {
return a; }
544 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
545 peven_mask(
const Packet& ) {
546 typedef typename unpacket_traits<Packet>::type Scalar;
547 const size_t n = unpacket_traits<Packet>::size;
549 for(
size_t i = 0; i < n; ++i) {
550 memset(elements+i, ((i & 1) == 0 ? 0xff : 0),
sizeof(Scalar));
552 return ploadu<Packet>(elements);
557 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstore(Scalar* to,
const Packet& from)
561 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pstoreu(Scalar* to,
const Packet& from)
568 template<
typename Scalar,
typename Packet>
569 EIGEN_DEVICE_FUNC
inline
570 typename enable_if<unpacket_traits<Packet>::masked_store_available,
void>::type
571 pstoreu(Scalar* to,
const Packet& from,
typename unpacket_traits<Packet>::mask_t umask);
573 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pgather(
const Scalar* from,
Index )
574 {
return ploadu<Packet>(from); }
576 template<
typename Scalar,
typename Packet> EIGEN_DEVICE_FUNC
inline void pscatter(Scalar* to,
const Packet& from,
Index )
577 { pstore(to, from); }
580 template<
typename Scalar> EIGEN_DEVICE_FUNC
inline void prefetch(
const Scalar* addr)
582 #if defined(EIGEN_HIP_DEVICE_COMPILE)
584 #elif defined(EIGEN_CUDA_ARCH)
585 #if defined(__LP64__) || EIGEN_OS_WIN64
587 asm(
" prefetch.L1 [ %1 ];" :
"=l"(addr) :
"l"(addr));
590 asm(
" prefetch.L1 [ %1 ];" :
"=r"(addr) :
"r"(addr));
592 #elif (!EIGEN_COMP_MSVC) && (EIGEN_COMP_GNUC || EIGEN_COMP_CLANG || EIGEN_COMP_ICC)
593 __builtin_prefetch(addr);
598 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet preverse(
const Packet& a)
602 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet pcplxflip(
const Packet& a)
604 return Packet(numext::imag(a),numext::real(a));
612 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
613 Packet psin(
const Packet& a) { EIGEN_USING_STD(sin);
return sin(a); }
616 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
617 Packet pcos(
const Packet& a) { EIGEN_USING_STD(cos);
return cos(a); }
620 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
621 Packet ptan(
const Packet& a) { EIGEN_USING_STD(tan);
return tan(a); }
624 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
625 Packet pasin(
const Packet& a) { EIGEN_USING_STD(asin);
return asin(a); }
628 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
629 Packet pacos(
const Packet& a) { EIGEN_USING_STD(acos);
return acos(a); }
632 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
633 Packet patan(
const Packet& a) { EIGEN_USING_STD(atan);
return atan(a); }
636 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
637 Packet psinh(
const Packet& a) { EIGEN_USING_STD(sinh);
return sinh(a); }
640 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
641 Packet pcosh(
const Packet& a) { EIGEN_USING_STD(cosh);
return cosh(a); }
644 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
645 Packet ptanh(
const Packet& a) { EIGEN_USING_STD(tanh);
return tanh(a); }
648 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
649 Packet pexp(
const Packet& a) { EIGEN_USING_STD(exp);
return exp(a); }
652 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
653 Packet pexpm1(
const Packet& a) {
return numext::expm1(a); }
656 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
657 Packet plog(
const Packet& a) { EIGEN_USING_STD(log);
return log(a); }
660 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
661 Packet plog1p(
const Packet& a) {
return numext::log1p(a); }
664 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
665 Packet plog10(
const Packet& a) { EIGEN_USING_STD(log10);
return log10(a); }
668 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
669 Packet plog2(
const Packet& a) {
670 typedef typename internal::unpacket_traits<Packet>::type Scalar;
671 return pmul(pset1<Packet>(Scalar(EIGEN_LOG2E)), plog(a));
675 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
676 Packet psqrt(
const Packet& a) { EIGEN_USING_STD(sqrt);
return sqrt(a); }
679 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
680 Packet prsqrt(
const Packet& a) {
681 typedef typename internal::unpacket_traits<Packet>::type Scalar;
682 return pdiv(pset1<Packet>(Scalar(1)), psqrt(a));
686 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
687 Packet pround(
const Packet& a) {
using numext::round;
return round(a); }
690 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
691 Packet pfloor(
const Packet& a) {
using numext::floor;
return floor(a); }
695 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
696 Packet print(
const Packet& a) {
using numext::rint;
return rint(a); }
699 template<
typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
700 Packet pceil(
const Packet& a) {
using numext::ceil;
return ceil(a); }
703 template<
typename Packet>
704 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type
705 pfirst(
const Packet& a)
712 template<
typename Packet>
713 EIGEN_DEVICE_FUNC
inline typename conditional<(unpacket_traits<Packet>::size%8)==0,
typename unpacket_traits<Packet>::half,Packet>::type
714 predux_half_dowto4(
const Packet& a)
718 template <
typename Packet,
typename Op>
719 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type
720 predux_helper(
const Packet& a, Op op) {
721 typedef typename unpacket_traits<Packet>::type Scalar;
722 const size_t n = unpacket_traits<Packet>::size;
724 pstoreu<Scalar>(elements, a);
725 for(
size_t k = n / 2; k > 0; k /= 2) {
726 for(
size_t i = 0; i < k; ++i) {
727 elements[i] = op(elements[i], elements[i + k]);
734 template<
typename Packet>
735 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type
736 predux(
const Packet& a)
742 template <
typename Packet>
743 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_mul(
745 typedef typename unpacket_traits<Packet>::type Scalar;
746 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmul<Scalar>)));
750 template <
typename Packet>
751 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
753 typedef typename unpacket_traits<Packet>::type Scalar;
754 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<PropagateFast, Scalar>)));
757 template <
int NaNPropagation,
typename Packet>
758 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_min(
760 typedef typename unpacket_traits<Packet>::type Scalar;
761 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmin<NaNPropagation, Scalar>)));
765 template <
typename Packet>
766 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
768 typedef typename unpacket_traits<Packet>::type Scalar;
769 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<PropagateFast, Scalar>)));
772 template <
int NaNPropagation,
typename Packet>
773 EIGEN_DEVICE_FUNC
inline typename unpacket_traits<Packet>::type predux_max(
775 typedef typename unpacket_traits<Packet>::type Scalar;
776 return predux_helper(a, EIGEN_BINARY_OP_NAN_PROPAGATION(Scalar, (pmax<NaNPropagation, Scalar>)));
779 #undef EIGEN_BINARY_OP_NAN_PROPAGATION
791 template<
typename Packet> EIGEN_DEVICE_FUNC
inline bool predux_any(
const Packet& a)
799 typedef typename unpacket_traits<Packet>::type Scalar;
800 return numext::not_equal_strict(predux(a), Scalar(0));
809 template<
typename Packet>
810 inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
812 pstore(to, pset1<Packet>(a));
816 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
817 pmadd(
const Packet& a,
820 {
return padd(pmul(a, b),c); }
824 template<
typename Packet,
int Alignment>
825 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt(
const typename unpacket_traits<Packet>::type* from)
827 if(Alignment >= unpacket_traits<Packet>::alignment)
828 return pload<Packet>(from);
830 return ploadu<Packet>(from);
835 template<
typename Scalar,
typename Packet,
int Alignment>
836 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
void pstoret(Scalar* to,
const Packet& from)
838 if(Alignment >= unpacket_traits<Packet>::alignment)
849 template<
typename Packet,
int LoadMode>
850 EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet ploadt_ro(
const typename unpacket_traits<Packet>::type* from)
852 return ploadt<Packet, LoadMode>(from);
860 #if !defined(EIGEN_GPUCC)
862 template<>
inline std::complex<float> pmul(
const std::complex<float>& a,
const std::complex<float>& b)
863 {
return std::complex<float>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
865 template<>
inline std::complex<double> pmul(
const std::complex<double>& a,
const std::complex<double>& b)
866 {
return std::complex<double>(a.real()*b.real() - a.imag()*b.imag(), a.imag()*b.real() + a.real()*b.imag()); }
875 template <typename Packet,int N=unpacket_traits<Packet>::size>
struct PacketBlock {
879 template<
typename Packet> EIGEN_DEVICE_FUNC
inline void
892 template<
typename Packet> EIGEN_DEVICE_FUNC
inline Packet
894 return ifPacket.select[0] ? thenPacket : elsePacket;
904 template<
typename Packet> EIGEN_STRONG_INLINE Packet
905 pfrexp_float(
const Packet& a, Packet& exponent);
910 template<
typename Packet> EIGEN_STRONG_INLINE Packet
911 pldexp_float(Packet a, Packet exponent);
916 template<
typename Packet> EIGEN_STRONG_INLINE Packet
917 pldexp_double(Packet a, Packet exponent);
923 #endif // EIGEN_GENERIC_PACKET_MATH_H