aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Core
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2010-07-08 14:27:47 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2010-07-08 14:27:47 +0200
commit300a226ffa6f51ff8be00b1d01ce34fbdc303033 (patch)
tree44e0a72f8ca422f611470971911cddba406c1cc1 /Eigen/src/Core
parent2a1500915aae55c97e811b7d48707a072a078ada (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.h9
-rw-r--r--Eigen/src/Core/GenericPacketMath.h3
-rw-r--r--Eigen/src/Core/arch/AltiVec/PacketMath.h2
-rw-r--r--Eigen/src/Core/arch/NEON/PacketMath.h2
-rw-r--r--Eigen/src/Core/arch/SSE/Complex.h2
-rw-r--r--Eigen/src/Core/arch/SSE/PacketMath.h3
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
};
};