12#ifndef QDP_SCALARSITE_SSE_VECTOR_H
13#define QDP_SCALARSITE_SSE_VECTOR_H
15#error "THIS IS UNUSED AT THE MOMENT"
33typedef PDWVector<float,4> PDWVectorFloat4;
53 v4sf tmp = _mm_add_ps(l, r);
62 return _mm_sub_ps(l, r);
70 return _mm_mul_ps(l, r);
78 return _mm_div_ps(l, r);
91template<>
class PDWVector<float,4> :
public PVector<float, 4, PDWVector>
95 static const int N = 4;
102 PDWVector(
const WordType<float>::Type_t& rhs)
104 for(
int i=0; i < N; ++i)
110 PDWVector(
const PDWVector<T1,N>& rhs)
112 for(
int i=0; i < N; ++i)
113 elem(i) = rhs.elem(i);
118 PDWVector(
const T1& rhs)
120 for(
int i=0; i < N; ++i)
126 PDWVector(
const v4sf& rhs)
137 PDWVector& operator=(
const PScalar<T1>& rhs)
139 for(
int i=0; i < N; ++i)
140 elem(i) = rhs.elem();
148 PDWVector& operator+=(
const PScalar<T1>& rhs)
150 for(
int i=0; i < N; ++i)
151 elem(i) += rhs.elem();
159 PDWVector& operator-=(
const PScalar<T1>& rhs)
161 for(
int i=0; i < N; ++i)
162 elem(i) -= rhs.elem();
170 PDWVector& operator*=(
const PScalar<T1>& rhs)
172 for(
int i=0; i < N; ++i)
173 elem(i) *= rhs.elem();
181 PDWVector& operator/=(
const PScalar<T1>& rhs)
183 for(
int i=0; i < N; ++i)
184 elem(i) /= rhs.elem();
194 PDWVector& operator=(
const PDWVector& rhs)
202 PDWVector& operator+=(
const PDWVector& rhs)
204 F.v = _mm_add_ps(F.v, rhs.F.v);
210 PDWVector& operator-=(
const PDWVector& rhs)
212 F.v = _mm_sub_ps(F.v, rhs.F.v);
218 PDWVector& operator*=(
const PDWVector& rhs)
220 F.v = _mm_mul_ps(F.v, rhs.F.v);
226 PDWVector& operator/=(
const PDWVector& rhs)
228 F.v = _mm_div_ps(F.v, rhs.F.v);
234 PDWVector(
const PDWVector& a)
247 inline T* data() {
return F.a;}
251 T& elem(
int i) {
return F.a[i];}
252 const T& elem(
int i)
const {
return F.a[i];}
254 v4sf& elem_v() {
return F.v;}
255 const v4sf elem_v()
const {
return F.v;}
274inline PDWVectorFloat4
275operator+(
const PDWVectorFloat4& l,
const PDWVectorFloat4& r)
277#if defined(QDP_SCALARSITE_DEBUG)
278 cout <<
"DWV+DWV" << endl;
281 return _mm_add_ps(l.elem_v(), r.elem_v());
288inline PDWVectorFloat4
289operator-(
const PDWVectorFloat4& l,
const PDWVectorFloat4& r)
291#if defined(QDP_SCALARSITE_DEBUG)
292 cout <<
"DWV-DWV" << endl;
295 return _mm_sub_ps(l.elem_v(), r.elem_v());
302inline PDWVectorFloat4
303operator*(
const PDWVectorFloat4& l,
const PDWVectorFloat4& r)
305#if defined(QDP_SCALARSITE_DEBUG)
306 cout <<
"DWV * DWV" << endl;
309 return _mm_mul_ps(l.elem_v(), r.elem_v());
314inline PDWVectorFloat4
317#if defined(QDP_SCALARSITE_DEBUG)
318 cout <<
"P * DWV" << endl;
321 v4sf x = _mm_load_ss((
float*)&(l.elem()));
322 x = _mm_shuffle_ps(x,x,0);
324 return _mm_mul_ps(x, r.elem_v());
329inline PDWVectorFloat4
332#if defined(QDP_SCALARSITE_DEBUG)
333 cout <<
"DWV * P" << endl;
336 v4sf x = _mm_load_ss((
float*)&(r.elem()));
338 x = _mm_shuffle_ps(x,x,0);
339 return _mm_mul_ps(l.elem_v(), x);
347inline PDWVectorFloat4
348operator/(
const PDWVectorFloat4& l,
const PDWVectorFloat4& r)
350#if defined(QDP_SCALARSITE_DEBUG)
351 cout <<
"DWV / DWV" << endl;
354 return _mm_mul_ps(l.elem_v(), r.elem_v());
363operator+(
const RComplexFloat4& l,
const RComplexFloat4& r)
365#if defined(QDP_SCALARSITE_DEBUG)
366 cout <<
"C<DWV> + C<DWV>" << endl;
369 return RComplexFloat4(_mm_add_ps(l.real().elem_v(), r.real().elem_v()),
370 _mm_add_ps(l.imag().elem_v(), r.imag().elem_v()));
378operator-(
const RComplexFloat4& l,
const RComplexFloat4& r)
380#if defined(QDP_SCALARSITE_DEBUG)
381 cout <<
"C<DWV> - C<DWV" << endl;
384 return RComplexFloat4(_mm_sub_ps(l.real().elem_v(), r.real().elem_v()),
385 _mm_sub_ps(l.imag().elem_v(), r.imag().elem_v()));
393operator*(
const RComplexFloat4& l,
const RComplexFloat4& r)
397#if defined(QDP_SCALARSITE_DEBUG)
398 cout <<
"C<DWV> * C<DWV>" << endl;
401 v4sf tmp1 = _mm_mul_ps(l.real().elem_v(), r.real().elem_v());
402 v4sf tmp2 = _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v());
403 d.real().elem_v() = _mm_sub_ps(tmp1, tmp2);
405 v4sf tmp3 = _mm_mul_ps(l.real().elem_v(), r.imag().elem_v());
406 v4sf tmp4 = _mm_mul_ps(l.imag().elem_v(), r.real().elem_v());
407 d.imag().elem_v() = _mm_add_ps(tmp3, tmp4);
416adjMultiply(
const RComplexFloat4& l,
const RComplexFloat4& r)
418#if defined(QDP_SCALARSITE_DEBUG)
419 cout <<
"adj(C<DWV>) * C<DWV>" << endl;
424 v4sf tmp1 = _mm_mul_ps(l.real().elem_v(), r.real().elem_v());
425 v4sf tmp2 = _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v());
426 d.real().elem_v() = _mm_add_ps(tmp1, tmp2);
428 v4sf tmp3 = _mm_mul_ps(l.real().elem_v(), r.imag().elem_v());
429 v4sf tmp4 = _mm_mul_ps(l.imag().elem_v(), r.real().elem_v());
430 d.imag().elem_v() = _mm_sub_ps(tmp3, tmp4);
438multiplyAdj(
const RComplexFloat4& l,
const RComplexFloat4& r)
442 v4sf tmp1 = _mm_mul_ps(l.real().elem_v(), r.real().elem_v());
443 v4sf tmp2 = _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v());
444 d.real().elem_v() = _mm_add_ps(tmp1, tmp2);
446 v4sf tmp3 = _mm_mul_ps(l.imag().elem_v(), r.real().elem_v());
447 v4sf tmp4 = _mm_mul_ps(l.real().elem_v(), r.imag().elem_v());
448 d.imag().elem_v() = _mm_sub_ps(tmp3, tmp4);
463 } sse_mask __attribute__ ((aligned (16)));
465 static sse_mask _sse_sgn __attribute__ ((unused)) ={0x80000000, 0x80000000, 0x80000000, 0x80000000};
467 v4sf tmp1 = _mm_mul_ps(l.real().elem_v(), r.real().elem_v());
468 v4sf tmp2 = _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v());
469 d.real().elem_v() = _mm_sub_ps(tmp1, tmp2);
471 v4sf tmp3 = _mm_mul_ps(l.real().elem_v(), r.imag().elem_v());
472 v4sf tmp4 = _mm_mul_ps(l.imag().elem_v(), r.real().elem_v());
473 v4sf tmp5 = _mm_add_ps(tmp3, tmp4);
475 v4sf tmp6 = _mm_load_ps((
float*)&_sse_sgn);
476 d.imag().elem_v() = _mm_xor_ps(tmp5, tmp6);
486#if defined(QDP_SCALARSITE_DEBUG)
487#undef QDP_SCALARSITE_DEBUG
BinaryReturn< IScalar< T1 >, IScalar< T2 >, OpAdjMultiplyAdj >::Type_t adjMultiplyAdj(const IScalar< T1 > &l, const IScalar< T2 > &r)
BinaryReturn< IScalar< T1 >, IScalar< T2 >, OpMultiplyAdj >::Type_t multiplyAdj(const IScalar< T1 > &l, const IScalar< T2 > &r)
BinaryReturn< IScalar< T1 >, IScalar< T2 >, OpAdjMultiply >::Type_t adjMultiply(const IScalar< T1 > &l, const IScalar< T2 > &r)
RComplex< BAGELQDPFloat > RComplexFloat
StandardOutputStream cout
Yet another random number generator.
MakeReturn< BinaryNode< OpMultiply, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpMultiply >::Type_t >::Expression_t operator*(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
MakeReturn< BinaryNode< OpAdd, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpAdd >::Type_t >::Expression_t operator+(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
MakeReturn< BinaryNode< OpSubtract, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpSubtract >::Type_t >::Expression_t operator-(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
MakeReturn< BinaryNode< OpDivide, typenameCreateLeaf< QDPType< T1, C1 > >::Leaf_t, typenameCreateLeaf< QDPExpr< T2, C2 > >::Leaf_t >, typenameBinaryReturn< C1, C2, OpDivide >::Type_t >::Expression_t operator/(const QDPType< T1, C1 > &l, const QDPExpr< T2, C2 > &r)
Promote< T1, T2 >::Type_t Type_t