10#ifndef QDP_SCALARSITE_SSE_LINALG_H
11#define QDP_SCALARSITE_SSE_LINALG_H
16#include "sse_mult_su3_nn.h"
17#include "sse_mult_su3_an.h"
19#include "sse_mult_su3_na.h"
20#include "sse_mult_su3_mat_vec.h"
21#include "sse_mult_adj_su3_mat_vec.h"
22#include "sse_add_su3_vector.h"
23#include "sse_mult_su3_mat_hwvec.h"
24#include "sse_mult_adj_su3_mat_hwvec.h"
31#define QDP_SCALARSITE_USE_EVALUATE
61#if defined(QDP_SCALARSITE_DEBUG)
62 cout <<
"M*M" << endl;
65 su3_matrixf* lm = (su3_matrixf *) &(l.elem(0,0).real());
66 su3_matrixf* rm = (su3_matrixf *) &(r.elem(0,0).real());
67 su3_matrixf* dm = (su3_matrixf *) &(d.elem(0,0).real());
69 intrin_sse_mult_su3_nn(lm,rm,dm);
88#if defined(QDP_SCALARSITE_DEBUG)
89 cout <<
"PSc<M>*PSc<M>" << endl;
91 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
92 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem(0,0).real());
93 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem(0,0).real());
95 intrin_sse_mult_su3_nn(lm, rm, dm);
113#if defined(QDP_SCALARSITE_DEBUG)
114 cout <<
"PSc<PSc<M>>*PSc<PSc<M>>" << endl;
117 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem().elem(0,0).real());
118 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem().elem(0,0).real());
119 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem().elem(0,0).real());
121 intrin_sse_mult_su3_nn(lm, rm, dm);
138#if defined(QDP_SCALARSITE_DEBUG)
139 cout <<
"adj(M)*M" << endl;
141 su3_matrixf* lm = (su3_matrixf *) &(l.elem(0,0).real());
142 su3_matrixf* rm = (su3_matrixf *) &(r.elem(0,0).real());
143 su3_matrixf* dm = (su3_matrixf *) &(d.elem(0,0).real());
145 intrin_sse_mult_su3_an(lm,rm,dm);
162#if defined(QDP_SCALARSITE_DEBUG)
163 cout <<
"adj(PSc<M>)*PSc<M>" << endl;
166 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
167 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem(0,0).real());
168 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem(0,0).real());
170 intrin_sse_mult_su3_an(lm, rm, dm);
189#if defined(QDP_SCALARSITE_DEBUG)
190 cout <<
"adj(PSc<PSc<M>>)*PSc<PSc<M>>" << endl;
193 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem().elem(0,0).real());
194 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem().elem(0,0).real());
195 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem().elem(0,0).real());
197 intrin_sse_mult_su3_an(lm, rm, dm);
214#if defined(QDP_SCALARSITE_DEBUG)
215 cout <<
"M*adj(M)" << endl;
217 su3_matrixf* lm = (su3_matrixf *) &(l.elem(0,0).real());
218 su3_matrixf* rm = (su3_matrixf *) &(r.elem(0,0).real());
219 su3_matrixf* dm = (su3_matrixf *) &(d.elem(0,0).real());
221 intrin_sse_mult_su3_na(lm,rm,dm);
240#if defined(QDP_SCALARSITE_DEBUG)
241 cout <<
"PSc<M>*adj(PSc<M>)" << endl;
243 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
244 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem(0,0).real());
245 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem(0,0).real());
247 intrin_sse_mult_su3_na(lm, rm, dm);
265#if defined(QDP_SCALARSITE_DEBUG)
266 cout <<
"PSc<PSc<M>>*adj(PSc<PSc<M>>)" << endl;
268 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem().elem(0,0).real());
269 su3_matrixf* rm = (su3_matrixf *)&(r.elem().elem().elem(0,0).real());
270 su3_matrixf* dm = (su3_matrixf *)&(d.elem().elem().elem(0,0).real());
272 intrin_sse_mult_su3_na(lm, rm, dm);
295 su3_matrixf* lm = (su3_matrixf *) &(l.elem(0,0).real());
296 su3_matrixf* rm = (su3_matrixf *) &(r.elem(0,0).real());
297 su3_matrixf* tm = (su3_matrixf *) &(tmp.elem(0,0).real());
301 intrin_sse_mult_su3_nn(rm,lm,tm);
304 d.elem(0,0).real() = tmp.elem(0,0).real();
305 d.elem(0,0).imag() = -tmp.elem(0,0).imag();
306 d.elem(0,1).real() = tmp.elem(1,0).real();
307 d.elem(0,1).imag() = -tmp.elem(1,0).imag();
308 d.elem(0,2).real() = tmp.elem(2,0).real();
309 d.elem(0,2).imag() = -tmp.elem(2,0).imag();
311 d.elem(1,0).real() = tmp.elem(0,1).real();
312 d.elem(1,0).imag() = -tmp.elem(0,1).imag();
313 d.elem(1,1).real() = tmp.elem(1,1).real();
314 d.elem(1,1).imag() = -tmp.elem(1,1).imag();
315 d.elem(1,2).real() = tmp.elem(2,1).real();
316 d.elem(1,2).imag() = -tmp.elem(2,1).imag();
318 d.elem(2,0).real() = tmp.elem(0,2).real();
319 d.elem(2,0).imag() = -tmp.elem(0,2).imag();
320 d.elem(2,1).real() = tmp.elem(1,2).real();
321 d.elem(2,1).imag() = -tmp.elem(1,2).imag();
322 d.elem(2,2).real() = tmp.elem(2,2).real();
323 d.elem(2,2).imag() = -tmp.elem(2,2).imag();
340#if defined(QDP_SCALARSITE_DEBUG)
341 cout <<
"M*V" << endl;
344 su3_matrixf* lm = (su3_matrixf *)&(l.elem(0,0).real());
345 su3_vectorf* rv = (su3_vectorf *)&(r.elem(0).real());
346 su3_vectorf* dv = (su3_vectorf *)&(d.elem(0).real());
348 intrin_sse_mult_su3_mat_vec(lm,rv,dv);
365#if defined(QDP_SCALARSITE_DEBUG)
366 cout <<
"PSc<M>*PSc<V>" << endl;
369 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
370 su3_vectorf* rv = (su3_vectorf *)&(r.elem().elem(0).real());
371 su3_vectorf* dv = (su3_vectorf *)&(d.elem().elem(0).real());
373 intrin_sse_mult_su3_mat_vec(lm,rv,dv);
390#if defined(QDP_SCALARSITE_DEBUG)
391 cout <<
"adj(M)*V" << endl;
394 su3_matrixf* lm = (su3_matrixf *)&(l.elem(0,0).real());
395 su3_vectorf* rv = (su3_vectorf *)&(r.elem(0).real());
396 su3_vectorf* dv = (su3_vectorf *)&(d.elem(0).real());
398 intrin_sse_mult_adj_su3_mat_vec(lm,rv,dv);
415#if defined(QDP_SCALARSITE_DEBUG)
416 cout <<
"M*S" << endl;
418 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
419 su3_vectorf* rv = (su3_vectorf *)&(r.elem(0).elem(0).real());
420 su3_vectorf* dv = (su3_vectorf *)&(d.elem(0).elem(0).real());
422 intrin_sse_mult_su3_mat_vec(lm,rv,dv);
439#if defined(QDP_SCALARSITE_DEBUG)
440 cout <<
"adj(PSc<M>)*PSc<V>" << endl;
442 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
443 su3_vectorf* rv = (su3_vectorf *)&(r.elem().elem(0).real());
444 su3_vectorf* dv = (su3_vectorf *)&(d.elem().elem(0).real());
446 intrin_sse_mult_adj_su3_mat_vec(lm,rv,dv);
463#if defined(QDP_SCALARSITE_DEBUG)
464 cout <<
"adj(PSc<M>)*S" << endl;
466 su3_matrixf* lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
467 su3_vectorf* rv = (su3_vectorf *)&(r.elem(0).elem(0).real());
468 su3_vectorf* dv = (su3_vectorf *)&(d.elem(0).elem(0).real());
470 intrin_sse_mult_adj_su3_mat_vec(lm,rv,dv);
488#if defined(QDP_SCALARSITE_DEBUG)
489 cout <<
"PSc<M>*H" << endl;
491 su3_matrixf* lm =(su3_matrixf *)&( l.elem().elem(0,0).real() );
492 half_wilson_vectorf* rh = (half_wilson_vectorf *)&(r.elem(0).elem(0).real() );
493 half_wilson_vectorf* dh = (half_wilson_vectorf *)&(d.elem(0).elem(0).real() );
495 intrin_sse_mult_su3_mat_hwvec(lm,rh,dh);
513#if defined(QDP_SCALARSITE_DEBUG)
514 cout <<
"adj(PSc<M>)*H" << endl;
517 su3_matrixf* lm =(su3_matrixf *)&( l.elem().elem(0,0).real() );
518 half_wilson_vectorf* rh = (half_wilson_vectorf *)&(r.elem(0).elem(0).real() );
519 half_wilson_vectorf* dh = (half_wilson_vectorf *)&(d.elem(0).elem(0).real() );
521 intrin_sse_mult_adj_su3_mat_hwvec(lm,rh,dh);
538#if defined(QDP_SCALARSITE_DEBUG)
539 cout <<
"V+V" << endl;
542 su3_vectorf *lv = (su3_vectorf *)&( l.elem(0).real() );
543 su3_vectorf *rv = (su3_vectorf *)&( r.elem(0).real() );
544 su3_vectorf *dv = (su3_vectorf *)&( d.elem(0).real() );
546 intrin_sse_add_su3_vector(lv,rv,dv);
564#if defined(QDP_SCALARSITE_DEBUG)
565 cout <<
"PSc<M>*D" << endl;
567 su3_matrixf *lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
568 su3_vectorf *rv0 = (su3_vectorf *)&(r.elem(0).elem(0).real());
569 su3_vectorf *rv1 = (su3_vectorf *)&(r.elem(1).elem(0).real());
570 su3_vectorf *rv2 = (su3_vectorf *)&(r.elem(2).elem(0).real());
571 su3_vectorf *rv3 = (su3_vectorf *)&(r.elem(3).elem(0).real());
573 su3_vectorf *dv0 = (su3_vectorf *)&(d.elem(0).elem(0).real());
574 su3_vectorf *dv1 = (su3_vectorf *)&(d.elem(1).elem(0).real());
575 su3_vectorf *dv2 = (su3_vectorf *)&(d.elem(2).elem(0).real());
576 su3_vectorf *dv3 = (su3_vectorf *)&(d.elem(3).elem(0).real());
578 intrin_sse_mult_su3_mat_vec(lm,rv0,dv0);
579 intrin_sse_mult_su3_mat_vec(lm,rv1,dv1);
580 intrin_sse_mult_su3_mat_vec(lm,rv2,dv2);
581 intrin_sse_mult_su3_mat_vec(lm,rv3,dv3);
599#if defined(QDP_SCALARSITE_DEBUG)
600 cout <<
"adj(PSc<M>)*D" << endl;
602 su3_matrixf *lm = (su3_matrixf *)&(l.elem().elem(0,0).real());
603 su3_vectorf *rv0 = (su3_vectorf *)&(r.elem(0).elem(0).real());
604 su3_vectorf *rv1 = (su3_vectorf *)&(r.elem(1).elem(0).real());
605 su3_vectorf *rv2 = (su3_vectorf *)&(r.elem(2).elem(0).real());
606 su3_vectorf *rv3 = (su3_vectorf *)&(r.elem(3).elem(0).real());
608 su3_vectorf *dv0 = (su3_vectorf *)&(d.elem(0).elem(0).real());
609 su3_vectorf *dv1 = (su3_vectorf *)&(d.elem(1).elem(0).real());
610 su3_vectorf *dv2 = (su3_vectorf *)&(d.elem(2).elem(0).real());
611 su3_vectorf *dv3 = (su3_vectorf *)&(d.elem(3).elem(0).real());
613 intrin_sse_mult_adj_su3_mat_vec(lm,rv0,dv0);
614 intrin_sse_mult_adj_su3_mat_vec(lm,rv1,dv1);
615 intrin_sse_mult_adj_su3_mat_vec(lm,rv2,dv2);
616 intrin_sse_mult_adj_su3_mat_vec(lm,rv3,dv3);
634#if defined(QDP_SCALARSITE_DEBUG)
635 cout <<
"PSc<V>+PSc<V>" << endl;
638 su3_vectorf *lv = (su3_vectorf *)&(l.elem().elem(0).real());
639 su3_vectorf *rv = (su3_vectorf *)&(r.elem().elem(0).real());
640 su3_vectorf *dv = (su3_vectorf *)&(d.elem().elem(0).real());
642 intrin_sse_add_su3_vector(lv,rv,dv);
648#if defined(QDP_SCALARSITE_USE_EVALUATE)
840#if defined(QDP_SCALARSITE_DEBUG)
841#undef QDP_SCALARSITE_DEBUG
844#if defined(QDP_SCALARSITE_USE_EVALUATE)
845#undef QDP_SCALARSITE_USE_EVALUATE
Primitive color Matrix class.
Primitive color Vector class.
Primitive spin Vector 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
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)