25 #ifndef EIGEN_COMPLEX_ALTIVEC_H
26 #define EIGEN_COMPLEX_ALTIVEC_H
35 static Packet16uc p16uc_COMPLEX_REV = vec_sld(p16uc_REVERSE, p16uc_REVERSE, 8);
36 static Packet16uc p16uc_COMPLEX_REV2 = vec_sld(p16uc_FORWARD, p16uc_FORWARD, 8);
48 template<>
struct packet_traits<std::complex<float> > : default_packet_traits
50 typedef Packet2cf type;
69 template<>
struct unpacket_traits<Packet2cf> {
typedef std::complex<float> type;
enum {size=2}; };
75 if((ptrdiff_t(&from) % 16) == 0)
79 res.v = vec_perm(res.v, res.v, p16uc_PSET_HI);
93 v1 = vec_perm(a.v, a.v, p16uc_COMPLEX_RE);
95 v2 = vec_perm(a.v, a.v, p16uc_COMPLEX_IM);
97 v1 = vec_madd(v1, b.v, p4f_ZERO);
99 v2 = vec_madd(v2, b.v, p4f_ZERO);
102 v2 = vec_perm(v2, v2, p16uc_COMPLEX_REV);
104 return Packet2cf(vec_add(v1, v2));
128 pstore((
float *)&res, a.v);
136 rev_a = vec_perm(a.v, a.v, p16uc_COMPLEX_REV2);
137 return Packet2cf(rev_a);
143 b = (
Packet4f) vec_sld(a.v, a.v, 8);
145 return pfirst(Packet2cf(b));
152 b1 = (
Packet4f) vec_sld(vecs[0].v, vecs[1].v, 8);
153 b2 = (
Packet4f) vec_sld(vecs[1].v, vecs[0].v, 8);
157 return Packet2cf(b2);
164 b = (
Packet4f) vec_sld(a.v, a.v, 8);
165 prod =
pmul(a, Packet2cf(b));
171 struct palign_impl<Offset,Packet2cf>
177 first.v = vec_sld(first.v, second.v, 8);
182 template<>
struct conj_helper<Packet2cf, Packet2cf, false,true>
193 template<>
struct conj_helper<Packet2cf, Packet2cf, true,false>
204 template<>
struct conj_helper<Packet2cf, Packet2cf, true,true>
218 Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().
pmul(a,b);
219 Packet4f s = vec_madd(b.v, b.v, p4f_ZERO);
220 return Packet2cf(
pdiv(res.v, vec_add(s,vec_perm(s, s, p16uc_COMPLEX_REV))));
225 return Packet2cf(vec_perm(x.v, x.v, p16uc_COMPLEX_REV));
232 #endif // EIGEN_COMPLEX_ALTIVEC_H