10#ifndef QDP_SCALARVECSITE_SSE_LINALG_H
11#define QDP_SCALARVECSITE_SSE_LINALG_H
14#if defined(__GNUC__) && __GNUC_MINOR__ >= 2
22#define QDP_SCALARVECSITE_USE_EVALUATE
45operator+(
const ILatticeFloat& l,
const ILatticeFloat& r)
50 return Ret_t(_mm_add_ps(l.elem_v(), r.elem_v()));
56operator+(
const ILatticeFloat& l,
const IScalarFloat& r)
61 return Ret_t(_mm_add_ps(l.elem_v(), vmk1(r.elem())));
67operator+(
const IScalarFloat& l,
const ILatticeFloat& r)
72 return Ret_t(_mm_add_ps(vmk1(l.elem()), r.elem_v()));
80operator-(
const ILatticeFloat& l,
const ILatticeFloat& r)
85 return Ret_t(_mm_sub_ps(l.elem_v(), r.elem_v()));
91operator-(
const ILatticeFloat& l,
const IScalarFloat& r)
96 return Ret_t(_mm_sub_ps(l.elem_v(), vmk1(r.elem())));
102operator-(
const IScalarFloat& l,
const ILatticeFloat& r)
107 return Ret_t(_mm_sub_ps(vmk1(l.elem()), r.elem_v()));
115operator*(
const ILatticeFloat& l,
const ILatticeFloat& r)
120 return Ret_t(_mm_mul_ps(l.elem_v(), r.elem_v()));
126operator*(
const ILatticeFloat& l,
const IScalarFloat& r)
131 return Ret_t(_mm_mul_ps(l.elem_v(), vmk1(r.elem())));
137operator*(
const IScalarFloat& l,
const ILatticeFloat& r)
142 return Ret_t(_mm_mul_ps(vmk1(l.elem()), r.elem_v()));
150operator/(
const ILatticeFloat& l,
const ILatticeFloat& r)
155 return Ret_t(_mm_div_ps(l.elem_v(), r.elem_v()));
161operator/(
const ILatticeFloat& l,
const IScalarFloat& r)
166 return Ret_t(_mm_div_ps(l.elem_v(), vmk1(r.elem())));
172operator/(
const IScalarFloat& l,
const ILatticeFloat& r)
177 return Ret_t(_mm_div_ps(vmk1(l.elem()), r.elem_v()));
192 return Ret_t(_mm_add_ps(l.real().elem_v(), r.real().elem_v()),
193 _mm_add_ps(l.imag().elem_v(), r.imag().elem_v()));
206 return Ret_t(_mm_sub_ps(l.real().elem_v(), r.real().elem_v()),
207 _mm_sub_ps(l.imag().elem_v(), r.imag().elem_v()));
220 return Ret_t(_mm_sub_ps(_mm_mul_ps(l.real().elem_v(), r.real().elem_v()),
221 _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v())),
222 _mm_add_ps(_mm_mul_ps(l.real().elem_v(), r.imag().elem_v()),
223 _mm_mul_ps(l.imag().elem_v(), r.real().elem_v())));
235 return Ret_t(_mm_add_ps(_mm_mul_ps(l.real().elem_v(), r.real().elem_v()),
236 _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v())),
237 _mm_sub_ps(_mm_mul_ps(l.real().elem_v(), r.imag().elem_v()),
238 _mm_mul_ps(l.imag().elem_v(), r.real().elem_v())));
249 return Ret_t(_mm_add_ps(_mm_mul_ps(l.real().elem_v(), r.real().elem_v()),
250 _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v())),
251 _mm_sub_ps(_mm_mul_ps(l.imag().elem_v(), r.real().elem_v()),
252 _mm_mul_ps(l.real().elem_v(), r.imag().elem_v())));
264 return Ret_t(_mm_sub_ps(_mm_mul_ps(l.real().elem_v(), r.real().elem_v()),
265 _mm_mul_ps(l.imag().elem_v(), r.imag().elem_v())),
266 _mm_sub_ps(vmk1(zero),
267 _mm_add_ps(_mm_mul_ps(l.real().elem_v(), r.imag().elem_v()),
268 _mm_mul_ps(l.imag().elem_v(), r.real().elem_v()))));
301#if defined(QDP_SCALARVECSITE_USE_EVALUATE)
321#if defined(QDP_SCALARVECSITE_DEBUG)
322#undef QDP_SCALARVECSITE_DEBUG
325#if defined(QDP_SCALARVECSITE_USE_EVALUATE)
326#undef QDP_SCALARVECSITE_USE_EVALUATE
Primitive color Matrix class.
Expression class for QDP.
QDPType - major type class/container for all QDP objects.
Subsets - controls how lattices are looped.
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)
void evaluate(OLattice< DCol > &d, const OpAssign &op, const QDPExpr< BinaryNode< OpMultiply, Reference< QDPType< DCol, OLattice< DCol > > >, Reference< QDPType< DCol, OLattice< DCol > > > >, OLattice< DCol > > &rhs, const Subset &s)
RComplex< BAGELQDPFloat > RComplexFloat
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)
#define _inline_ssevec_mult_su3_nn(cc, aa, bb, j)
Promote< T1, T2 >::Type_t Type_t