fix AltiVec ploaddup

This commit is contained in:
Gael Guennebaud 2011-02-24 00:23:50 +03:00
parent 28d17c5390
commit bb9a465c5a

View File

@ -295,15 +295,17 @@ template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
{
Packet16uc tmp;
tmp = vec_ld(0, (unsigned char *)from); // most significant quadword
return (Packet4f) vec_perm(tmp, tmp, p16uc_DUPLICATE);
Packet4f p;
if((ptrdiff_t(&from) % 16) == 0) p = pload<Packet4f>(from);
else p = ploadu<Packet4f>(from);
return vec_perm(p, p, p16uc_DUPLICATE);
}
template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from)
{
Packet16uc tmp;
tmp = vec_ld(0, (unsigned char *)from); // most significant quadword
return (Packet4i) vec_perm(tmp, tmp, p16uc_DUPLICATE);
Packet4i p;
if((ptrdiff_t(&from) % 16) == 0) p = pload<Packet4i>(from);
else p = ploadu<Packet4i>(from);
return vec_perm(p, p, p16uc_DUPLICATE);
}
template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }