From 504d3a3586ffb56ffe9cdf10e4b784d51d8d1eeb Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Thu, 8 Jul 2010 23:31:14 +0200 Subject: [PATCH] fix SliceVectorizedTraversal for packetsize==1 --- Eigen/src/Core/Assign.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h index a2ca35d3e..6b114ac30 100644 --- a/Eigen/src/Core/Assign.h +++ b/Eigen/src/Core/Assign.h @@ -443,12 +443,18 @@ struct ei_assign_impl typedef typename Derived1::Index Index; inline static void run(Derived1 &dst, const Derived2 &src) { - const Index packetSize = ei_packet_traits::size; + typedef ei_packet_traits PacketTraits; + enum { + packetSize = PacketTraits::size, + alignable = PacketTraits::AlignedOnScalar, + dstAlignment = alignable ? Aligned : int(ei_assign_traits::DstIsAligned) , + srcAlignment = ei_assign_traits::JointAlignment + }; const Index packetAlignedMask = packetSize - 1; const Index innerSize = dst.innerSize(); const Index outerSize = dst.outerSize(); - const Index alignedStep = (packetSize - dst.outerStride() % packetSize) & packetAlignedMask; - Index alignedStart = ei_assign_traits::DstIsAligned ? 0 + const Index alignedStep = alignable ? (packetSize - dst.outerStride() % packetSize) & packetAlignedMask : 0; + Index alignedStart = ((!alignable) || ei_assign_traits::DstIsAligned) ? 0 : ei_first_aligned(&dst.coeffRef(0,0), innerSize); for(Index outer = 0; outer < outerSize; ++outer)