diff --git a/Eigen/src/Core/arch/AltiVec/PacketMath.h b/Eigen/src/Core/arch/AltiVec/PacketMath.h index efb4f62d1..dc34ebbd6 100644 --- a/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -295,15 +295,17 @@ template<> EIGEN_STRONG_INLINE Packet4i ploadu(const int* from) template<> EIGEN_STRONG_INLINE Packet4f ploaddup(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(from); + else p = ploadu(from); + return vec_perm(p, p, p16uc_DUPLICATE); } template<> EIGEN_STRONG_INLINE Packet4i ploaddup(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(from); + else p = ploadu(from); + return vec_perm(p, p, p16uc_DUPLICATE); } template<> EIGEN_STRONG_INLINE void pstore(float* to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }