1
0
mirror of https://github.com/paboyle/Grid.git synced 2024-11-14 01:35:36 +00:00
Grid/lib/qcd/action/fermion/WilsonKernelsAsmBody.h

256 lines
5.7 KiB
C
Raw Normal View History

2016-06-03 11:24:26 +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] };
//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;
int nmax=U._grid->oSites();
for(int site=0;site<Ns;site++) {
int sU =lo.Reorder(ssU);
int ssn=ssU+1;
if(ssn>=nmax) ssn=0;
int sUn=lo.Reorder(ssn);
for(int s=0;s<Ls;s++) {
ss =sU*Ls+s;
ssn=sUn*Ls+s;
2016-06-03 11:24:26 +01:00
////////////////////////////////
// Xp
////////////////////////////////
int ent=ss*8;// 2*Ndim
int nent=ssn*8;
PF_GAUGE(Xp);
base = st.GetInfo(ptype,local,perm,Xp,ent,plocal); ent++;
PREFETCH1_CHIMU(base);
2016-06-03 11:24:26 +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
XM_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR3,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Yp,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
YM_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR2,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Zp,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
ZM_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR1,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Tp,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
TM_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR0,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Xm,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
#ifndef STREAM_STORE
basep= (uint64_t) &out._odata[ss];
#endif
// 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
XP_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR3,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Ym,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
YP_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR2,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Zm,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
ZP_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR1,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base = st.GetInfo(ptype,local,perm,Tm,ent,plocal); ent++;
PREFETCH_CHIMU(base);
2016-06-03 11:24:26 +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
////////////////////////////////
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
TP_PROJMEM(base);
2016-08-15 22:31:29 +01:00
#endif
MAYBEPERM(PERMUTE_DIR0,perm);
2016-06-03 11:24:26 +01:00
} else {
LOAD_CHI(base);
2016-06-03 11:24:26 +01:00
}
base= (uint64_t) &out._odata[ss];
#ifndef STREAM_STORE
PREFETCH_CHIMU(base);
#endif
2016-06-03 11:24:26 +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
basep= st.GetPFInfo(nent,plocal); nent++;
SAVE_RESULT(base,basep);
}
ssU++;
}
2016-06-03 11:24:26 +01:00
}