2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
int local,perm, ptype;
|
|
|
|
uint64_t base;
|
|
|
|
uint64_t basep;
|
2016-06-03 11:24:26 +01:00
|
|
|
const uint64_t plocal =(uint64_t) & in._odata[0];
|
|
|
|
|
|
|
|
// vComplexF isigns[2] = { signs[0], signs[1] };
|
2016-10-28 17:20:04 +01:00
|
|
|
//COMPLEX_TYPE is vComplexF of vComplexD depending
|
|
|
|
//on the chosen precision
|
|
|
|
COMPLEX_TYPE *isigns = &signs[0];
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
MASK_REGS;
|
2016-06-30 21:07:42 +01:00
|
|
|
int nmax=U._grid->oSites();
|
2016-06-09 09:12:36 +01:00
|
|
|
for(int site=0;site<Ns;site++) {
|
2016-06-26 20:54:14 +01:00
|
|
|
int sU =lo.Reorder(ssU);
|
2016-06-30 21:07:42 +01:00
|
|
|
int ssn=ssU+1;
|
|
|
|
if(ssn>=nmax) ssn=0;
|
|
|
|
int sUn=lo.Reorder(ssn);
|
2016-06-09 09:12:36 +01:00
|
|
|
for(int s=0;s<Ls;s++) {
|
2016-06-30 21:07:42 +01:00
|
|
|
ss =sU*Ls+s;
|
|
|
|
ssn=sUn*Ls+s;
|
2016-06-03 11:24:26 +01:00
|
|
|
////////////////////////////////
|
|
|
|
// Xp
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
int ent=ss*8;// 2*Ndim
|
|
|
|
int nent=ssn*8;
|
2016-06-26 20:54:14 +01:00
|
|
|
|
2016-06-30 21:07:42 +01:00
|
|
|
PF_GAUGE(Xp);
|
|
|
|
base = st.GetInfo(ptype,local,perm,Xp,ent,plocal); ent++;
|
|
|
|
PREFETCH1_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
|
2016-06-30 21:07:42 +01:00
|
|
|
basep = st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns);
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
XP_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
XM_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR3,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Yp,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFXP(Xp,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns);
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
XP_RECON;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
XM_RECON;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
////////////////////////////////
|
|
|
|
// Yp
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep = st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
YP_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
YM_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR2,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Zp,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFYP(Yp,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
YP_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
YM_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Zp
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep = st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
ZP_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
ZM_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR1,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Tp,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFZP(Zp,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
ZP_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
ZM_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Tp
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep = st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
TP_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
TM_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR0,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Xm,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFTP(Tp,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
TP_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
TM_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Xm
|
|
|
|
////////////////////////////////
|
2016-10-12 11:45:22 +01:00
|
|
|
#ifndef STREAM_STORE
|
2016-06-30 21:07:42 +01:00
|
|
|
basep= (uint64_t) &out._odata[ss];
|
2016-10-12 11:45:22 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
// basep= st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
XM_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
XP_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR3,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Ym,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFXM(Xm,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
XM_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
XP_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Ym
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep= st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
YM_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
YP_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR2,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Zm,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFYM(Ym,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
YM_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
YP_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Zm
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep= st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
ZM_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
ZP_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR1,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base = st.GetInfo(ptype,local,perm,Tm,ent,plocal); ent++;
|
|
|
|
PREFETCH_CHIMU(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFZM(Zm,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
ZM_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
ZP_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
|
|
|
////////////////////////////////
|
|
|
|
// Tm
|
|
|
|
////////////////////////////////
|
2016-06-30 21:07:42 +01:00
|
|
|
basep= st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
if ( local ) {
|
2016-06-03 11:24:26 +01:00
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
TM_PROJMEM(base);
|
|
|
|
#else
|
2016-06-30 21:07:42 +01:00
|
|
|
TP_PROJMEM(base);
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-30 21:07:42 +01:00
|
|
|
MAYBEPERM(PERMUTE_DIR0,perm);
|
2016-06-03 11:24:26 +01:00
|
|
|
} else {
|
2016-06-30 21:07:42 +01:00
|
|
|
LOAD_CHI(base);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
2016-06-30 21:07:42 +01:00
|
|
|
base= (uint64_t) &out._odata[ss];
|
2016-10-12 11:45:22 +01:00
|
|
|
#ifndef STREAM_STORE
|
2016-06-30 21:07:42 +01:00
|
|
|
PREFETCH_CHIMU(base);
|
2016-10-12 11:45:22 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
{
|
2016-06-30 21:07:42 +01:00
|
|
|
MULT_2SPIN_DIR_PFTM(Tm,basep);
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|
|
|
|
LOAD64(%r10,isigns); // times i => shuffle and xor the real part sign bit
|
2016-08-15 22:31:29 +01:00
|
|
|
#ifdef KERNEL_DAG
|
|
|
|
TM_RECON_ACCUM;
|
|
|
|
#else
|
2016-06-03 11:24:26 +01:00
|
|
|
TP_RECON_ACCUM;
|
2016-08-15 22:31:29 +01:00
|
|
|
#endif
|
2016-06-03 11:24:26 +01:00
|
|
|
|
2016-06-30 21:07:42 +01:00
|
|
|
basep= st.GetPFInfo(nent,plocal); nent++;
|
|
|
|
SAVE_RESULT(base,basep);
|
2016-06-26 20:54:14 +01:00
|
|
|
|
|
|
|
}
|
2016-06-19 19:45:58 +01:00
|
|
|
ssU++;
|
2016-06-09 09:12:36 +01:00
|
|
|
}
|
2016-06-03 11:24:26 +01:00
|
|
|
}
|