aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core/AssignEvaluator.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-06-14 15:04:07 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-06-14 15:04:07 +0200
commit972a535288c5aaa62b66d43e1825e3b4eed7d234 (patch)
tree2f961167811c8876f6a4bf1e9c4e4d17c818c51b /Eigen/src/Core/AssignEvaluator.h
parente5b490b6542c444aa8e263e50c50e09a4201c99f (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.h15
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)
{