26 #ifndef EIGEN_GENERIC_PACKET_MATH_H
27 #define EIGEN_GENERIC_PACKET_MATH_H
41 #ifndef EIGEN_DEBUG_ALIGNED_LOAD
42 #define EIGEN_DEBUG_ALIGNED_LOAD
45 #ifndef EIGEN_DEBUG_UNALIGNED_LOAD
46 #define EIGEN_DEBUG_UNALIGNED_LOAD
49 #ifndef EIGEN_DEBUG_ALIGNED_STORE
50 #define EIGEN_DEBUG_ALIGNED_STORE
53 #ifndef EIGEN_DEBUG_UNALIGNED_STORE
54 #define EIGEN_DEBUG_UNALIGNED_STORE
57 struct default_packet_traits
86 template<
typename T>
struct packet_traits : default_packet_traits
109 template<
typename Packet>
inline Packet
111 const Packet& b) {
return a+b; }
114 template<
typename Packet>
inline Packet
116 const Packet& b) {
return a-b; }
119 template<
typename Packet>
inline Packet
123 template<
typename Packet>
inline Packet
127 template<
typename Packet>
inline Packet
129 const Packet& b) {
return a*b; }
132 template<
typename Packet>
inline Packet
134 const Packet& b) {
return a/b; }
137 template<
typename Packet>
inline Packet
139 const Packet& b) {
using std::min;
return (min)(a, b); }
142 template<
typename Packet>
inline Packet
144 const Packet& b) {
using std::max;
return (max)(a, b); }
147 template<
typename Packet>
inline Packet
151 template<
typename Packet>
inline Packet
152 pand(
const Packet& a,
const Packet& b) {
return a & b; }
155 template<
typename Packet>
inline Packet
156 por(
const Packet& a,
const Packet& b) {
return a | b; }
159 template<
typename Packet>
inline Packet
160 pxor(
const Packet& a,
const Packet& b) {
return a ^ b; }
163 template<
typename Packet>
inline Packet
164 pandnot(
const Packet& a,
const Packet& b) {
return a & (!b); }
167 template<
typename Packet>
inline Packet
168 pload(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
171 template<
typename Packet>
inline Packet
172 ploadu(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
175 template<
typename Packet>
inline Packet
176 ploaddup(
const typename unpacket_traits<Packet>::type* from) {
return *from; }
179 template<
typename Packet>
inline Packet
180 pset1(
const typename unpacket_traits<Packet>::type& a) {
return a; }
183 template<
typename Scalar>
inline typename packet_traits<Scalar>::type
184 plset(
const Scalar& a) {
return a; }
187 template<
typename Scalar,
typename Packet>
inline void pstore(Scalar* to,
const Packet& from)
191 template<
typename Scalar,
typename Packet>
inline void pstoreu(Scalar* to,
const Packet& from)
195 template<
typename Scalar>
inline void prefetch(
const Scalar* addr)
197 #if !defined(_MSC_VER)
198 __builtin_prefetch(addr);
203 template<
typename Packet>
inline typename unpacket_traits<Packet>::type
pfirst(
const Packet& a)
207 template<
typename Packet>
inline Packet
208 preduxp(
const Packet* vecs) {
return vecs[0]; }
211 template<
typename Packet>
inline typename unpacket_traits<Packet>::type
predux(
const Packet& a)
215 template<
typename Packet>
inline typename unpacket_traits<Packet>::type
predux_mul(
const Packet& a)
219 template<
typename Packet>
inline typename unpacket_traits<Packet>::type
predux_min(
const Packet& a)
223 template<
typename Packet>
inline typename unpacket_traits<Packet>::type
predux_max(
const Packet& a)
227 template<
typename Packet>
inline Packet
preverse(
const Packet& a)
232 template<
typename Packet>
inline Packet
pcplxflip(
const Packet& a)
241 Packet
psin(
const Packet& a) {
return sin(a); }
245 Packet
pcos(
const Packet& a) {
return cos(a); }
249 Packet
ptan(
const Packet& a) {
return tan(a); }
261 Packet
pexp(
const Packet& a) {
return exp(a); }
265 Packet
plog(
const Packet& a) {
return log(a); }
277 template<
typename Packet>
278 inline void pstore1(
typename unpacket_traits<Packet>::type* to,
const typename unpacket_traits<Packet>::type& a)
280 pstore(to, pset1<Packet>(a));
284 template<
typename Packet>
inline Packet
292 template<
typename Packet,
int LoadMode>
293 inline Packet
ploadt(
const typename unpacket_traits<Packet>::type* from)
296 return pload<Packet>(from);
298 return ploadu<Packet>(from);
303 template<
typename Scalar,
typename Packet,
int LoadMode>
304 inline void pstoret(Scalar* to,
const Packet& from)
313 template<
int Offset,
typename PacketType>
317 static inline void run(PacketType&,
const PacketType&) {}
322 template<
int Offset,
typename PacketType>
323 inline void palign(PacketType& first,
const PacketType& second)
325 palign_impl<Offset,PacketType>::run(first,second);
332 template<>
inline std::complex<float>
pmul(
const std::complex<float>& a,
const std::complex<float>& b)
335 template<>
inline std::complex<double>
pmul(
const std::complex<double>& a,
const std::complex<double>& b)
342 #endif // EIGEN_GENERIC_PACKET_MATH_H