22 #ifndef _BLAZE_MATH_EXPRESSIONS_TDVECDVECMULTEXPR_H_
23 #define _BLAZE_MATH_EXPRESSIONS_TDVECDVECMULTEXPR_H_
31 #include <boost/type_traits/remove_reference.hpp>
56 struct TDVecDVecMultExprHelper
60 typedef typename boost::remove_reference< typename T1::CompositeType >::type CT1;
63 typedef typename boost::remove_reference< typename T2::CompositeType >::type CT2;
67 enum { value = CT1::vectorizable &&
69 IsSame< typename CT1::ElementType, typename CT2::ElementType>::value &&
70 IntrinsicTrait< typename CT1::ElementType >::addition &&
71 IntrinsicTrait< typename CT2::ElementType >::multiplication };
112 template<
typename T1
114 inline typename DisableIf< TDVecDVecMultExprHelper<T1,T2>,
115 const typename MultTrait<typename T1::ElementType,typename T2::ElementType>::Type >::Type
118 if( (~lhs).size() != (~rhs).size() )
119 throw std::invalid_argument(
"Vector sizes do not match" );
121 typedef typename T1::CompositeType Lhs;
122 typedef typename T2::CompositeType Rhs;
123 typedef typename T1::ElementType ET1;
124 typedef typename T2::ElementType ET2;
127 if( (~lhs).size() == 0UL )
return MultType();
132 MultType sp( left[0UL] * right[0UL] );
134 for(
size_t i=1UL; i<left.size(); ++i )
135 sp += left[i] * right[i];
170 template<
typename T1
172 inline typename EnableIf< TDVecDVecMultExprHelper<T1,T2>,
173 const typename MultTrait<typename T1::ElementType,typename T2::ElementType>::Type >::Type
174 operator*(
const DenseVector<T1,true>& lhs,
const DenseVector<T2,false>& rhs )
176 if( (~lhs).size() != (~rhs).size() )
177 throw std::invalid_argument(
"Vector sizes do not match" );
179 typedef typename T1::CompositeType Lhs;
180 typedef typename T2::CompositeType Rhs;
181 typedef typename T1::ElementType ET1;
182 typedef typename T2::ElementType ET2;
183 typedef typename MultTrait<ET1,ET2>::Type MultType;
184 typedef IntrinsicTrait<MultType> IT;
186 if( (~lhs).size() == 0UL )
return MultType();
191 typename IT::Type xmm1, xmm2, xmm3, xmm4;
194 const size_t N ( left.size() );
195 const size_t end( N - N % (IT::size*4UL) );
197 for(
size_t i=0UL; i<end; i+=IT::size*4UL ) {
198 xmm1 = xmm1 + ( left.get(i ) * right.get(i ) );
199 xmm2 = xmm2 + ( left.get(i+IT::size ) * right.get(i+IT::size ) );
200 xmm3 = xmm3 + ( left.get(i+IT::size*2UL) * right.get(i+IT::size*2UL) );
201 xmm4 = xmm4 + ( left.get(i+IT::size*3UL) * right.get(i+IT::size*3UL) );
204 MultType array[IT::size];
205 store( array, xmm1 + xmm2 + xmm3 + xmm4 );
207 for(
size_t i=0UL; i<IT::size; ++i )
209 for(
size_t i=end; i<N; ++i )
210 sp += left[i] * right[i];