Ejemplo n.º 1
0
/* Serially Checked ! */
void Dtm_psi(spinor * const P, spinor * const Q){

  if(P==Q){
    printf("Error in Dtm_psi (D_psi.c):\n");
    printf("Arguments must be differen spinor fields\n");
    printf("Program aborted\n");
    exit(1);
  }

#ifdef _GAUGE_COPY2
  if(g_update_gauge_copy) {
    update_backward_gauge(g_gauge_field);
  }
#endif

# if defined TM_USE_MPI
  xchange_lexicfield(Q);
# endif

#ifdef TM_USE_OMP
#pragma omp parallel
  {
#endif
    int ix,iy,iz;
    su3 *up,*um;
    spinor *s,*sp,*sm,*rn;
    _Complex double fact1, fact2;
    spinor rs __attribute__ ((aligned (16)));

    fact1 = 1. + g_mu * I;
    fact2 = conj(fact1);

#ifndef TM_USE_OMP
    iy=g_iup[0][0];
    sp=(spinor *) Q + iy;
    up=&g_gauge_field[0][0];
#endif

    /************************ loop over all lattice sites *************************/
#ifdef TM_USE_OMP
#pragma omp for
#endif
    for (ix=0;ix<VOLUME;ix++){
#ifdef TM_USE_OMP
      iy=g_iup[ix][0];
      up=&g_gauge_field[ix][0];
      sp=(spinor *) Q + iy;
#endif
      s=(spinor *) Q + ix;
      _prefetch_spinor(s);

      /******************************* direction +0 *********************************/

      iy=g_idn[ix][0];
      
      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);       

      _sse_load(sp->s0);
      _sse_load_up(sp->s2);
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_0);
      _sse_store_up(rs.s2);

      // the diagonal bit
      _sse_load_up(s->s0);
      _sse_vector_cmplx_mul(fact1);
      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s0);

      // g5 in the twisted term
      _sse_load_up(s->s2);
      _sse_vector_cmplx_mul(fact2);
      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s2);      
      
      um=&g_gauge_field[iy][0];
      _prefetch_su3(um);
      
      _sse_load(sp->s1);
      _sse_load_up(sp->s3);
      _sse_vector_add();
      
      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_0);
      _sse_store_up(rs.s3);
    
      // the diagonal bit
      _sse_load_up(s->s1);
      _sse_vector_cmplx_mul(fact1);
      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s1);

      // g5 in the twisted term
      _sse_load_up(s->s3);
      _sse_vector_cmplx_mul(fact2);
      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s3); 

      /******************************* direction -0 *********************************/

      iy=g_iup[ix][1];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s2);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_0);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s2);
      _sse_vector_sub();
      _sse_store(rs.s2);
      
      up+=1;
      _prefetch_su3(up);
      
      _sse_load(sm->s1);
      _sse_load_up(sm->s3);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_0);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s3);
      _sse_vector_sub();
      _sse_store(rs.s3);
      
      /******************************* direction +1 *********************************/

      iy=g_idn[ix][1];
      
      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s3);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_1);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s3); 
      
      um=&g_gauge_field[iy][1];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s2);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_1);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s2);       

      /******************************* direction -1 *********************************/

      iy=g_iup[ix][2];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s3);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_1);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s3);

      up+=1;
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s2);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_1);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s2);

      /******************************* direction +2 *********************************/

      iy=g_idn[ix][2];

      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s3);
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_2);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_add();
      _sse_store(rs.s3);
      
      um=&g_gauge_field[iy][2];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s2);
      _sse_vector_sub();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_2);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_sub();
      _sse_store(rs.s2);      

      /******************************* direction -2 *********************************/

      iy=g_iup[ix][3];

      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s3);
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_2);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s3);
      _sse_vector_sub();
      _sse_store(rs.s3);
      
      up+=1;
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s2);
      _sse_vector_add();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_2);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s2);
      _sse_vector_add();
      _sse_store(rs.s2);      
      
      /******************************* direction +3 *********************************/

      iy=g_idn[ix][3];

      sm = (spinor *) Q + iy;
      _prefetch_spinor(sm);

      _sse_load(sp->s0);
      _sse_load_up(sp->s2);
      _sse_vector_i_mul();
      _sse_vector_add();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_3);
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store(rs.s0);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store(rs.s2);
      
      um=&g_gauge_field[iy][3];
      _prefetch_su3(um);

      _sse_load(sp->s1);
      _sse_load_up(sp->s3);
      _sse_vector_i_mul();
      _sse_vector_sub();

      _sse_su3_multiply((*up));
      _sse_vector_cmplx_mul(phase_3);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store(rs.s1);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store(rs.s3);
      
      /******************************* direction -3 *********************************/

      iz=(ix+1+VOLUME)%VOLUME;

      iy=g_iup[iz][0];
      
      sp = (spinor *) Q + iy;
      _prefetch_spinor(sp);

      _sse_load(sm->s0);
      _sse_load_up(sm->s2);
      _sse_vector_i_mul();
      _sse_vector_sub();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_3);
      rn = (spinor *) P + ix;
      
      _sse_load(rs.s0);
      _sse_vector_add();
      _sse_store_nt(rn->s0);

      _sse_load(rs.s2);
      _sse_vector_i_mul();      
      _sse_vector_add();
      _sse_store_nt(rn->s2);

      up=&g_gauge_field[iz][0];
      _prefetch_su3(up);

      _sse_load(sm->s1);
      _sse_load_up(sm->s3);
      _sse_vector_i_mul();
      _sse_vector_add();
      
      _sse_su3_inverse_multiply((*um));
      _sse_vector_cmplxcg_mul(phase_3);
      _sse_load(rs.s1);
      _sse_vector_add();
      _sse_store_nt(rn->s1);

      _sse_load(rs.s3);
      _sse_vector_i_mul();      
      _sse_vector_sub();
      _sse_store_nt(rn->s3);
      
      /******************************** end of loop *********************************/

    }
#ifdef TM_USE_OMP
  } /* OpenMP closing brace */
#endif
}
Ejemplo n.º 2
0
/* input on k; output on l */
void Hopping_Matrix(const int ieo, spinor * const l, spinor * const k){
  int icx,icz,ioff;
  int ix,iz;
  int x0,icx0,jj;
  su3 *restrict up;
  su3 * restrict um;
  spinor * restrict sp;
  spinor * restrict sm;
  spinor * restrict rn;

# if (defined MPI)
#  ifdef PARALLELX
#   define  REQC 4
#  elif defined PARALLELXY
#   define  REQC 8
#  elif defined PARALLELXYZ
#   define  REQC 12
#  endif
  MPI_Request requests[REQC];
  MPI_Status status[REQC];
# endif

#ifdef _GAUGE_COPY
  if(g_update_gauge_copy) {
    update_backward_gauge(g_gauge_field);
  }
#endif

  if(ieo == 0){ /* even out - odd in */
    ioff = 0;
  } 
  else{ /* odd out - even in */
    ioff = (VOLUME+RAND)/2;
  }

  /* Loop over time direction. This is the outmost loop */
  for(x0=0;x0<T;x0++){

    /* start the communication of the timslice borders (non-blocking send and receive)*/
#    if (defined MPI && !defined _NO_COMM)
   xchange_field_open(k, ieo, x0, requests, status);
#    endif
    

  /* loop over timeslice. At: contribution of timelike links  */
   icx0=g_1st_eot[x0][ieo];
   jj =0;
   um=&g_gauge_field_copyt[icx0][0]-1; /* allowed? */
   for(icx = icx0; icx < icx0+TEOSLICE; icx++){
     rn=l+(icx-ioff);
    /*********************** direction +0 ************************/

    sp=k+g_iup_eo[icx][0]; /* all sp,sm,up,um could be moved up */
    up=um+1;

#if (defined AVX)
    _avx_load(sp->s0);
    _avx_load_up(sp->s2);
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka0);
    _avx_store_up(rn->s0);
    _avx_store_up(rn->s2);      
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s3);
    _avx_vector_add();
      
    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka0);
    _avx_store_up(rn->s1);
    _avx_store_up(rn->s3); 

    /*********************** direction -0 ************************/

    sm=k+g_idn_eo[icx][0];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s2);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka0);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_sub();
    _avx_store(rn->s2);
      
    _avx_load(sm->s1);
    _avx_load_up(sm->s3);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka0);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_sub();
    _avx_store(rn->s3);

#elif (defined SSE2 || defined SSE3)
    _sse_load(sp->s0);
    _sse_load_up(sp->s2);
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_up(rn->s0);
    _sse_store_up(rn->s2);      
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s3);
    _sse_vector_add();
      
    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka0);
    _sse_store_up(rn->s1);
    _sse_store_up(rn->s3); 

    /*********************** direction -0 ************************/

    sm=k+g_idn_eo[icx][0];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s2);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka0);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_sub();
    _sse_store(rn->s2);
      
    _sse_load(sm->s1);
    _sse_load_up(sm->s3);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka0);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_sub();
    _sse_store(rn->s3);

#endif
    
    jj++;
   } /* end of loop over timeslice (At)*/

       
   /* complete the communication of the timslice borders (and wait) */
#if (defined MPI && !defined _NO_COMM)
   xchange_field_close(requests, status, REQC); /*    MPI_Waitall */
#endif

   /* loop over timeslice. Bt: contribution of spacelike links  */
   um=&g_gauge_field_copys[icx0][0]-1;
   for(icx = icx0; icx < icx0+TEOSLICE; icx++){
    ix=g_eo2lexic[icx];
    rn=l+(icx-ioff);
    /*********************** direction +1 ************************/

    sp=k+g_iup_eo[icx][1];
    up=um+1;

#if (defined AVX)
    _avx_load(sp->s0);
    _avx_load_up(sp->s3);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka1);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s3); 
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s2);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka1);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s2);       

    /*********************** direction -1 ************************/

    sm=k+g_idn_eo[icx][1];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s3);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka1);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s3);

    _avx_load(sm->s1);
    _avx_load_up(sm->s2);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka1);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s2);

    /*********************** direction +2 ************************/

    sp=k+g_iup_eo[icx][2];
    up=um+1;

    _avx_load(sp->s0);
    _avx_load_up(sp->s3);
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka2);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_add();
    _avx_store(rn->s3);
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s2);
    _avx_vector_sub();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka2);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_sub();
    _avx_store(rn->s2);      

    /*********************** direction -2 ************************/

    sm=k+g_idn_eo[icx][2];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s3);
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka2);
      
    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s3);
    _avx_vector_sub();
    _avx_store(rn->s3);
      
    _avx_load(sm->s1);
    _avx_load_up(sm->s2);
    _avx_vector_add();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka2);
      
    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s2);
    _avx_vector_add();
    _avx_store(rn->s2);      
      
    /*********************** direction +3 ************************/

    sp=k+g_iup_eo[icx][3];
    up=um+1;

    _avx_load(sp->s0);
    _avx_load_up(sp->s2);
    _avx_vector_i_mul();
    _avx_vector_add();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka3);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s2);
      
    _avx_load(sp->s1);
    _avx_load_up(sp->s3);
    _avx_vector_i_mul();
    _avx_vector_sub();

    _avx_su3_multiply((*up));
    _avx_vector_cmplx_mul(ka3);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_add();
    _avx_store(rn->s3);
      
    /*********************** direction -3 ************************/

    sm=k+g_idn_eo[icx][3];
    um=up+1;

    _avx_load(sm->s0);
    _avx_load_up(sm->s2);
    _avx_vector_i_mul();
    _avx_vector_sub();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka3);

    _avx_load(rn->s0);
    _avx_vector_add();
    _avx_store(rn->s0);

    _avx_load(rn->s2);
    _avx_vector_i_mul();
    _avx_vector_add();
    _avx_store(rn->s2);

    _avx_load(sm->s1);
    _avx_load_up(sm->s3);
    _avx_vector_i_mul();
    _avx_vector_add();
      
    _avx_su3_inverse_multiply((*um));
    _avx_vector_cmplxcg_mul(ka3);

    _avx_load(rn->s1);
    _avx_vector_add();
    _avx_store(rn->s1);

    _avx_load(rn->s3);
    _avx_vector_i_mul();      
    _avx_vector_sub();
    _avx_store(rn->s3);
    
#elif (defined SSE2 || defined SSE3)
    _sse_load(sp->s0);
    _sse_load_up(sp->s3);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka1);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s3); 
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka1);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s2);       

    /*********************** direction -1 ************************/

    sm=k+g_idn_eo[icx][1];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s3);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka1);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s3);

    _sse_load(sm->s1);
    _sse_load_up(sm->s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka1);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s2);

    /*********************** direction +2 ************************/

    sp=k+g_iup_eo[icx][2];
    up=um+1;

    _sse_load(sp->s0);
    _sse_load_up(sp->s3);
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka2);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_add();
    _sse_store(rn->s3);
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s2);
    _sse_vector_sub();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka2);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_sub();
    _sse_store(rn->s2);      

    /*********************** direction -2 ************************/

    sm=k+g_idn_eo[icx][2];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s3);
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka2);
      
    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s3);
    _sse_vector_sub();
    _sse_store(rn->s3);
      
    _sse_load(sm->s1);
    _sse_load_up(sm->s2);
    _sse_vector_add();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka2);
      
    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s2);
    _sse_vector_add();
    _sse_store(rn->s2);      
      
    /*********************** direction +3 ************************/

    sp=k+g_iup_eo[icx][3];
    up=um+1;

    _sse_load(sp->s0);
    _sse_load_up(sp->s2);
    _sse_vector_i_mul();
    _sse_vector_add();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka3);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s2);
      
    _sse_load(sp->s1);
    _sse_load_up(sp->s3);
    _sse_vector_i_mul();
    _sse_vector_sub();

    _sse_su3_multiply((*up));
    _sse_vector_cmplx_mul(ka3);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_add();
    _sse_store(rn->s3);
      
    /*********************** direction -3 ************************/

    sm=k+g_idn_eo[icx][3];
    um=up+1;

    _sse_load(sm->s0);
    _sse_load_up(sm->s2);
    _sse_vector_i_mul();
    _sse_vector_sub();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rn->s0);
    _sse_vector_add();
    _sse_store(rn->s0);

    _sse_load(rn->s2);
    _sse_vector_i_mul();
    _sse_vector_add();
    _sse_store(rn->s2);

    _sse_load(sm->s1);
    _sse_load_up(sm->s3);
    _sse_vector_i_mul();
    _sse_vector_add();
      
    _sse_su3_inverse_multiply((*um));
    _sse_vector_cmplxcg_mul(ka3);

    _sse_load(rn->s1);
    _sse_vector_add();
    _sse_store(rn->s1);

    _sse_load(rn->s3);
    _sse_vector_i_mul();      
    _sse_vector_sub();
    _sse_store(rn->s3);

#endif    
   }  /* end of loop over timeslice (Bt)*/
  } /* x0=0; x0<T */
}