diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-06-14 15:04:07 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-06-14 15:04:07 +0200 |
commit | 972a535288c5aaa62b66d43e1825e3b4eed7d234 (patch) | |
tree | 2f961167811c8876f6a4bf1e9c4e4d17c818c51b /Eigen/src/Core/AssignEvaluator.h | |
parent | e5b490b6542c444aa8e263e50c50e09a4201c99f (diff) |
Remove aligned-on-scalar assert and fallback to non vectorized path at runtime (first_aligned already had this runtime guard)
Diffstat (limited to 'Eigen/src/Core/AssignEvaluator.h')
-rw-r--r-- | Eigen/src/Core/AssignEvaluator.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/Eigen/src/Core/AssignEvaluator.h b/Eigen/src/Core/AssignEvaluator.h index 506bace69..4622e2759 100644 --- a/Eigen/src/Core/AssignEvaluator.h +++ b/Eigen/src/Core/AssignEvaluator.h @@ -471,18 +471,25 @@ struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, NoUnrolling> { EIGEN_DEVICE_FUNC static inline void run(Kernel &kernel) { - typedef packet_traits<typename Kernel::Scalar> PacketTraits; + typedef typename Kernel::Scalar Scalar; + typedef packet_traits<Scalar> PacketTraits; enum { packetSize = PacketTraits::size, alignable = PacketTraits::AlignedOnScalar, - dstAlignment = alignable ? Aligned : int(Kernel::AssignmentTraits::DstIsAligned) + dstIsAligned = Kernel::AssignmentTraits::DstIsAligned, + dstAlignment = alignable ? Aligned : int(dstIsAligned) }; + const Scalar *dst_ptr = &kernel.dstEvaluator().coeffRef(0,0); + if((!bool(dstIsAligned)) && (Index(dst_ptr) % sizeof(Scalar))>0) + { + // the pointer is not aligend-on scalar, so alignment is not possible + return dense_assignment_loop<Kernel,DefaultTraversal,NoUnrolling>::run(kernel); + } const Index packetAlignedMask = packetSize - 1; const Index innerSize = kernel.innerSize(); const Index outerSize = kernel.outerSize(); const Index alignedStep = alignable ? (packetSize - kernel.outerStride() % packetSize) & packetAlignedMask : 0; - Index alignedStart = ((!alignable) || Kernel::AssignmentTraits::DstIsAligned) ? 0 - : internal::first_aligned(&kernel.dstEvaluator().coeffRef(0,0), innerSize); + Index alignedStart = ((!alignable) || bool(dstIsAligned)) ? 0 : internal::first_aligned(dst_ptr, innerSize); for(Index outer = 0; outer < outerSize; ++outer) { |