diff options
author | 2010-07-08 14:27:47 +0200 | |
---|---|---|
committer | 2010-07-08 14:27:47 +0200 | |
commit | 300a226ffa6f51ff8be00b1d01ce34fbdc303033 (patch) | |
tree | 44e0a72f8ca422f611470971911cddba406c1cc1 /Eigen/src/Core | |
parent | 2a1500915aae55c97e811b7d48707a072a078ada (diff) |
scalars fitting in a single packet requires more work, step 1
* add a, Alignable trait
* update LinearVectorization assignment
Diffstat (limited to 'Eigen/src/Core')
-rw-r--r-- | Eigen/src/Core/Assign.h | 9 | ||||
-rw-r--r-- | Eigen/src/Core/GenericPacketMath.h | 3 | ||||
-rw-r--r-- | Eigen/src/Core/arch/AltiVec/PacketMath.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/arch/NEON/PacketMath.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/arch/SSE/Complex.h | 2 | ||||
-rw-r--r-- | Eigen/src/Core/arch/SSE/PacketMath.h | 3 |
6 files changed, 18 insertions, 3 deletions
diff --git a/Eigen/src/Core/Assign.h b/Eigen/src/Core/Assign.h index 2a7ca4786..a2ca35d3e 100644 --- a/Eigen/src/Core/Assign.h +++ b/Eigen/src/Core/Assign.h @@ -397,7 +397,12 @@ struct ei_assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling EIGEN_STRONG_INLINE static void run(Derived1 &dst, const Derived2 &src) { const Index size = dst.size(); - const Index packetSize = ei_packet_traits<typename Derived1::Scalar>::size; + typedef ei_packet_traits<typename Derived1::Scalar> PacketTraits; + enum { + packetSize = PacketTraits::size, + dstAlignment = PacketTraits::AlignedOnScalar ? Aligned : int(ei_assign_traits<Derived1,Derived2>::DstIsAligned) , + srcAlignment = ei_assign_traits<Derived1,Derived2>::JointAlignment + }; const Index alignedStart = ei_assign_traits<Derived1,Derived2>::DstIsAligned ? 0 : ei_first_aligned(&dst.coeffRef(0), size); const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize; @@ -406,7 +411,7 @@ struct ei_assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling for(Index index = alignedStart; index < alignedEnd; index += packetSize) { - dst.template copyPacket<Derived2, Aligned, ei_assign_traits<Derived1,Derived2>::JointAlignment>(index, src); + dst.template copyPacket<Derived2, dstAlignment, srcAlignment>(index, src); } ei_unaligned_assign_impl<>::run(src,dst,alignedEnd,size); diff --git a/Eigen/src/Core/GenericPacketMath.h b/Eigen/src/Core/GenericPacketMath.h index 77b1d748e..d290074e5 100644 --- a/Eigen/src/Core/GenericPacketMath.h +++ b/Eigen/src/Core/GenericPacketMath.h @@ -84,7 +84,8 @@ template<typename T> struct ei_packet_traits : ei_default_packet_traits typedef T type; enum { Vectorizable = 0, - size = 1 + size = 1, + AlignedOnScalar = 0 }; enum { HasAdd = 0, diff --git a/Eigen/src/Core/arch/AltiVec/PacketMath.h b/Eigen/src/Core/arch/AltiVec/PacketMath.h index 9e6a375ea..f58da60e6 100644 --- a/Eigen/src/Core/arch/AltiVec/PacketMath.h +++ b/Eigen/src/Core/arch/AltiVec/PacketMath.h @@ -88,6 +88,7 @@ template<> struct ei_packet_traits<float> : ei_default_packet_traits typedef Packet4f type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size=4, // FIXME check the Has* @@ -104,6 +105,7 @@ template<> struct ei_packet_traits<int> : ei_default_packet_traits enum { // FIXME check the Has* Vectorizable = 1, + AlignedOnScalar = 1, size=4 }; }; diff --git a/Eigen/src/Core/arch/NEON/PacketMath.h b/Eigen/src/Core/arch/NEON/PacketMath.h index aaa27b56d..97750adbe 100644 --- a/Eigen/src/Core/arch/NEON/PacketMath.h +++ b/Eigen/src/Core/arch/NEON/PacketMath.h @@ -62,6 +62,7 @@ template<> struct ei_packet_traits<float> : ei_default_packet_traits typedef Packet4f type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size = 4, // FIXME check the Has* @@ -77,6 +78,7 @@ template<> struct ei_packet_traits<int> : ei_default_packet_traits typedef Packet4i type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size=4 // FIXME check the Has* }; diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h index b288c4cdc..6b73a42f9 100644 --- a/Eigen/src/Core/arch/SSE/Complex.h +++ b/Eigen/src/Core/arch/SSE/Complex.h @@ -38,6 +38,7 @@ template<> struct ei_packet_traits<std::complex<float> > : ei_default_packet_tr typedef Packet2cf type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size = 2, HasAdd = 1, @@ -224,6 +225,7 @@ template<> struct ei_packet_traits<std::complex<double> > : ei_default_packet_t typedef Packet1cd type; enum { Vectorizable = 1, + AlignedOnScalar = 0, size = 1, HasAdd = 1, diff --git a/Eigen/src/Core/arch/SSE/PacketMath.h b/Eigen/src/Core/arch/SSE/PacketMath.h index 9382fbde5..bfbc74370 100644 --- a/Eigen/src/Core/arch/SSE/PacketMath.h +++ b/Eigen/src/Core/arch/SSE/PacketMath.h @@ -67,6 +67,7 @@ template<> struct ei_packet_traits<float> : ei_default_packet_traits typedef Packet4f type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size=4, HasDiv = 1, @@ -82,6 +83,7 @@ template<> struct ei_packet_traits<double> : ei_default_packet_traits typedef Packet2d type; enum { Vectorizable = 1, + AlignedOnScalar = 1, size=2, HasDiv = 1 @@ -93,6 +95,7 @@ template<> struct ei_packet_traits<int> : ei_default_packet_traits enum { // FIXME check the Has* Vectorizable = 1, + AlignedOnScalar = 1, size=4 }; }; |