10 #ifndef EIGEN_COMPLEX32_ALTIVEC_H 11 #define EIGEN_COMPLEX32_ALTIVEC_H 17 static Packet2ul p2ul_CONJ_XOR1 = (Packet2ul) vec_sld((Packet4ui) p2d_ZERO_, (Packet4ui) p2l_ZERO, 8);
18 static Packet2ul p2ul_CONJ_XOR2 = (Packet2ul) vec_sld((Packet4ui) p2l_ZERO, (Packet4ui) p2d_ZERO_, 8);
22 EIGEN_STRONG_INLINE Packet1cd() {}
23 EIGEN_STRONG_INLINE
explicit Packet1cd(
const Packet2d& a) : v(a) {}
27 template<>
struct packet_traits<
std::complex<double> > : default_packet_traits
29 typedef Packet1cd type;
30 typedef Packet1cd half;
50 template<>
struct unpacket_traits<Packet1cd> {
typedef std::complex<double> type;
enum {size=1, alignment=
Aligned16};
typedef Packet1cd half; };
52 template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(
const std::complex<double>* from) { EIGEN_DEBUG_ALIGNED_LOAD
return Packet1cd(pload<Packet2d>((
const double*)from)); }
53 template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(
const std::complex<double>* from) { EIGEN_DEBUG_UNALIGNED_LOAD
return Packet1cd(ploadu<Packet2d>((
const double*)from)); }
54 template<> EIGEN_STRONG_INLINE
void pstore <std::complex<double> >(std::complex<double> * to,
const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((
double*)to, from.v); }
55 template<> EIGEN_STRONG_INLINE
void pstoreu<std::complex<double> >(std::complex<double> * to,
const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((
double*)to, from.v); }
57 template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(
const std::complex<double>& from)
58 {
return ploadu<Packet1cd>(&from); }
60 template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(a.v + b.v); }
61 template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(a.v - b.v); }
62 template<> EIGEN_STRONG_INLINE Packet1cd pnegate(
const Packet1cd& a) {
return Packet1cd(pnegate(Packet2d(a.v))); }
63 template<> EIGEN_STRONG_INLINE Packet1cd pconj(
const Packet1cd& a) {
return Packet1cd((Packet2d)vec_xor((Packet2d)a.v, (Packet2d)p2ul_CONJ_XOR2)); }
65 template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(
const Packet1cd& a,
const Packet1cd& b)
67 Packet2d a_re, a_im, v1, v2;
70 a_re = vec_perm(a.v, a.v, p16uc_PSET64_HI);
72 a_im = vec_perm(a.v, a.v, p16uc_PSET64_LO);
74 v1 = vec_madd(a_re, b.v, p2d_ZERO);
76 v2 = vec_madd(a_im, b.v, p2d_ZERO);
77 v2 = (Packet2d) vec_sld((Packet4ui)v2, (Packet4ui)v2, 8);
78 v2 = (Packet2d) vec_xor((Packet2d)v2, (Packet2d) p2ul_CONJ_XOR1);
80 return Packet1cd(v1 + v2);
83 template<> EIGEN_STRONG_INLINE Packet1cd pand <Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(vec_and(a.v,b.v)); }
84 template<> EIGEN_STRONG_INLINE Packet1cd por <Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(vec_or(a.v,b.v)); }
85 template<> EIGEN_STRONG_INLINE Packet1cd pxor <Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(vec_xor(a.v,b.v)); }
86 template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(
const Packet1cd& a,
const Packet1cd& b) {
return Packet1cd(vec_and(a.v, vec_nor(b.v,b.v))); }
88 template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(
const std::complex<double>* from)
90 return pset1<Packet1cd>(*from);
93 template<> EIGEN_STRONG_INLINE
void prefetch<std::complex<double> >(
const std::complex<double> * addr) { EIGEN_ZVECTOR_PREFETCH(addr); }
95 template<> EIGEN_STRONG_INLINE std::complex<double> pfirst<Packet1cd>(
const Packet1cd& a)
97 std::complex<double> EIGEN_ALIGN16 res[2];
98 pstore<std::complex<double> >(res, a);
103 template<> EIGEN_STRONG_INLINE Packet1cd preverse(
const Packet1cd& a) {
return a; }
105 template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(
const Packet1cd& a)
110 template<> EIGEN_STRONG_INLINE Packet1cd preduxp<Packet1cd>(
const Packet1cd* vecs)
115 template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(
const Packet1cd& a)
121 struct palign_impl<Offset,Packet1cd>
123 static EIGEN_STRONG_INLINE
void run(Packet1cd& ,
const Packet1cd& )
130 template<>
struct conj_helper<Packet1cd, Packet1cd, false,true>
132 EIGEN_STRONG_INLINE Packet1cd pmadd(
const Packet1cd& x,
const Packet1cd& y,
const Packet1cd& c)
const 133 {
return padd(pmul(x,y),c); }
135 EIGEN_STRONG_INLINE Packet1cd pmul(
const Packet1cd& a,
const Packet1cd& b)
const 137 return internal::pmul(a, pconj(b));
141 template<>
struct conj_helper<Packet1cd, Packet1cd, true,false>
143 EIGEN_STRONG_INLINE Packet1cd pmadd(
const Packet1cd& x,
const Packet1cd& y,
const Packet1cd& c)
const 144 {
return padd(pmul(x,y),c); }
146 EIGEN_STRONG_INLINE Packet1cd pmul(
const Packet1cd& a,
const Packet1cd& b)
const 148 return internal::pmul(pconj(a), b);
152 template<>
struct conj_helper<Packet1cd, Packet1cd, true,true>
154 EIGEN_STRONG_INLINE Packet1cd pmadd(
const Packet1cd& x,
const Packet1cd& y,
const Packet1cd& c)
const 155 {
return padd(pmul(x,y),c); }
157 EIGEN_STRONG_INLINE Packet1cd pmul(
const Packet1cd& a,
const Packet1cd& b)
const 159 return pconj(internal::pmul(a, b));
163 template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(
const Packet1cd& a,
const Packet1cd& b)
166 Packet1cd res = conj_helper<Packet1cd,Packet1cd,false,true>().pmul(a,b);
167 Packet2d s = vec_madd(b.v, b.v, p2d_ZERO_);
168 return Packet1cd(pdiv(res.v, s + vec_perm(s, s, p16uc_REVERSE64)));
171 EIGEN_STRONG_INLINE Packet1cd pcplxflip(
const Packet1cd& x)
173 return Packet1cd(preverse(Packet2d(x.v)));
176 EIGEN_STRONG_INLINE
void ptranspose(PacketBlock<Packet1cd,2>& kernel)
178 Packet2d tmp = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_HI);
179 kernel.packet[1].v = vec_perm(kernel.packet[0].v, kernel.packet[1].v, p16uc_TRANSPOSE64_LO);
180 kernel.packet[0].v = tmp;
186 #endif // EIGEN_COMPLEX32_ALTIVEC_H Definition: Constants.h:230
Namespace containing all symbols from the Eigen library.
Definition: Core:271
Definition: Eigen_Colamd.h:50