Valgrind suppression for OS X 10.9
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sse4_1_double / nb_kernel_ElecEwSh_VdwLJEwSh_GeomW4W4_sse4_1_double.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*
36  * Note: this file was generated by the GROMACS sse4_1_double kernel generator.
37  */
38 #ifdef HAVE_CONFIG_H
39 #include <config.h>
40 #endif
41
42 #include <math.h>
43
44 #include "../nb_kernel.h"
45 #include "types/simple.h"
46 #include "vec.h"
47 #include "nrnb.h"
48
49 #include "gromacs/simd/math_x86_sse4_1_double.h"
50 #include "kernelutil_x86_sse4_1_double.h"
51
52 /*
53  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSh_VdwLJEwSh_GeomW4W4_VF_sse4_1_double
54  * Electrostatics interaction: Ewald
55  * VdW interaction:            LJEwald
56  * Geometry:                   Water4-Water4
57  * Calculate force/pot:        PotentialAndForce
58  */
59 void
60 nb_kernel_ElecEwSh_VdwLJEwSh_GeomW4W4_VF_sse4_1_double
61                     (t_nblist                    * gmx_restrict       nlist,
62                      rvec                        * gmx_restrict          xx,
63                      rvec                        * gmx_restrict          ff,
64                      t_forcerec                  * gmx_restrict          fr,
65                      t_mdatoms                   * gmx_restrict     mdatoms,
66                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
67                      t_nrnb                      * gmx_restrict        nrnb)
68 {
69     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
70      * just 0 for non-waters.
71      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
72      * jnr indices corresponding to data put in the four positions in the SIMD register.
73      */
74     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
75     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
76     int              jnrA,jnrB;
77     int              j_coord_offsetA,j_coord_offsetB;
78     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
79     real             rcutoff_scalar;
80     real             *shiftvec,*fshift,*x,*f;
81     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
82     int              vdwioffset0;
83     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
84     int              vdwioffset1;
85     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
86     int              vdwioffset2;
87     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
88     int              vdwioffset3;
89     __m128d          ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
90     int              vdwjidx0A,vdwjidx0B;
91     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
92     int              vdwjidx1A,vdwjidx1B;
93     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
94     int              vdwjidx2A,vdwjidx2B;
95     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
96     int              vdwjidx3A,vdwjidx3B;
97     __m128d          jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
98     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
99     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
100     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
101     __m128d          dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13;
102     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
103     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
104     __m128d          dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23;
105     __m128d          dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31;
106     __m128d          dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32;
107     __m128d          dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33;
108     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
109     real             *charge;
110     int              nvdwtype;
111     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
112     int              *vdwtype;
113     real             *vdwparam;
114     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
115     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
116     __m128d           c6grid_00;
117     __m128d           c6grid_11;
118     __m128d           c6grid_12;
119     __m128d           c6grid_13;
120     __m128d           c6grid_21;
121     __m128d           c6grid_22;
122     __m128d           c6grid_23;
123     __m128d           c6grid_31;
124     __m128d           c6grid_32;
125     __m128d           c6grid_33;
126     __m128d           ewclj,ewclj2,ewclj6,ewcljrsq,poly,exponent,f6A,f6B,sh_lj_ewald;
127     real             *vdwgridparam;
128     __m128d           one_half = _mm_set1_pd(0.5);
129     __m128d           minus_one = _mm_set1_pd(-1.0);
130     __m128i          ewitab;
131     __m128d          ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
132     real             *ewtab;
133     __m128d          dummy_mask,cutoff_mask;
134     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
135     __m128d          one     = _mm_set1_pd(1.0);
136     __m128d          two     = _mm_set1_pd(2.0);
137     x                = xx[0];
138     f                = ff[0];
139
140     nri              = nlist->nri;
141     iinr             = nlist->iinr;
142     jindex           = nlist->jindex;
143     jjnr             = nlist->jjnr;
144     shiftidx         = nlist->shift;
145     gid              = nlist->gid;
146     shiftvec         = fr->shift_vec[0];
147     fshift           = fr->fshift[0];
148     facel            = _mm_set1_pd(fr->epsfac);
149     charge           = mdatoms->chargeA;
150     nvdwtype         = fr->ntype;
151     vdwparam         = fr->nbfp;
152     vdwtype          = mdatoms->typeA;
153     vdwgridparam     = fr->ljpme_c6grid;
154     sh_lj_ewald      = _mm_set1_pd(fr->ic->sh_lj_ewald);
155     ewclj            = _mm_set1_pd(fr->ewaldcoeff_lj);
156     ewclj2           = _mm_mul_pd(minus_one,_mm_mul_pd(ewclj,ewclj));
157
158     sh_ewald         = _mm_set1_pd(fr->ic->sh_ewald);
159     ewtab            = fr->ic->tabq_coul_FDV0;
160     ewtabscale       = _mm_set1_pd(fr->ic->tabq_scale);
161     ewtabhalfspace   = _mm_set1_pd(0.5/fr->ic->tabq_scale);
162
163     /* Setup water-specific parameters */
164     inr              = nlist->iinr[0];
165     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
166     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
167     iq3              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+3]));
168     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
169
170     jq1              = _mm_set1_pd(charge[inr+1]);
171     jq2              = _mm_set1_pd(charge[inr+2]);
172     jq3              = _mm_set1_pd(charge[inr+3]);
173     vdwjidx0A        = 2*vdwtype[inr+0];
174     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
175     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
176     c6grid_00        = _mm_set1_pd(vdwgridparam[vdwioffset0+vdwjidx0A]);
177     qq11             = _mm_mul_pd(iq1,jq1);
178     qq12             = _mm_mul_pd(iq1,jq2);
179     qq13             = _mm_mul_pd(iq1,jq3);
180     qq21             = _mm_mul_pd(iq2,jq1);
181     qq22             = _mm_mul_pd(iq2,jq2);
182     qq23             = _mm_mul_pd(iq2,jq3);
183     qq31             = _mm_mul_pd(iq3,jq1);
184     qq32             = _mm_mul_pd(iq3,jq2);
185     qq33             = _mm_mul_pd(iq3,jq3);
186
187     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
188     rcutoff_scalar   = fr->rcoulomb;
189     rcutoff          = _mm_set1_pd(rcutoff_scalar);
190     rcutoff2         = _mm_mul_pd(rcutoff,rcutoff);
191
192     sh_vdw_invrcut6  = _mm_set1_pd(fr->ic->sh_invrc6);
193     rvdw             = _mm_set1_pd(fr->rvdw);
194
195     /* Avoid stupid compiler warnings */
196     jnrA = jnrB = 0;
197     j_coord_offsetA = 0;
198     j_coord_offsetB = 0;
199
200     outeriter        = 0;
201     inneriter        = 0;
202
203     /* Start outer loop over neighborlists */
204     for(iidx=0; iidx<nri; iidx++)
205     {
206         /* Load shift vector for this list */
207         i_shift_offset   = DIM*shiftidx[iidx];
208
209         /* Load limits for loop over neighbors */
210         j_index_start    = jindex[iidx];
211         j_index_end      = jindex[iidx+1];
212
213         /* Get outer coordinate index */
214         inr              = iinr[iidx];
215         i_coord_offset   = DIM*inr;
216
217         /* Load i particle coords and add shift vector */
218         gmx_mm_load_shift_and_4rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
219                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2,&ix3,&iy3,&iz3);
220
221         fix0             = _mm_setzero_pd();
222         fiy0             = _mm_setzero_pd();
223         fiz0             = _mm_setzero_pd();
224         fix1             = _mm_setzero_pd();
225         fiy1             = _mm_setzero_pd();
226         fiz1             = _mm_setzero_pd();
227         fix2             = _mm_setzero_pd();
228         fiy2             = _mm_setzero_pd();
229         fiz2             = _mm_setzero_pd();
230         fix3             = _mm_setzero_pd();
231         fiy3             = _mm_setzero_pd();
232         fiz3             = _mm_setzero_pd();
233
234         /* Reset potential sums */
235         velecsum         = _mm_setzero_pd();
236         vvdwsum          = _mm_setzero_pd();
237
238         /* Start inner kernel loop */
239         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
240         {
241
242             /* Get j neighbor index, and coordinate index */
243             jnrA             = jjnr[jidx];
244             jnrB             = jjnr[jidx+1];
245             j_coord_offsetA  = DIM*jnrA;
246             j_coord_offsetB  = DIM*jnrB;
247
248             /* load j atom coordinates */
249             gmx_mm_load_4rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
250                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
251                                               &jy2,&jz2,&jx3,&jy3,&jz3);
252
253             /* Calculate displacement vector */
254             dx00             = _mm_sub_pd(ix0,jx0);
255             dy00             = _mm_sub_pd(iy0,jy0);
256             dz00             = _mm_sub_pd(iz0,jz0);
257             dx11             = _mm_sub_pd(ix1,jx1);
258             dy11             = _mm_sub_pd(iy1,jy1);
259             dz11             = _mm_sub_pd(iz1,jz1);
260             dx12             = _mm_sub_pd(ix1,jx2);
261             dy12             = _mm_sub_pd(iy1,jy2);
262             dz12             = _mm_sub_pd(iz1,jz2);
263             dx13             = _mm_sub_pd(ix1,jx3);
264             dy13             = _mm_sub_pd(iy1,jy3);
265             dz13             = _mm_sub_pd(iz1,jz3);
266             dx21             = _mm_sub_pd(ix2,jx1);
267             dy21             = _mm_sub_pd(iy2,jy1);
268             dz21             = _mm_sub_pd(iz2,jz1);
269             dx22             = _mm_sub_pd(ix2,jx2);
270             dy22             = _mm_sub_pd(iy2,jy2);
271             dz22             = _mm_sub_pd(iz2,jz2);
272             dx23             = _mm_sub_pd(ix2,jx3);
273             dy23             = _mm_sub_pd(iy2,jy3);
274             dz23             = _mm_sub_pd(iz2,jz3);
275             dx31             = _mm_sub_pd(ix3,jx1);
276             dy31             = _mm_sub_pd(iy3,jy1);
277             dz31             = _mm_sub_pd(iz3,jz1);
278             dx32             = _mm_sub_pd(ix3,jx2);
279             dy32             = _mm_sub_pd(iy3,jy2);
280             dz32             = _mm_sub_pd(iz3,jz2);
281             dx33             = _mm_sub_pd(ix3,jx3);
282             dy33             = _mm_sub_pd(iy3,jy3);
283             dz33             = _mm_sub_pd(iz3,jz3);
284
285             /* Calculate squared distance and things based on it */
286             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
287             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
288             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
289             rsq13            = gmx_mm_calc_rsq_pd(dx13,dy13,dz13);
290             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
291             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
292             rsq23            = gmx_mm_calc_rsq_pd(dx23,dy23,dz23);
293             rsq31            = gmx_mm_calc_rsq_pd(dx31,dy31,dz31);
294             rsq32            = gmx_mm_calc_rsq_pd(dx32,dy32,dz32);
295             rsq33            = gmx_mm_calc_rsq_pd(dx33,dy33,dz33);
296
297             rinv00           = gmx_mm_invsqrt_pd(rsq00);
298             rinv11           = gmx_mm_invsqrt_pd(rsq11);
299             rinv12           = gmx_mm_invsqrt_pd(rsq12);
300             rinv13           = gmx_mm_invsqrt_pd(rsq13);
301             rinv21           = gmx_mm_invsqrt_pd(rsq21);
302             rinv22           = gmx_mm_invsqrt_pd(rsq22);
303             rinv23           = gmx_mm_invsqrt_pd(rsq23);
304             rinv31           = gmx_mm_invsqrt_pd(rsq31);
305             rinv32           = gmx_mm_invsqrt_pd(rsq32);
306             rinv33           = gmx_mm_invsqrt_pd(rsq33);
307
308             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
309             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
310             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
311             rinvsq13         = _mm_mul_pd(rinv13,rinv13);
312             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
313             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
314             rinvsq23         = _mm_mul_pd(rinv23,rinv23);
315             rinvsq31         = _mm_mul_pd(rinv31,rinv31);
316             rinvsq32         = _mm_mul_pd(rinv32,rinv32);
317             rinvsq33         = _mm_mul_pd(rinv33,rinv33);
318
319             fjx0             = _mm_setzero_pd();
320             fjy0             = _mm_setzero_pd();
321             fjz0             = _mm_setzero_pd();
322             fjx1             = _mm_setzero_pd();
323             fjy1             = _mm_setzero_pd();
324             fjz1             = _mm_setzero_pd();
325             fjx2             = _mm_setzero_pd();
326             fjy2             = _mm_setzero_pd();
327             fjz2             = _mm_setzero_pd();
328             fjx3             = _mm_setzero_pd();
329             fjy3             = _mm_setzero_pd();
330             fjz3             = _mm_setzero_pd();
331
332             /**************************
333              * CALCULATE INTERACTIONS *
334              **************************/
335
336             if (gmx_mm_any_lt(rsq00,rcutoff2))
337             {
338
339             r00              = _mm_mul_pd(rsq00,rinv00);
340
341             /* Analytical LJ-PME */
342             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
343             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
344             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
345             exponent         = gmx_simd_exp_d(ewcljrsq);
346             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
347             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
348             /* vvdw6 = [C6 - C6grid * (1-poly)]/r6 */
349             vvdw6            = _mm_mul_pd(_mm_sub_pd(c6_00,_mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly))),rinvsix);
350             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
351             vvdw             = _mm_sub_pd(_mm_mul_pd( _mm_sub_pd(vvdw12 , _mm_mul_pd(c12_00,_mm_mul_pd(sh_vdw_invrcut6,sh_vdw_invrcut6))),one_twelfth),
352                                _mm_mul_pd( _mm_sub_pd(vvdw6,_mm_add_pd(_mm_mul_pd(c6_00,sh_vdw_invrcut6),_mm_mul_pd(c6grid_00,sh_lj_ewald))),one_sixth));
353             /* fvdw = vvdw12/r - (vvdw6/r + (C6grid * exponent * beta^6)/r) */
354             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,_mm_sub_pd(vvdw6,_mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6)))),rinvsq00);
355
356             cutoff_mask      = _mm_cmplt_pd(rsq00,rcutoff2);
357
358             /* Update potential sum for this i atom from the interaction with this j atom. */
359             vvdw             = _mm_and_pd(vvdw,cutoff_mask);
360             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
361
362             fscal            = fvdw;
363
364             fscal            = _mm_and_pd(fscal,cutoff_mask);
365
366             /* Calculate temporary vectorial force */
367             tx               = _mm_mul_pd(fscal,dx00);
368             ty               = _mm_mul_pd(fscal,dy00);
369             tz               = _mm_mul_pd(fscal,dz00);
370
371             /* Update vectorial force */
372             fix0             = _mm_add_pd(fix0,tx);
373             fiy0             = _mm_add_pd(fiy0,ty);
374             fiz0             = _mm_add_pd(fiz0,tz);
375
376             fjx0             = _mm_add_pd(fjx0,tx);
377             fjy0             = _mm_add_pd(fjy0,ty);
378             fjz0             = _mm_add_pd(fjz0,tz);
379
380             }
381
382             /**************************
383              * CALCULATE INTERACTIONS *
384              **************************/
385
386             if (gmx_mm_any_lt(rsq11,rcutoff2))
387             {
388
389             r11              = _mm_mul_pd(rsq11,rinv11);
390
391             /* EWALD ELECTROSTATICS */
392
393             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
394             ewrt             = _mm_mul_pd(r11,ewtabscale);
395             ewitab           = _mm_cvttpd_epi32(ewrt);
396             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
397             ewitab           = _mm_slli_epi32(ewitab,2);
398             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
399             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
400             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
401             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
402             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
403             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
404             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
405             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
406             velec            = _mm_mul_pd(qq11,_mm_sub_pd(_mm_sub_pd(rinv11,sh_ewald),velec));
407             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
408
409             cutoff_mask      = _mm_cmplt_pd(rsq11,rcutoff2);
410
411             /* Update potential sum for this i atom from the interaction with this j atom. */
412             velec            = _mm_and_pd(velec,cutoff_mask);
413             velecsum         = _mm_add_pd(velecsum,velec);
414
415             fscal            = felec;
416
417             fscal            = _mm_and_pd(fscal,cutoff_mask);
418
419             /* Calculate temporary vectorial force */
420             tx               = _mm_mul_pd(fscal,dx11);
421             ty               = _mm_mul_pd(fscal,dy11);
422             tz               = _mm_mul_pd(fscal,dz11);
423
424             /* Update vectorial force */
425             fix1             = _mm_add_pd(fix1,tx);
426             fiy1             = _mm_add_pd(fiy1,ty);
427             fiz1             = _mm_add_pd(fiz1,tz);
428
429             fjx1             = _mm_add_pd(fjx1,tx);
430             fjy1             = _mm_add_pd(fjy1,ty);
431             fjz1             = _mm_add_pd(fjz1,tz);
432
433             }
434
435             /**************************
436              * CALCULATE INTERACTIONS *
437              **************************/
438
439             if (gmx_mm_any_lt(rsq12,rcutoff2))
440             {
441
442             r12              = _mm_mul_pd(rsq12,rinv12);
443
444             /* EWALD ELECTROSTATICS */
445
446             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
447             ewrt             = _mm_mul_pd(r12,ewtabscale);
448             ewitab           = _mm_cvttpd_epi32(ewrt);
449             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
450             ewitab           = _mm_slli_epi32(ewitab,2);
451             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
452             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
453             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
454             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
455             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
456             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
457             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
458             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
459             velec            = _mm_mul_pd(qq12,_mm_sub_pd(_mm_sub_pd(rinv12,sh_ewald),velec));
460             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
461
462             cutoff_mask      = _mm_cmplt_pd(rsq12,rcutoff2);
463
464             /* Update potential sum for this i atom from the interaction with this j atom. */
465             velec            = _mm_and_pd(velec,cutoff_mask);
466             velecsum         = _mm_add_pd(velecsum,velec);
467
468             fscal            = felec;
469
470             fscal            = _mm_and_pd(fscal,cutoff_mask);
471
472             /* Calculate temporary vectorial force */
473             tx               = _mm_mul_pd(fscal,dx12);
474             ty               = _mm_mul_pd(fscal,dy12);
475             tz               = _mm_mul_pd(fscal,dz12);
476
477             /* Update vectorial force */
478             fix1             = _mm_add_pd(fix1,tx);
479             fiy1             = _mm_add_pd(fiy1,ty);
480             fiz1             = _mm_add_pd(fiz1,tz);
481
482             fjx2             = _mm_add_pd(fjx2,tx);
483             fjy2             = _mm_add_pd(fjy2,ty);
484             fjz2             = _mm_add_pd(fjz2,tz);
485
486             }
487
488             /**************************
489              * CALCULATE INTERACTIONS *
490              **************************/
491
492             if (gmx_mm_any_lt(rsq13,rcutoff2))
493             {
494
495             r13              = _mm_mul_pd(rsq13,rinv13);
496
497             /* EWALD ELECTROSTATICS */
498
499             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
500             ewrt             = _mm_mul_pd(r13,ewtabscale);
501             ewitab           = _mm_cvttpd_epi32(ewrt);
502             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
503             ewitab           = _mm_slli_epi32(ewitab,2);
504             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
505             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
506             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
507             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
508             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
509             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
510             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
511             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
512             velec            = _mm_mul_pd(qq13,_mm_sub_pd(_mm_sub_pd(rinv13,sh_ewald),velec));
513             felec            = _mm_mul_pd(_mm_mul_pd(qq13,rinv13),_mm_sub_pd(rinvsq13,felec));
514
515             cutoff_mask      = _mm_cmplt_pd(rsq13,rcutoff2);
516
517             /* Update potential sum for this i atom from the interaction with this j atom. */
518             velec            = _mm_and_pd(velec,cutoff_mask);
519             velecsum         = _mm_add_pd(velecsum,velec);
520
521             fscal            = felec;
522
523             fscal            = _mm_and_pd(fscal,cutoff_mask);
524
525             /* Calculate temporary vectorial force */
526             tx               = _mm_mul_pd(fscal,dx13);
527             ty               = _mm_mul_pd(fscal,dy13);
528             tz               = _mm_mul_pd(fscal,dz13);
529
530             /* Update vectorial force */
531             fix1             = _mm_add_pd(fix1,tx);
532             fiy1             = _mm_add_pd(fiy1,ty);
533             fiz1             = _mm_add_pd(fiz1,tz);
534
535             fjx3             = _mm_add_pd(fjx3,tx);
536             fjy3             = _mm_add_pd(fjy3,ty);
537             fjz3             = _mm_add_pd(fjz3,tz);
538
539             }
540
541             /**************************
542              * CALCULATE INTERACTIONS *
543              **************************/
544
545             if (gmx_mm_any_lt(rsq21,rcutoff2))
546             {
547
548             r21              = _mm_mul_pd(rsq21,rinv21);
549
550             /* EWALD ELECTROSTATICS */
551
552             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
553             ewrt             = _mm_mul_pd(r21,ewtabscale);
554             ewitab           = _mm_cvttpd_epi32(ewrt);
555             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
556             ewitab           = _mm_slli_epi32(ewitab,2);
557             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
558             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
559             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
560             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
561             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
562             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
563             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
564             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
565             velec            = _mm_mul_pd(qq21,_mm_sub_pd(_mm_sub_pd(rinv21,sh_ewald),velec));
566             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
567
568             cutoff_mask      = _mm_cmplt_pd(rsq21,rcutoff2);
569
570             /* Update potential sum for this i atom from the interaction with this j atom. */
571             velec            = _mm_and_pd(velec,cutoff_mask);
572             velecsum         = _mm_add_pd(velecsum,velec);
573
574             fscal            = felec;
575
576             fscal            = _mm_and_pd(fscal,cutoff_mask);
577
578             /* Calculate temporary vectorial force */
579             tx               = _mm_mul_pd(fscal,dx21);
580             ty               = _mm_mul_pd(fscal,dy21);
581             tz               = _mm_mul_pd(fscal,dz21);
582
583             /* Update vectorial force */
584             fix2             = _mm_add_pd(fix2,tx);
585             fiy2             = _mm_add_pd(fiy2,ty);
586             fiz2             = _mm_add_pd(fiz2,tz);
587
588             fjx1             = _mm_add_pd(fjx1,tx);
589             fjy1             = _mm_add_pd(fjy1,ty);
590             fjz1             = _mm_add_pd(fjz1,tz);
591
592             }
593
594             /**************************
595              * CALCULATE INTERACTIONS *
596              **************************/
597
598             if (gmx_mm_any_lt(rsq22,rcutoff2))
599             {
600
601             r22              = _mm_mul_pd(rsq22,rinv22);
602
603             /* EWALD ELECTROSTATICS */
604
605             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
606             ewrt             = _mm_mul_pd(r22,ewtabscale);
607             ewitab           = _mm_cvttpd_epi32(ewrt);
608             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
609             ewitab           = _mm_slli_epi32(ewitab,2);
610             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
611             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
612             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
613             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
614             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
615             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
616             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
617             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
618             velec            = _mm_mul_pd(qq22,_mm_sub_pd(_mm_sub_pd(rinv22,sh_ewald),velec));
619             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
620
621             cutoff_mask      = _mm_cmplt_pd(rsq22,rcutoff2);
622
623             /* Update potential sum for this i atom from the interaction with this j atom. */
624             velec            = _mm_and_pd(velec,cutoff_mask);
625             velecsum         = _mm_add_pd(velecsum,velec);
626
627             fscal            = felec;
628
629             fscal            = _mm_and_pd(fscal,cutoff_mask);
630
631             /* Calculate temporary vectorial force */
632             tx               = _mm_mul_pd(fscal,dx22);
633             ty               = _mm_mul_pd(fscal,dy22);
634             tz               = _mm_mul_pd(fscal,dz22);
635
636             /* Update vectorial force */
637             fix2             = _mm_add_pd(fix2,tx);
638             fiy2             = _mm_add_pd(fiy2,ty);
639             fiz2             = _mm_add_pd(fiz2,tz);
640
641             fjx2             = _mm_add_pd(fjx2,tx);
642             fjy2             = _mm_add_pd(fjy2,ty);
643             fjz2             = _mm_add_pd(fjz2,tz);
644
645             }
646
647             /**************************
648              * CALCULATE INTERACTIONS *
649              **************************/
650
651             if (gmx_mm_any_lt(rsq23,rcutoff2))
652             {
653
654             r23              = _mm_mul_pd(rsq23,rinv23);
655
656             /* EWALD ELECTROSTATICS */
657
658             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
659             ewrt             = _mm_mul_pd(r23,ewtabscale);
660             ewitab           = _mm_cvttpd_epi32(ewrt);
661             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
662             ewitab           = _mm_slli_epi32(ewitab,2);
663             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
664             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
665             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
666             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
667             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
668             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
669             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
670             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
671             velec            = _mm_mul_pd(qq23,_mm_sub_pd(_mm_sub_pd(rinv23,sh_ewald),velec));
672             felec            = _mm_mul_pd(_mm_mul_pd(qq23,rinv23),_mm_sub_pd(rinvsq23,felec));
673
674             cutoff_mask      = _mm_cmplt_pd(rsq23,rcutoff2);
675
676             /* Update potential sum for this i atom from the interaction with this j atom. */
677             velec            = _mm_and_pd(velec,cutoff_mask);
678             velecsum         = _mm_add_pd(velecsum,velec);
679
680             fscal            = felec;
681
682             fscal            = _mm_and_pd(fscal,cutoff_mask);
683
684             /* Calculate temporary vectorial force */
685             tx               = _mm_mul_pd(fscal,dx23);
686             ty               = _mm_mul_pd(fscal,dy23);
687             tz               = _mm_mul_pd(fscal,dz23);
688
689             /* Update vectorial force */
690             fix2             = _mm_add_pd(fix2,tx);
691             fiy2             = _mm_add_pd(fiy2,ty);
692             fiz2             = _mm_add_pd(fiz2,tz);
693
694             fjx3             = _mm_add_pd(fjx3,tx);
695             fjy3             = _mm_add_pd(fjy3,ty);
696             fjz3             = _mm_add_pd(fjz3,tz);
697
698             }
699
700             /**************************
701              * CALCULATE INTERACTIONS *
702              **************************/
703
704             if (gmx_mm_any_lt(rsq31,rcutoff2))
705             {
706
707             r31              = _mm_mul_pd(rsq31,rinv31);
708
709             /* EWALD ELECTROSTATICS */
710
711             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
712             ewrt             = _mm_mul_pd(r31,ewtabscale);
713             ewitab           = _mm_cvttpd_epi32(ewrt);
714             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
715             ewitab           = _mm_slli_epi32(ewitab,2);
716             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
717             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
718             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
719             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
720             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
721             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
722             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
723             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
724             velec            = _mm_mul_pd(qq31,_mm_sub_pd(_mm_sub_pd(rinv31,sh_ewald),velec));
725             felec            = _mm_mul_pd(_mm_mul_pd(qq31,rinv31),_mm_sub_pd(rinvsq31,felec));
726
727             cutoff_mask      = _mm_cmplt_pd(rsq31,rcutoff2);
728
729             /* Update potential sum for this i atom from the interaction with this j atom. */
730             velec            = _mm_and_pd(velec,cutoff_mask);
731             velecsum         = _mm_add_pd(velecsum,velec);
732
733             fscal            = felec;
734
735             fscal            = _mm_and_pd(fscal,cutoff_mask);
736
737             /* Calculate temporary vectorial force */
738             tx               = _mm_mul_pd(fscal,dx31);
739             ty               = _mm_mul_pd(fscal,dy31);
740             tz               = _mm_mul_pd(fscal,dz31);
741
742             /* Update vectorial force */
743             fix3             = _mm_add_pd(fix3,tx);
744             fiy3             = _mm_add_pd(fiy3,ty);
745             fiz3             = _mm_add_pd(fiz3,tz);
746
747             fjx1             = _mm_add_pd(fjx1,tx);
748             fjy1             = _mm_add_pd(fjy1,ty);
749             fjz1             = _mm_add_pd(fjz1,tz);
750
751             }
752
753             /**************************
754              * CALCULATE INTERACTIONS *
755              **************************/
756
757             if (gmx_mm_any_lt(rsq32,rcutoff2))
758             {
759
760             r32              = _mm_mul_pd(rsq32,rinv32);
761
762             /* EWALD ELECTROSTATICS */
763
764             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
765             ewrt             = _mm_mul_pd(r32,ewtabscale);
766             ewitab           = _mm_cvttpd_epi32(ewrt);
767             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
768             ewitab           = _mm_slli_epi32(ewitab,2);
769             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
770             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
771             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
772             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
773             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
774             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
775             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
776             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
777             velec            = _mm_mul_pd(qq32,_mm_sub_pd(_mm_sub_pd(rinv32,sh_ewald),velec));
778             felec            = _mm_mul_pd(_mm_mul_pd(qq32,rinv32),_mm_sub_pd(rinvsq32,felec));
779
780             cutoff_mask      = _mm_cmplt_pd(rsq32,rcutoff2);
781
782             /* Update potential sum for this i atom from the interaction with this j atom. */
783             velec            = _mm_and_pd(velec,cutoff_mask);
784             velecsum         = _mm_add_pd(velecsum,velec);
785
786             fscal            = felec;
787
788             fscal            = _mm_and_pd(fscal,cutoff_mask);
789
790             /* Calculate temporary vectorial force */
791             tx               = _mm_mul_pd(fscal,dx32);
792             ty               = _mm_mul_pd(fscal,dy32);
793             tz               = _mm_mul_pd(fscal,dz32);
794
795             /* Update vectorial force */
796             fix3             = _mm_add_pd(fix3,tx);
797             fiy3             = _mm_add_pd(fiy3,ty);
798             fiz3             = _mm_add_pd(fiz3,tz);
799
800             fjx2             = _mm_add_pd(fjx2,tx);
801             fjy2             = _mm_add_pd(fjy2,ty);
802             fjz2             = _mm_add_pd(fjz2,tz);
803
804             }
805
806             /**************************
807              * CALCULATE INTERACTIONS *
808              **************************/
809
810             if (gmx_mm_any_lt(rsq33,rcutoff2))
811             {
812
813             r33              = _mm_mul_pd(rsq33,rinv33);
814
815             /* EWALD ELECTROSTATICS */
816
817             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
818             ewrt             = _mm_mul_pd(r33,ewtabscale);
819             ewitab           = _mm_cvttpd_epi32(ewrt);
820             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
821             ewitab           = _mm_slli_epi32(ewitab,2);
822             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
823             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
824             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
825             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
826             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
827             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
828             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
829             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
830             velec            = _mm_mul_pd(qq33,_mm_sub_pd(_mm_sub_pd(rinv33,sh_ewald),velec));
831             felec            = _mm_mul_pd(_mm_mul_pd(qq33,rinv33),_mm_sub_pd(rinvsq33,felec));
832
833             cutoff_mask      = _mm_cmplt_pd(rsq33,rcutoff2);
834
835             /* Update potential sum for this i atom from the interaction with this j atom. */
836             velec            = _mm_and_pd(velec,cutoff_mask);
837             velecsum         = _mm_add_pd(velecsum,velec);
838
839             fscal            = felec;
840
841             fscal            = _mm_and_pd(fscal,cutoff_mask);
842
843             /* Calculate temporary vectorial force */
844             tx               = _mm_mul_pd(fscal,dx33);
845             ty               = _mm_mul_pd(fscal,dy33);
846             tz               = _mm_mul_pd(fscal,dz33);
847
848             /* Update vectorial force */
849             fix3             = _mm_add_pd(fix3,tx);
850             fiy3             = _mm_add_pd(fiy3,ty);
851             fiz3             = _mm_add_pd(fiz3,tz);
852
853             fjx3             = _mm_add_pd(fjx3,tx);
854             fjy3             = _mm_add_pd(fjy3,ty);
855             fjz3             = _mm_add_pd(fjz3,tz);
856
857             }
858
859             gmx_mm_decrement_4rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
860
861             /* Inner loop uses 478 flops */
862         }
863
864         if(jidx<j_index_end)
865         {
866
867             jnrA             = jjnr[jidx];
868             j_coord_offsetA  = DIM*jnrA;
869
870             /* load j atom coordinates */
871             gmx_mm_load_4rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
872                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
873                                               &jy2,&jz2,&jx3,&jy3,&jz3);
874
875             /* Calculate displacement vector */
876             dx00             = _mm_sub_pd(ix0,jx0);
877             dy00             = _mm_sub_pd(iy0,jy0);
878             dz00             = _mm_sub_pd(iz0,jz0);
879             dx11             = _mm_sub_pd(ix1,jx1);
880             dy11             = _mm_sub_pd(iy1,jy1);
881             dz11             = _mm_sub_pd(iz1,jz1);
882             dx12             = _mm_sub_pd(ix1,jx2);
883             dy12             = _mm_sub_pd(iy1,jy2);
884             dz12             = _mm_sub_pd(iz1,jz2);
885             dx13             = _mm_sub_pd(ix1,jx3);
886             dy13             = _mm_sub_pd(iy1,jy3);
887             dz13             = _mm_sub_pd(iz1,jz3);
888             dx21             = _mm_sub_pd(ix2,jx1);
889             dy21             = _mm_sub_pd(iy2,jy1);
890             dz21             = _mm_sub_pd(iz2,jz1);
891             dx22             = _mm_sub_pd(ix2,jx2);
892             dy22             = _mm_sub_pd(iy2,jy2);
893             dz22             = _mm_sub_pd(iz2,jz2);
894             dx23             = _mm_sub_pd(ix2,jx3);
895             dy23             = _mm_sub_pd(iy2,jy3);
896             dz23             = _mm_sub_pd(iz2,jz3);
897             dx31             = _mm_sub_pd(ix3,jx1);
898             dy31             = _mm_sub_pd(iy3,jy1);
899             dz31             = _mm_sub_pd(iz3,jz1);
900             dx32             = _mm_sub_pd(ix3,jx2);
901             dy32             = _mm_sub_pd(iy3,jy2);
902             dz32             = _mm_sub_pd(iz3,jz2);
903             dx33             = _mm_sub_pd(ix3,jx3);
904             dy33             = _mm_sub_pd(iy3,jy3);
905             dz33             = _mm_sub_pd(iz3,jz3);
906
907             /* Calculate squared distance and things based on it */
908             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
909             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
910             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
911             rsq13            = gmx_mm_calc_rsq_pd(dx13,dy13,dz13);
912             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
913             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
914             rsq23            = gmx_mm_calc_rsq_pd(dx23,dy23,dz23);
915             rsq31            = gmx_mm_calc_rsq_pd(dx31,dy31,dz31);
916             rsq32            = gmx_mm_calc_rsq_pd(dx32,dy32,dz32);
917             rsq33            = gmx_mm_calc_rsq_pd(dx33,dy33,dz33);
918
919             rinv00           = gmx_mm_invsqrt_pd(rsq00);
920             rinv11           = gmx_mm_invsqrt_pd(rsq11);
921             rinv12           = gmx_mm_invsqrt_pd(rsq12);
922             rinv13           = gmx_mm_invsqrt_pd(rsq13);
923             rinv21           = gmx_mm_invsqrt_pd(rsq21);
924             rinv22           = gmx_mm_invsqrt_pd(rsq22);
925             rinv23           = gmx_mm_invsqrt_pd(rsq23);
926             rinv31           = gmx_mm_invsqrt_pd(rsq31);
927             rinv32           = gmx_mm_invsqrt_pd(rsq32);
928             rinv33           = gmx_mm_invsqrt_pd(rsq33);
929
930             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
931             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
932             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
933             rinvsq13         = _mm_mul_pd(rinv13,rinv13);
934             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
935             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
936             rinvsq23         = _mm_mul_pd(rinv23,rinv23);
937             rinvsq31         = _mm_mul_pd(rinv31,rinv31);
938             rinvsq32         = _mm_mul_pd(rinv32,rinv32);
939             rinvsq33         = _mm_mul_pd(rinv33,rinv33);
940
941             fjx0             = _mm_setzero_pd();
942             fjy0             = _mm_setzero_pd();
943             fjz0             = _mm_setzero_pd();
944             fjx1             = _mm_setzero_pd();
945             fjy1             = _mm_setzero_pd();
946             fjz1             = _mm_setzero_pd();
947             fjx2             = _mm_setzero_pd();
948             fjy2             = _mm_setzero_pd();
949             fjz2             = _mm_setzero_pd();
950             fjx3             = _mm_setzero_pd();
951             fjy3             = _mm_setzero_pd();
952             fjz3             = _mm_setzero_pd();
953
954             /**************************
955              * CALCULATE INTERACTIONS *
956              **************************/
957
958             if (gmx_mm_any_lt(rsq00,rcutoff2))
959             {
960
961             r00              = _mm_mul_pd(rsq00,rinv00);
962
963             /* Analytical LJ-PME */
964             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
965             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
966             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
967             exponent         = gmx_simd_exp_d(ewcljrsq);
968             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
969             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
970             /* vvdw6 = [C6 - C6grid * (1-poly)]/r6 */
971             vvdw6            = _mm_mul_pd(_mm_sub_pd(c6_00,_mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly))),rinvsix);
972             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
973             vvdw             = _mm_sub_pd(_mm_mul_pd( _mm_sub_pd(vvdw12 , _mm_mul_pd(c12_00,_mm_mul_pd(sh_vdw_invrcut6,sh_vdw_invrcut6))),one_twelfth),
974                                _mm_mul_pd( _mm_sub_pd(vvdw6,_mm_add_pd(_mm_mul_pd(c6_00,sh_vdw_invrcut6),_mm_mul_pd(c6grid_00,sh_lj_ewald))),one_sixth));
975             /* fvdw = vvdw12/r - (vvdw6/r + (C6grid * exponent * beta^6)/r) */
976             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,_mm_sub_pd(vvdw6,_mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6)))),rinvsq00);
977
978             cutoff_mask      = _mm_cmplt_pd(rsq00,rcutoff2);
979
980             /* Update potential sum for this i atom from the interaction with this j atom. */
981             vvdw             = _mm_and_pd(vvdw,cutoff_mask);
982             vvdw             = _mm_unpacklo_pd(vvdw,_mm_setzero_pd());
983             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
984
985             fscal            = fvdw;
986
987             fscal            = _mm_and_pd(fscal,cutoff_mask);
988
989             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
990
991             /* Calculate temporary vectorial force */
992             tx               = _mm_mul_pd(fscal,dx00);
993             ty               = _mm_mul_pd(fscal,dy00);
994             tz               = _mm_mul_pd(fscal,dz00);
995
996             /* Update vectorial force */
997             fix0             = _mm_add_pd(fix0,tx);
998             fiy0             = _mm_add_pd(fiy0,ty);
999             fiz0             = _mm_add_pd(fiz0,tz);
1000
1001             fjx0             = _mm_add_pd(fjx0,tx);
1002             fjy0             = _mm_add_pd(fjy0,ty);
1003             fjz0             = _mm_add_pd(fjz0,tz);
1004
1005             }
1006
1007             /**************************
1008              * CALCULATE INTERACTIONS *
1009              **************************/
1010
1011             if (gmx_mm_any_lt(rsq11,rcutoff2))
1012             {
1013
1014             r11              = _mm_mul_pd(rsq11,rinv11);
1015
1016             /* EWALD ELECTROSTATICS */
1017
1018             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1019             ewrt             = _mm_mul_pd(r11,ewtabscale);
1020             ewitab           = _mm_cvttpd_epi32(ewrt);
1021             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1022             ewitab           = _mm_slli_epi32(ewitab,2);
1023             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1024             ewtabD           = _mm_setzero_pd();
1025             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1026             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1027             ewtabFn          = _mm_setzero_pd();
1028             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1029             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1030             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1031             velec            = _mm_mul_pd(qq11,_mm_sub_pd(_mm_sub_pd(rinv11,sh_ewald),velec));
1032             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1033
1034             cutoff_mask      = _mm_cmplt_pd(rsq11,rcutoff2);
1035
1036             /* Update potential sum for this i atom from the interaction with this j atom. */
1037             velec            = _mm_and_pd(velec,cutoff_mask);
1038             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1039             velecsum         = _mm_add_pd(velecsum,velec);
1040
1041             fscal            = felec;
1042
1043             fscal            = _mm_and_pd(fscal,cutoff_mask);
1044
1045             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1046
1047             /* Calculate temporary vectorial force */
1048             tx               = _mm_mul_pd(fscal,dx11);
1049             ty               = _mm_mul_pd(fscal,dy11);
1050             tz               = _mm_mul_pd(fscal,dz11);
1051
1052             /* Update vectorial force */
1053             fix1             = _mm_add_pd(fix1,tx);
1054             fiy1             = _mm_add_pd(fiy1,ty);
1055             fiz1             = _mm_add_pd(fiz1,tz);
1056
1057             fjx1             = _mm_add_pd(fjx1,tx);
1058             fjy1             = _mm_add_pd(fjy1,ty);
1059             fjz1             = _mm_add_pd(fjz1,tz);
1060
1061             }
1062
1063             /**************************
1064              * CALCULATE INTERACTIONS *
1065              **************************/
1066
1067             if (gmx_mm_any_lt(rsq12,rcutoff2))
1068             {
1069
1070             r12              = _mm_mul_pd(rsq12,rinv12);
1071
1072             /* EWALD ELECTROSTATICS */
1073
1074             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1075             ewrt             = _mm_mul_pd(r12,ewtabscale);
1076             ewitab           = _mm_cvttpd_epi32(ewrt);
1077             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1078             ewitab           = _mm_slli_epi32(ewitab,2);
1079             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1080             ewtabD           = _mm_setzero_pd();
1081             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1082             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1083             ewtabFn          = _mm_setzero_pd();
1084             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1085             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1086             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1087             velec            = _mm_mul_pd(qq12,_mm_sub_pd(_mm_sub_pd(rinv12,sh_ewald),velec));
1088             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1089
1090             cutoff_mask      = _mm_cmplt_pd(rsq12,rcutoff2);
1091
1092             /* Update potential sum for this i atom from the interaction with this j atom. */
1093             velec            = _mm_and_pd(velec,cutoff_mask);
1094             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1095             velecsum         = _mm_add_pd(velecsum,velec);
1096
1097             fscal            = felec;
1098
1099             fscal            = _mm_and_pd(fscal,cutoff_mask);
1100
1101             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1102
1103             /* Calculate temporary vectorial force */
1104             tx               = _mm_mul_pd(fscal,dx12);
1105             ty               = _mm_mul_pd(fscal,dy12);
1106             tz               = _mm_mul_pd(fscal,dz12);
1107
1108             /* Update vectorial force */
1109             fix1             = _mm_add_pd(fix1,tx);
1110             fiy1             = _mm_add_pd(fiy1,ty);
1111             fiz1             = _mm_add_pd(fiz1,tz);
1112
1113             fjx2             = _mm_add_pd(fjx2,tx);
1114             fjy2             = _mm_add_pd(fjy2,ty);
1115             fjz2             = _mm_add_pd(fjz2,tz);
1116
1117             }
1118
1119             /**************************
1120              * CALCULATE INTERACTIONS *
1121              **************************/
1122
1123             if (gmx_mm_any_lt(rsq13,rcutoff2))
1124             {
1125
1126             r13              = _mm_mul_pd(rsq13,rinv13);
1127
1128             /* EWALD ELECTROSTATICS */
1129
1130             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1131             ewrt             = _mm_mul_pd(r13,ewtabscale);
1132             ewitab           = _mm_cvttpd_epi32(ewrt);
1133             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1134             ewitab           = _mm_slli_epi32(ewitab,2);
1135             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1136             ewtabD           = _mm_setzero_pd();
1137             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1138             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1139             ewtabFn          = _mm_setzero_pd();
1140             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1141             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1142             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1143             velec            = _mm_mul_pd(qq13,_mm_sub_pd(_mm_sub_pd(rinv13,sh_ewald),velec));
1144             felec            = _mm_mul_pd(_mm_mul_pd(qq13,rinv13),_mm_sub_pd(rinvsq13,felec));
1145
1146             cutoff_mask      = _mm_cmplt_pd(rsq13,rcutoff2);
1147
1148             /* Update potential sum for this i atom from the interaction with this j atom. */
1149             velec            = _mm_and_pd(velec,cutoff_mask);
1150             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1151             velecsum         = _mm_add_pd(velecsum,velec);
1152
1153             fscal            = felec;
1154
1155             fscal            = _mm_and_pd(fscal,cutoff_mask);
1156
1157             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1158
1159             /* Calculate temporary vectorial force */
1160             tx               = _mm_mul_pd(fscal,dx13);
1161             ty               = _mm_mul_pd(fscal,dy13);
1162             tz               = _mm_mul_pd(fscal,dz13);
1163
1164             /* Update vectorial force */
1165             fix1             = _mm_add_pd(fix1,tx);
1166             fiy1             = _mm_add_pd(fiy1,ty);
1167             fiz1             = _mm_add_pd(fiz1,tz);
1168
1169             fjx3             = _mm_add_pd(fjx3,tx);
1170             fjy3             = _mm_add_pd(fjy3,ty);
1171             fjz3             = _mm_add_pd(fjz3,tz);
1172
1173             }
1174
1175             /**************************
1176              * CALCULATE INTERACTIONS *
1177              **************************/
1178
1179             if (gmx_mm_any_lt(rsq21,rcutoff2))
1180             {
1181
1182             r21              = _mm_mul_pd(rsq21,rinv21);
1183
1184             /* EWALD ELECTROSTATICS */
1185
1186             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1187             ewrt             = _mm_mul_pd(r21,ewtabscale);
1188             ewitab           = _mm_cvttpd_epi32(ewrt);
1189             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1190             ewitab           = _mm_slli_epi32(ewitab,2);
1191             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1192             ewtabD           = _mm_setzero_pd();
1193             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1194             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1195             ewtabFn          = _mm_setzero_pd();
1196             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1197             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1198             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1199             velec            = _mm_mul_pd(qq21,_mm_sub_pd(_mm_sub_pd(rinv21,sh_ewald),velec));
1200             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
1201
1202             cutoff_mask      = _mm_cmplt_pd(rsq21,rcutoff2);
1203
1204             /* Update potential sum for this i atom from the interaction with this j atom. */
1205             velec            = _mm_and_pd(velec,cutoff_mask);
1206             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1207             velecsum         = _mm_add_pd(velecsum,velec);
1208
1209             fscal            = felec;
1210
1211             fscal            = _mm_and_pd(fscal,cutoff_mask);
1212
1213             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1214
1215             /* Calculate temporary vectorial force */
1216             tx               = _mm_mul_pd(fscal,dx21);
1217             ty               = _mm_mul_pd(fscal,dy21);
1218             tz               = _mm_mul_pd(fscal,dz21);
1219
1220             /* Update vectorial force */
1221             fix2             = _mm_add_pd(fix2,tx);
1222             fiy2             = _mm_add_pd(fiy2,ty);
1223             fiz2             = _mm_add_pd(fiz2,tz);
1224
1225             fjx1             = _mm_add_pd(fjx1,tx);
1226             fjy1             = _mm_add_pd(fjy1,ty);
1227             fjz1             = _mm_add_pd(fjz1,tz);
1228
1229             }
1230
1231             /**************************
1232              * CALCULATE INTERACTIONS *
1233              **************************/
1234
1235             if (gmx_mm_any_lt(rsq22,rcutoff2))
1236             {
1237
1238             r22              = _mm_mul_pd(rsq22,rinv22);
1239
1240             /* EWALD ELECTROSTATICS */
1241
1242             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1243             ewrt             = _mm_mul_pd(r22,ewtabscale);
1244             ewitab           = _mm_cvttpd_epi32(ewrt);
1245             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1246             ewitab           = _mm_slli_epi32(ewitab,2);
1247             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1248             ewtabD           = _mm_setzero_pd();
1249             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1250             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1251             ewtabFn          = _mm_setzero_pd();
1252             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1253             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1254             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1255             velec            = _mm_mul_pd(qq22,_mm_sub_pd(_mm_sub_pd(rinv22,sh_ewald),velec));
1256             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
1257
1258             cutoff_mask      = _mm_cmplt_pd(rsq22,rcutoff2);
1259
1260             /* Update potential sum for this i atom from the interaction with this j atom. */
1261             velec            = _mm_and_pd(velec,cutoff_mask);
1262             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1263             velecsum         = _mm_add_pd(velecsum,velec);
1264
1265             fscal            = felec;
1266
1267             fscal            = _mm_and_pd(fscal,cutoff_mask);
1268
1269             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1270
1271             /* Calculate temporary vectorial force */
1272             tx               = _mm_mul_pd(fscal,dx22);
1273             ty               = _mm_mul_pd(fscal,dy22);
1274             tz               = _mm_mul_pd(fscal,dz22);
1275
1276             /* Update vectorial force */
1277             fix2             = _mm_add_pd(fix2,tx);
1278             fiy2             = _mm_add_pd(fiy2,ty);
1279             fiz2             = _mm_add_pd(fiz2,tz);
1280
1281             fjx2             = _mm_add_pd(fjx2,tx);
1282             fjy2             = _mm_add_pd(fjy2,ty);
1283             fjz2             = _mm_add_pd(fjz2,tz);
1284
1285             }
1286
1287             /**************************
1288              * CALCULATE INTERACTIONS *
1289              **************************/
1290
1291             if (gmx_mm_any_lt(rsq23,rcutoff2))
1292             {
1293
1294             r23              = _mm_mul_pd(rsq23,rinv23);
1295
1296             /* EWALD ELECTROSTATICS */
1297
1298             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1299             ewrt             = _mm_mul_pd(r23,ewtabscale);
1300             ewitab           = _mm_cvttpd_epi32(ewrt);
1301             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1302             ewitab           = _mm_slli_epi32(ewitab,2);
1303             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1304             ewtabD           = _mm_setzero_pd();
1305             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1306             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1307             ewtabFn          = _mm_setzero_pd();
1308             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1309             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1310             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1311             velec            = _mm_mul_pd(qq23,_mm_sub_pd(_mm_sub_pd(rinv23,sh_ewald),velec));
1312             felec            = _mm_mul_pd(_mm_mul_pd(qq23,rinv23),_mm_sub_pd(rinvsq23,felec));
1313
1314             cutoff_mask      = _mm_cmplt_pd(rsq23,rcutoff2);
1315
1316             /* Update potential sum for this i atom from the interaction with this j atom. */
1317             velec            = _mm_and_pd(velec,cutoff_mask);
1318             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1319             velecsum         = _mm_add_pd(velecsum,velec);
1320
1321             fscal            = felec;
1322
1323             fscal            = _mm_and_pd(fscal,cutoff_mask);
1324
1325             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1326
1327             /* Calculate temporary vectorial force */
1328             tx               = _mm_mul_pd(fscal,dx23);
1329             ty               = _mm_mul_pd(fscal,dy23);
1330             tz               = _mm_mul_pd(fscal,dz23);
1331
1332             /* Update vectorial force */
1333             fix2             = _mm_add_pd(fix2,tx);
1334             fiy2             = _mm_add_pd(fiy2,ty);
1335             fiz2             = _mm_add_pd(fiz2,tz);
1336
1337             fjx3             = _mm_add_pd(fjx3,tx);
1338             fjy3             = _mm_add_pd(fjy3,ty);
1339             fjz3             = _mm_add_pd(fjz3,tz);
1340
1341             }
1342
1343             /**************************
1344              * CALCULATE INTERACTIONS *
1345              **************************/
1346
1347             if (gmx_mm_any_lt(rsq31,rcutoff2))
1348             {
1349
1350             r31              = _mm_mul_pd(rsq31,rinv31);
1351
1352             /* EWALD ELECTROSTATICS */
1353
1354             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1355             ewrt             = _mm_mul_pd(r31,ewtabscale);
1356             ewitab           = _mm_cvttpd_epi32(ewrt);
1357             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1358             ewitab           = _mm_slli_epi32(ewitab,2);
1359             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1360             ewtabD           = _mm_setzero_pd();
1361             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1362             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1363             ewtabFn          = _mm_setzero_pd();
1364             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1365             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1366             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1367             velec            = _mm_mul_pd(qq31,_mm_sub_pd(_mm_sub_pd(rinv31,sh_ewald),velec));
1368             felec            = _mm_mul_pd(_mm_mul_pd(qq31,rinv31),_mm_sub_pd(rinvsq31,felec));
1369
1370             cutoff_mask      = _mm_cmplt_pd(rsq31,rcutoff2);
1371
1372             /* Update potential sum for this i atom from the interaction with this j atom. */
1373             velec            = _mm_and_pd(velec,cutoff_mask);
1374             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1375             velecsum         = _mm_add_pd(velecsum,velec);
1376
1377             fscal            = felec;
1378
1379             fscal            = _mm_and_pd(fscal,cutoff_mask);
1380
1381             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1382
1383             /* Calculate temporary vectorial force */
1384             tx               = _mm_mul_pd(fscal,dx31);
1385             ty               = _mm_mul_pd(fscal,dy31);
1386             tz               = _mm_mul_pd(fscal,dz31);
1387
1388             /* Update vectorial force */
1389             fix3             = _mm_add_pd(fix3,tx);
1390             fiy3             = _mm_add_pd(fiy3,ty);
1391             fiz3             = _mm_add_pd(fiz3,tz);
1392
1393             fjx1             = _mm_add_pd(fjx1,tx);
1394             fjy1             = _mm_add_pd(fjy1,ty);
1395             fjz1             = _mm_add_pd(fjz1,tz);
1396
1397             }
1398
1399             /**************************
1400              * CALCULATE INTERACTIONS *
1401              **************************/
1402
1403             if (gmx_mm_any_lt(rsq32,rcutoff2))
1404             {
1405
1406             r32              = _mm_mul_pd(rsq32,rinv32);
1407
1408             /* EWALD ELECTROSTATICS */
1409
1410             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1411             ewrt             = _mm_mul_pd(r32,ewtabscale);
1412             ewitab           = _mm_cvttpd_epi32(ewrt);
1413             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1414             ewitab           = _mm_slli_epi32(ewitab,2);
1415             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1416             ewtabD           = _mm_setzero_pd();
1417             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1418             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1419             ewtabFn          = _mm_setzero_pd();
1420             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1421             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1422             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1423             velec            = _mm_mul_pd(qq32,_mm_sub_pd(_mm_sub_pd(rinv32,sh_ewald),velec));
1424             felec            = _mm_mul_pd(_mm_mul_pd(qq32,rinv32),_mm_sub_pd(rinvsq32,felec));
1425
1426             cutoff_mask      = _mm_cmplt_pd(rsq32,rcutoff2);
1427
1428             /* Update potential sum for this i atom from the interaction with this j atom. */
1429             velec            = _mm_and_pd(velec,cutoff_mask);
1430             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1431             velecsum         = _mm_add_pd(velecsum,velec);
1432
1433             fscal            = felec;
1434
1435             fscal            = _mm_and_pd(fscal,cutoff_mask);
1436
1437             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1438
1439             /* Calculate temporary vectorial force */
1440             tx               = _mm_mul_pd(fscal,dx32);
1441             ty               = _mm_mul_pd(fscal,dy32);
1442             tz               = _mm_mul_pd(fscal,dz32);
1443
1444             /* Update vectorial force */
1445             fix3             = _mm_add_pd(fix3,tx);
1446             fiy3             = _mm_add_pd(fiy3,ty);
1447             fiz3             = _mm_add_pd(fiz3,tz);
1448
1449             fjx2             = _mm_add_pd(fjx2,tx);
1450             fjy2             = _mm_add_pd(fjy2,ty);
1451             fjz2             = _mm_add_pd(fjz2,tz);
1452
1453             }
1454
1455             /**************************
1456              * CALCULATE INTERACTIONS *
1457              **************************/
1458
1459             if (gmx_mm_any_lt(rsq33,rcutoff2))
1460             {
1461
1462             r33              = _mm_mul_pd(rsq33,rinv33);
1463
1464             /* EWALD ELECTROSTATICS */
1465
1466             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1467             ewrt             = _mm_mul_pd(r33,ewtabscale);
1468             ewitab           = _mm_cvttpd_epi32(ewrt);
1469             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1470             ewitab           = _mm_slli_epi32(ewitab,2);
1471             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1472             ewtabD           = _mm_setzero_pd();
1473             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1474             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1475             ewtabFn          = _mm_setzero_pd();
1476             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1477             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1478             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1479             velec            = _mm_mul_pd(qq33,_mm_sub_pd(_mm_sub_pd(rinv33,sh_ewald),velec));
1480             felec            = _mm_mul_pd(_mm_mul_pd(qq33,rinv33),_mm_sub_pd(rinvsq33,felec));
1481
1482             cutoff_mask      = _mm_cmplt_pd(rsq33,rcutoff2);
1483
1484             /* Update potential sum for this i atom from the interaction with this j atom. */
1485             velec            = _mm_and_pd(velec,cutoff_mask);
1486             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1487             velecsum         = _mm_add_pd(velecsum,velec);
1488
1489             fscal            = felec;
1490
1491             fscal            = _mm_and_pd(fscal,cutoff_mask);
1492
1493             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1494
1495             /* Calculate temporary vectorial force */
1496             tx               = _mm_mul_pd(fscal,dx33);
1497             ty               = _mm_mul_pd(fscal,dy33);
1498             tz               = _mm_mul_pd(fscal,dz33);
1499
1500             /* Update vectorial force */
1501             fix3             = _mm_add_pd(fix3,tx);
1502             fiy3             = _mm_add_pd(fiy3,ty);
1503             fiz3             = _mm_add_pd(fiz3,tz);
1504
1505             fjx3             = _mm_add_pd(fjx3,tx);
1506             fjy3             = _mm_add_pd(fjy3,ty);
1507             fjz3             = _mm_add_pd(fjz3,tz);
1508
1509             }
1510
1511             gmx_mm_decrement_4rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
1512
1513             /* Inner loop uses 478 flops */
1514         }
1515
1516         /* End of innermost loop */
1517
1518         gmx_mm_update_iforce_4atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,fix3,fiy3,fiz3,
1519                                               f+i_coord_offset,fshift+i_shift_offset);
1520
1521         ggid                        = gid[iidx];
1522         /* Update potential energies */
1523         gmx_mm_update_1pot_pd(velecsum,kernel_data->energygrp_elec+ggid);
1524         gmx_mm_update_1pot_pd(vvdwsum,kernel_data->energygrp_vdw+ggid);
1525
1526         /* Increment number of inner iterations */
1527         inneriter                  += j_index_end - j_index_start;
1528
1529         /* Outer loop uses 26 flops */
1530     }
1531
1532     /* Increment number of outer iterations */
1533     outeriter        += nri;
1534
1535     /* Update outer/inner flops */
1536
1537     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_VF,outeriter*26 + inneriter*478);
1538 }
1539 /*
1540  * Gromacs nonbonded kernel:   nb_kernel_ElecEwSh_VdwLJEwSh_GeomW4W4_F_sse4_1_double
1541  * Electrostatics interaction: Ewald
1542  * VdW interaction:            LJEwald
1543  * Geometry:                   Water4-Water4
1544  * Calculate force/pot:        Force
1545  */
1546 void
1547 nb_kernel_ElecEwSh_VdwLJEwSh_GeomW4W4_F_sse4_1_double
1548                     (t_nblist                    * gmx_restrict       nlist,
1549                      rvec                        * gmx_restrict          xx,
1550                      rvec                        * gmx_restrict          ff,
1551                      t_forcerec                  * gmx_restrict          fr,
1552                      t_mdatoms                   * gmx_restrict     mdatoms,
1553                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
1554                      t_nrnb                      * gmx_restrict        nrnb)
1555 {
1556     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
1557      * just 0 for non-waters.
1558      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
1559      * jnr indices corresponding to data put in the four positions in the SIMD register.
1560      */
1561     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
1562     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1563     int              jnrA,jnrB;
1564     int              j_coord_offsetA,j_coord_offsetB;
1565     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
1566     real             rcutoff_scalar;
1567     real             *shiftvec,*fshift,*x,*f;
1568     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
1569     int              vdwioffset0;
1570     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1571     int              vdwioffset1;
1572     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1573     int              vdwioffset2;
1574     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1575     int              vdwioffset3;
1576     __m128d          ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
1577     int              vdwjidx0A,vdwjidx0B;
1578     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1579     int              vdwjidx1A,vdwjidx1B;
1580     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1581     int              vdwjidx2A,vdwjidx2B;
1582     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1583     int              vdwjidx3A,vdwjidx3B;
1584     __m128d          jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
1585     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1586     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1587     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1588     __m128d          dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13;
1589     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1590     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1591     __m128d          dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23;
1592     __m128d          dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31;
1593     __m128d          dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32;
1594     __m128d          dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33;
1595     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
1596     real             *charge;
1597     int              nvdwtype;
1598     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1599     int              *vdwtype;
1600     real             *vdwparam;
1601     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
1602     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
1603     __m128d           c6grid_00;
1604     __m128d           c6grid_11;
1605     __m128d           c6grid_12;
1606     __m128d           c6grid_13;
1607     __m128d           c6grid_21;
1608     __m128d           c6grid_22;
1609     __m128d           c6grid_23;
1610     __m128d           c6grid_31;
1611     __m128d           c6grid_32;
1612     __m128d           c6grid_33;
1613     __m128d           ewclj,ewclj2,ewclj6,ewcljrsq,poly,exponent,f6A,f6B,sh_lj_ewald;
1614     real             *vdwgridparam;
1615     __m128d           one_half = _mm_set1_pd(0.5);
1616     __m128d           minus_one = _mm_set1_pd(-1.0);
1617     __m128i          ewitab;
1618     __m128d          ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
1619     real             *ewtab;
1620     __m128d          dummy_mask,cutoff_mask;
1621     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
1622     __m128d          one     = _mm_set1_pd(1.0);
1623     __m128d          two     = _mm_set1_pd(2.0);
1624     x                = xx[0];
1625     f                = ff[0];
1626
1627     nri              = nlist->nri;
1628     iinr             = nlist->iinr;
1629     jindex           = nlist->jindex;
1630     jjnr             = nlist->jjnr;
1631     shiftidx         = nlist->shift;
1632     gid              = nlist->gid;
1633     shiftvec         = fr->shift_vec[0];
1634     fshift           = fr->fshift[0];
1635     facel            = _mm_set1_pd(fr->epsfac);
1636     charge           = mdatoms->chargeA;
1637     nvdwtype         = fr->ntype;
1638     vdwparam         = fr->nbfp;
1639     vdwtype          = mdatoms->typeA;
1640     vdwgridparam     = fr->ljpme_c6grid;
1641     sh_lj_ewald      = _mm_set1_pd(fr->ic->sh_lj_ewald);
1642     ewclj            = _mm_set1_pd(fr->ewaldcoeff_lj);
1643     ewclj2           = _mm_mul_pd(minus_one,_mm_mul_pd(ewclj,ewclj));
1644
1645     sh_ewald         = _mm_set1_pd(fr->ic->sh_ewald);
1646     ewtab            = fr->ic->tabq_coul_F;
1647     ewtabscale       = _mm_set1_pd(fr->ic->tabq_scale);
1648     ewtabhalfspace   = _mm_set1_pd(0.5/fr->ic->tabq_scale);
1649
1650     /* Setup water-specific parameters */
1651     inr              = nlist->iinr[0];
1652     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
1653     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
1654     iq3              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+3]));
1655     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
1656
1657     jq1              = _mm_set1_pd(charge[inr+1]);
1658     jq2              = _mm_set1_pd(charge[inr+2]);
1659     jq3              = _mm_set1_pd(charge[inr+3]);
1660     vdwjidx0A        = 2*vdwtype[inr+0];
1661     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
1662     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
1663     c6grid_00        = _mm_set1_pd(vdwgridparam[vdwioffset0+vdwjidx0A]);
1664     qq11             = _mm_mul_pd(iq1,jq1);
1665     qq12             = _mm_mul_pd(iq1,jq2);
1666     qq13             = _mm_mul_pd(iq1,jq3);
1667     qq21             = _mm_mul_pd(iq2,jq1);
1668     qq22             = _mm_mul_pd(iq2,jq2);
1669     qq23             = _mm_mul_pd(iq2,jq3);
1670     qq31             = _mm_mul_pd(iq3,jq1);
1671     qq32             = _mm_mul_pd(iq3,jq2);
1672     qq33             = _mm_mul_pd(iq3,jq3);
1673
1674     /* When we use explicit cutoffs the value must be identical for elec and VdW, so use elec as an arbitrary choice */
1675     rcutoff_scalar   = fr->rcoulomb;
1676     rcutoff          = _mm_set1_pd(rcutoff_scalar);
1677     rcutoff2         = _mm_mul_pd(rcutoff,rcutoff);
1678
1679     sh_vdw_invrcut6  = _mm_set1_pd(fr->ic->sh_invrc6);
1680     rvdw             = _mm_set1_pd(fr->rvdw);
1681
1682     /* Avoid stupid compiler warnings */
1683     jnrA = jnrB = 0;
1684     j_coord_offsetA = 0;
1685     j_coord_offsetB = 0;
1686
1687     outeriter        = 0;
1688     inneriter        = 0;
1689
1690     /* Start outer loop over neighborlists */
1691     for(iidx=0; iidx<nri; iidx++)
1692     {
1693         /* Load shift vector for this list */
1694         i_shift_offset   = DIM*shiftidx[iidx];
1695
1696         /* Load limits for loop over neighbors */
1697         j_index_start    = jindex[iidx];
1698         j_index_end      = jindex[iidx+1];
1699
1700         /* Get outer coordinate index */
1701         inr              = iinr[iidx];
1702         i_coord_offset   = DIM*inr;
1703
1704         /* Load i particle coords and add shift vector */
1705         gmx_mm_load_shift_and_4rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
1706                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2,&ix3,&iy3,&iz3);
1707
1708         fix0             = _mm_setzero_pd();
1709         fiy0             = _mm_setzero_pd();
1710         fiz0             = _mm_setzero_pd();
1711         fix1             = _mm_setzero_pd();
1712         fiy1             = _mm_setzero_pd();
1713         fiz1             = _mm_setzero_pd();
1714         fix2             = _mm_setzero_pd();
1715         fiy2             = _mm_setzero_pd();
1716         fiz2             = _mm_setzero_pd();
1717         fix3             = _mm_setzero_pd();
1718         fiy3             = _mm_setzero_pd();
1719         fiz3             = _mm_setzero_pd();
1720
1721         /* Start inner kernel loop */
1722         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
1723         {
1724
1725             /* Get j neighbor index, and coordinate index */
1726             jnrA             = jjnr[jidx];
1727             jnrB             = jjnr[jidx+1];
1728             j_coord_offsetA  = DIM*jnrA;
1729             j_coord_offsetB  = DIM*jnrB;
1730
1731             /* load j atom coordinates */
1732             gmx_mm_load_4rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
1733                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
1734                                               &jy2,&jz2,&jx3,&jy3,&jz3);
1735
1736             /* Calculate displacement vector */
1737             dx00             = _mm_sub_pd(ix0,jx0);
1738             dy00             = _mm_sub_pd(iy0,jy0);
1739             dz00             = _mm_sub_pd(iz0,jz0);
1740             dx11             = _mm_sub_pd(ix1,jx1);
1741             dy11             = _mm_sub_pd(iy1,jy1);
1742             dz11             = _mm_sub_pd(iz1,jz1);
1743             dx12             = _mm_sub_pd(ix1,jx2);
1744             dy12             = _mm_sub_pd(iy1,jy2);
1745             dz12             = _mm_sub_pd(iz1,jz2);
1746             dx13             = _mm_sub_pd(ix1,jx3);
1747             dy13             = _mm_sub_pd(iy1,jy3);
1748             dz13             = _mm_sub_pd(iz1,jz3);
1749             dx21             = _mm_sub_pd(ix2,jx1);
1750             dy21             = _mm_sub_pd(iy2,jy1);
1751             dz21             = _mm_sub_pd(iz2,jz1);
1752             dx22             = _mm_sub_pd(ix2,jx2);
1753             dy22             = _mm_sub_pd(iy2,jy2);
1754             dz22             = _mm_sub_pd(iz2,jz2);
1755             dx23             = _mm_sub_pd(ix2,jx3);
1756             dy23             = _mm_sub_pd(iy2,jy3);
1757             dz23             = _mm_sub_pd(iz2,jz3);
1758             dx31             = _mm_sub_pd(ix3,jx1);
1759             dy31             = _mm_sub_pd(iy3,jy1);
1760             dz31             = _mm_sub_pd(iz3,jz1);
1761             dx32             = _mm_sub_pd(ix3,jx2);
1762             dy32             = _mm_sub_pd(iy3,jy2);
1763             dz32             = _mm_sub_pd(iz3,jz2);
1764             dx33             = _mm_sub_pd(ix3,jx3);
1765             dy33             = _mm_sub_pd(iy3,jy3);
1766             dz33             = _mm_sub_pd(iz3,jz3);
1767
1768             /* Calculate squared distance and things based on it */
1769             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
1770             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
1771             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
1772             rsq13            = gmx_mm_calc_rsq_pd(dx13,dy13,dz13);
1773             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
1774             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
1775             rsq23            = gmx_mm_calc_rsq_pd(dx23,dy23,dz23);
1776             rsq31            = gmx_mm_calc_rsq_pd(dx31,dy31,dz31);
1777             rsq32            = gmx_mm_calc_rsq_pd(dx32,dy32,dz32);
1778             rsq33            = gmx_mm_calc_rsq_pd(dx33,dy33,dz33);
1779
1780             rinv00           = gmx_mm_invsqrt_pd(rsq00);
1781             rinv11           = gmx_mm_invsqrt_pd(rsq11);
1782             rinv12           = gmx_mm_invsqrt_pd(rsq12);
1783             rinv13           = gmx_mm_invsqrt_pd(rsq13);
1784             rinv21           = gmx_mm_invsqrt_pd(rsq21);
1785             rinv22           = gmx_mm_invsqrt_pd(rsq22);
1786             rinv23           = gmx_mm_invsqrt_pd(rsq23);
1787             rinv31           = gmx_mm_invsqrt_pd(rsq31);
1788             rinv32           = gmx_mm_invsqrt_pd(rsq32);
1789             rinv33           = gmx_mm_invsqrt_pd(rsq33);
1790
1791             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
1792             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
1793             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
1794             rinvsq13         = _mm_mul_pd(rinv13,rinv13);
1795             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
1796             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
1797             rinvsq23         = _mm_mul_pd(rinv23,rinv23);
1798             rinvsq31         = _mm_mul_pd(rinv31,rinv31);
1799             rinvsq32         = _mm_mul_pd(rinv32,rinv32);
1800             rinvsq33         = _mm_mul_pd(rinv33,rinv33);
1801
1802             fjx0             = _mm_setzero_pd();
1803             fjy0             = _mm_setzero_pd();
1804             fjz0             = _mm_setzero_pd();
1805             fjx1             = _mm_setzero_pd();
1806             fjy1             = _mm_setzero_pd();
1807             fjz1             = _mm_setzero_pd();
1808             fjx2             = _mm_setzero_pd();
1809             fjy2             = _mm_setzero_pd();
1810             fjz2             = _mm_setzero_pd();
1811             fjx3             = _mm_setzero_pd();
1812             fjy3             = _mm_setzero_pd();
1813             fjz3             = _mm_setzero_pd();
1814
1815             /**************************
1816              * CALCULATE INTERACTIONS *
1817              **************************/
1818
1819             if (gmx_mm_any_lt(rsq00,rcutoff2))
1820             {
1821
1822             r00              = _mm_mul_pd(rsq00,rinv00);
1823
1824             /* Analytical LJ-PME */
1825             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
1826             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
1827             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
1828             exponent         = gmx_simd_exp_d(ewcljrsq);
1829             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
1830             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
1831             /* f6A = 6 * C6grid * (1 - poly) */
1832             f6A              = _mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly));
1833             /* f6B = C6grid * exponent * beta^6 */
1834             f6B              = _mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6));
1835             /* fvdw = 12*C12/r13 - ((6*C6 - f6A)/r6 + f6B)/r */
1836             fvdw              = _mm_mul_pd(_mm_add_pd(_mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),_mm_sub_pd(c6_00,f6A)),rinvsix),f6B),rinvsq00);
1837
1838             cutoff_mask      = _mm_cmplt_pd(rsq00,rcutoff2);
1839
1840             fscal            = fvdw;
1841
1842             fscal            = _mm_and_pd(fscal,cutoff_mask);
1843
1844             /* Calculate temporary vectorial force */
1845             tx               = _mm_mul_pd(fscal,dx00);
1846             ty               = _mm_mul_pd(fscal,dy00);
1847             tz               = _mm_mul_pd(fscal,dz00);
1848
1849             /* Update vectorial force */
1850             fix0             = _mm_add_pd(fix0,tx);
1851             fiy0             = _mm_add_pd(fiy0,ty);
1852             fiz0             = _mm_add_pd(fiz0,tz);
1853
1854             fjx0             = _mm_add_pd(fjx0,tx);
1855             fjy0             = _mm_add_pd(fjy0,ty);
1856             fjz0             = _mm_add_pd(fjz0,tz);
1857
1858             }
1859
1860             /**************************
1861              * CALCULATE INTERACTIONS *
1862              **************************/
1863
1864             if (gmx_mm_any_lt(rsq11,rcutoff2))
1865             {
1866
1867             r11              = _mm_mul_pd(rsq11,rinv11);
1868
1869             /* EWALD ELECTROSTATICS */
1870
1871             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1872             ewrt             = _mm_mul_pd(r11,ewtabscale);
1873             ewitab           = _mm_cvttpd_epi32(ewrt);
1874             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1875             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1876                                          &ewtabF,&ewtabFn);
1877             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1878             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1879
1880             cutoff_mask      = _mm_cmplt_pd(rsq11,rcutoff2);
1881
1882             fscal            = felec;
1883
1884             fscal            = _mm_and_pd(fscal,cutoff_mask);
1885
1886             /* Calculate temporary vectorial force */
1887             tx               = _mm_mul_pd(fscal,dx11);
1888             ty               = _mm_mul_pd(fscal,dy11);
1889             tz               = _mm_mul_pd(fscal,dz11);
1890
1891             /* Update vectorial force */
1892             fix1             = _mm_add_pd(fix1,tx);
1893             fiy1             = _mm_add_pd(fiy1,ty);
1894             fiz1             = _mm_add_pd(fiz1,tz);
1895
1896             fjx1             = _mm_add_pd(fjx1,tx);
1897             fjy1             = _mm_add_pd(fjy1,ty);
1898             fjz1             = _mm_add_pd(fjz1,tz);
1899
1900             }
1901
1902             /**************************
1903              * CALCULATE INTERACTIONS *
1904              **************************/
1905
1906             if (gmx_mm_any_lt(rsq12,rcutoff2))
1907             {
1908
1909             r12              = _mm_mul_pd(rsq12,rinv12);
1910
1911             /* EWALD ELECTROSTATICS */
1912
1913             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1914             ewrt             = _mm_mul_pd(r12,ewtabscale);
1915             ewitab           = _mm_cvttpd_epi32(ewrt);
1916             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1917             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1918                                          &ewtabF,&ewtabFn);
1919             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1920             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1921
1922             cutoff_mask      = _mm_cmplt_pd(rsq12,rcutoff2);
1923
1924             fscal            = felec;
1925
1926             fscal            = _mm_and_pd(fscal,cutoff_mask);
1927
1928             /* Calculate temporary vectorial force */
1929             tx               = _mm_mul_pd(fscal,dx12);
1930             ty               = _mm_mul_pd(fscal,dy12);
1931             tz               = _mm_mul_pd(fscal,dz12);
1932
1933             /* Update vectorial force */
1934             fix1             = _mm_add_pd(fix1,tx);
1935             fiy1             = _mm_add_pd(fiy1,ty);
1936             fiz1             = _mm_add_pd(fiz1,tz);
1937
1938             fjx2             = _mm_add_pd(fjx2,tx);
1939             fjy2             = _mm_add_pd(fjy2,ty);
1940             fjz2             = _mm_add_pd(fjz2,tz);
1941
1942             }
1943
1944             /**************************
1945              * CALCULATE INTERACTIONS *
1946              **************************/
1947
1948             if (gmx_mm_any_lt(rsq13,rcutoff2))
1949             {
1950
1951             r13              = _mm_mul_pd(rsq13,rinv13);
1952
1953             /* EWALD ELECTROSTATICS */
1954
1955             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1956             ewrt             = _mm_mul_pd(r13,ewtabscale);
1957             ewitab           = _mm_cvttpd_epi32(ewrt);
1958             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1959             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1960                                          &ewtabF,&ewtabFn);
1961             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1962             felec            = _mm_mul_pd(_mm_mul_pd(qq13,rinv13),_mm_sub_pd(rinvsq13,felec));
1963
1964             cutoff_mask      = _mm_cmplt_pd(rsq13,rcutoff2);
1965
1966             fscal            = felec;
1967
1968             fscal            = _mm_and_pd(fscal,cutoff_mask);
1969
1970             /* Calculate temporary vectorial force */
1971             tx               = _mm_mul_pd(fscal,dx13);
1972             ty               = _mm_mul_pd(fscal,dy13);
1973             tz               = _mm_mul_pd(fscal,dz13);
1974
1975             /* Update vectorial force */
1976             fix1             = _mm_add_pd(fix1,tx);
1977             fiy1             = _mm_add_pd(fiy1,ty);
1978             fiz1             = _mm_add_pd(fiz1,tz);
1979
1980             fjx3             = _mm_add_pd(fjx3,tx);
1981             fjy3             = _mm_add_pd(fjy3,ty);
1982             fjz3             = _mm_add_pd(fjz3,tz);
1983
1984             }
1985
1986             /**************************
1987              * CALCULATE INTERACTIONS *
1988              **************************/
1989
1990             if (gmx_mm_any_lt(rsq21,rcutoff2))
1991             {
1992
1993             r21              = _mm_mul_pd(rsq21,rinv21);
1994
1995             /* EWALD ELECTROSTATICS */
1996
1997             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1998             ewrt             = _mm_mul_pd(r21,ewtabscale);
1999             ewitab           = _mm_cvttpd_epi32(ewrt);
2000             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2001             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2002                                          &ewtabF,&ewtabFn);
2003             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2004             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
2005
2006             cutoff_mask      = _mm_cmplt_pd(rsq21,rcutoff2);
2007
2008             fscal            = felec;
2009
2010             fscal            = _mm_and_pd(fscal,cutoff_mask);
2011
2012             /* Calculate temporary vectorial force */
2013             tx               = _mm_mul_pd(fscal,dx21);
2014             ty               = _mm_mul_pd(fscal,dy21);
2015             tz               = _mm_mul_pd(fscal,dz21);
2016
2017             /* Update vectorial force */
2018             fix2             = _mm_add_pd(fix2,tx);
2019             fiy2             = _mm_add_pd(fiy2,ty);
2020             fiz2             = _mm_add_pd(fiz2,tz);
2021
2022             fjx1             = _mm_add_pd(fjx1,tx);
2023             fjy1             = _mm_add_pd(fjy1,ty);
2024             fjz1             = _mm_add_pd(fjz1,tz);
2025
2026             }
2027
2028             /**************************
2029              * CALCULATE INTERACTIONS *
2030              **************************/
2031
2032             if (gmx_mm_any_lt(rsq22,rcutoff2))
2033             {
2034
2035             r22              = _mm_mul_pd(rsq22,rinv22);
2036
2037             /* EWALD ELECTROSTATICS */
2038
2039             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2040             ewrt             = _mm_mul_pd(r22,ewtabscale);
2041             ewitab           = _mm_cvttpd_epi32(ewrt);
2042             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2043             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2044                                          &ewtabF,&ewtabFn);
2045             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2046             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
2047
2048             cutoff_mask      = _mm_cmplt_pd(rsq22,rcutoff2);
2049
2050             fscal            = felec;
2051
2052             fscal            = _mm_and_pd(fscal,cutoff_mask);
2053
2054             /* Calculate temporary vectorial force */
2055             tx               = _mm_mul_pd(fscal,dx22);
2056             ty               = _mm_mul_pd(fscal,dy22);
2057             tz               = _mm_mul_pd(fscal,dz22);
2058
2059             /* Update vectorial force */
2060             fix2             = _mm_add_pd(fix2,tx);
2061             fiy2             = _mm_add_pd(fiy2,ty);
2062             fiz2             = _mm_add_pd(fiz2,tz);
2063
2064             fjx2             = _mm_add_pd(fjx2,tx);
2065             fjy2             = _mm_add_pd(fjy2,ty);
2066             fjz2             = _mm_add_pd(fjz2,tz);
2067
2068             }
2069
2070             /**************************
2071              * CALCULATE INTERACTIONS *
2072              **************************/
2073
2074             if (gmx_mm_any_lt(rsq23,rcutoff2))
2075             {
2076
2077             r23              = _mm_mul_pd(rsq23,rinv23);
2078
2079             /* EWALD ELECTROSTATICS */
2080
2081             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2082             ewrt             = _mm_mul_pd(r23,ewtabscale);
2083             ewitab           = _mm_cvttpd_epi32(ewrt);
2084             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2085             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2086                                          &ewtabF,&ewtabFn);
2087             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2088             felec            = _mm_mul_pd(_mm_mul_pd(qq23,rinv23),_mm_sub_pd(rinvsq23,felec));
2089
2090             cutoff_mask      = _mm_cmplt_pd(rsq23,rcutoff2);
2091
2092             fscal            = felec;
2093
2094             fscal            = _mm_and_pd(fscal,cutoff_mask);
2095
2096             /* Calculate temporary vectorial force */
2097             tx               = _mm_mul_pd(fscal,dx23);
2098             ty               = _mm_mul_pd(fscal,dy23);
2099             tz               = _mm_mul_pd(fscal,dz23);
2100
2101             /* Update vectorial force */
2102             fix2             = _mm_add_pd(fix2,tx);
2103             fiy2             = _mm_add_pd(fiy2,ty);
2104             fiz2             = _mm_add_pd(fiz2,tz);
2105
2106             fjx3             = _mm_add_pd(fjx3,tx);
2107             fjy3             = _mm_add_pd(fjy3,ty);
2108             fjz3             = _mm_add_pd(fjz3,tz);
2109
2110             }
2111
2112             /**************************
2113              * CALCULATE INTERACTIONS *
2114              **************************/
2115
2116             if (gmx_mm_any_lt(rsq31,rcutoff2))
2117             {
2118
2119             r31              = _mm_mul_pd(rsq31,rinv31);
2120
2121             /* EWALD ELECTROSTATICS */
2122
2123             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2124             ewrt             = _mm_mul_pd(r31,ewtabscale);
2125             ewitab           = _mm_cvttpd_epi32(ewrt);
2126             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2127             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2128                                          &ewtabF,&ewtabFn);
2129             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2130             felec            = _mm_mul_pd(_mm_mul_pd(qq31,rinv31),_mm_sub_pd(rinvsq31,felec));
2131
2132             cutoff_mask      = _mm_cmplt_pd(rsq31,rcutoff2);
2133
2134             fscal            = felec;
2135
2136             fscal            = _mm_and_pd(fscal,cutoff_mask);
2137
2138             /* Calculate temporary vectorial force */
2139             tx               = _mm_mul_pd(fscal,dx31);
2140             ty               = _mm_mul_pd(fscal,dy31);
2141             tz               = _mm_mul_pd(fscal,dz31);
2142
2143             /* Update vectorial force */
2144             fix3             = _mm_add_pd(fix3,tx);
2145             fiy3             = _mm_add_pd(fiy3,ty);
2146             fiz3             = _mm_add_pd(fiz3,tz);
2147
2148             fjx1             = _mm_add_pd(fjx1,tx);
2149             fjy1             = _mm_add_pd(fjy1,ty);
2150             fjz1             = _mm_add_pd(fjz1,tz);
2151
2152             }
2153
2154             /**************************
2155              * CALCULATE INTERACTIONS *
2156              **************************/
2157
2158             if (gmx_mm_any_lt(rsq32,rcutoff2))
2159             {
2160
2161             r32              = _mm_mul_pd(rsq32,rinv32);
2162
2163             /* EWALD ELECTROSTATICS */
2164
2165             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2166             ewrt             = _mm_mul_pd(r32,ewtabscale);
2167             ewitab           = _mm_cvttpd_epi32(ewrt);
2168             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2169             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2170                                          &ewtabF,&ewtabFn);
2171             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2172             felec            = _mm_mul_pd(_mm_mul_pd(qq32,rinv32),_mm_sub_pd(rinvsq32,felec));
2173
2174             cutoff_mask      = _mm_cmplt_pd(rsq32,rcutoff2);
2175
2176             fscal            = felec;
2177
2178             fscal            = _mm_and_pd(fscal,cutoff_mask);
2179
2180             /* Calculate temporary vectorial force */
2181             tx               = _mm_mul_pd(fscal,dx32);
2182             ty               = _mm_mul_pd(fscal,dy32);
2183             tz               = _mm_mul_pd(fscal,dz32);
2184
2185             /* Update vectorial force */
2186             fix3             = _mm_add_pd(fix3,tx);
2187             fiy3             = _mm_add_pd(fiy3,ty);
2188             fiz3             = _mm_add_pd(fiz3,tz);
2189
2190             fjx2             = _mm_add_pd(fjx2,tx);
2191             fjy2             = _mm_add_pd(fjy2,ty);
2192             fjz2             = _mm_add_pd(fjz2,tz);
2193
2194             }
2195
2196             /**************************
2197              * CALCULATE INTERACTIONS *
2198              **************************/
2199
2200             if (gmx_mm_any_lt(rsq33,rcutoff2))
2201             {
2202
2203             r33              = _mm_mul_pd(rsq33,rinv33);
2204
2205             /* EWALD ELECTROSTATICS */
2206
2207             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2208             ewrt             = _mm_mul_pd(r33,ewtabscale);
2209             ewitab           = _mm_cvttpd_epi32(ewrt);
2210             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2211             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
2212                                          &ewtabF,&ewtabFn);
2213             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2214             felec            = _mm_mul_pd(_mm_mul_pd(qq33,rinv33),_mm_sub_pd(rinvsq33,felec));
2215
2216             cutoff_mask      = _mm_cmplt_pd(rsq33,rcutoff2);
2217
2218             fscal            = felec;
2219
2220             fscal            = _mm_and_pd(fscal,cutoff_mask);
2221
2222             /* Calculate temporary vectorial force */
2223             tx               = _mm_mul_pd(fscal,dx33);
2224             ty               = _mm_mul_pd(fscal,dy33);
2225             tz               = _mm_mul_pd(fscal,dz33);
2226
2227             /* Update vectorial force */
2228             fix3             = _mm_add_pd(fix3,tx);
2229             fiy3             = _mm_add_pd(fiy3,ty);
2230             fiz3             = _mm_add_pd(fiz3,tz);
2231
2232             fjx3             = _mm_add_pd(fjx3,tx);
2233             fjy3             = _mm_add_pd(fjy3,ty);
2234             fjz3             = _mm_add_pd(fjz3,tz);
2235
2236             }
2237
2238             gmx_mm_decrement_4rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
2239
2240             /* Inner loop uses 403 flops */
2241         }
2242
2243         if(jidx<j_index_end)
2244         {
2245
2246             jnrA             = jjnr[jidx];
2247             j_coord_offsetA  = DIM*jnrA;
2248
2249             /* load j atom coordinates */
2250             gmx_mm_load_4rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
2251                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
2252                                               &jy2,&jz2,&jx3,&jy3,&jz3);
2253
2254             /* Calculate displacement vector */
2255             dx00             = _mm_sub_pd(ix0,jx0);
2256             dy00             = _mm_sub_pd(iy0,jy0);
2257             dz00             = _mm_sub_pd(iz0,jz0);
2258             dx11             = _mm_sub_pd(ix1,jx1);
2259             dy11             = _mm_sub_pd(iy1,jy1);
2260             dz11             = _mm_sub_pd(iz1,jz1);
2261             dx12             = _mm_sub_pd(ix1,jx2);
2262             dy12             = _mm_sub_pd(iy1,jy2);
2263             dz12             = _mm_sub_pd(iz1,jz2);
2264             dx13             = _mm_sub_pd(ix1,jx3);
2265             dy13             = _mm_sub_pd(iy1,jy3);
2266             dz13             = _mm_sub_pd(iz1,jz3);
2267             dx21             = _mm_sub_pd(ix2,jx1);
2268             dy21             = _mm_sub_pd(iy2,jy1);
2269             dz21             = _mm_sub_pd(iz2,jz1);
2270             dx22             = _mm_sub_pd(ix2,jx2);
2271             dy22             = _mm_sub_pd(iy2,jy2);
2272             dz22             = _mm_sub_pd(iz2,jz2);
2273             dx23             = _mm_sub_pd(ix2,jx3);
2274             dy23             = _mm_sub_pd(iy2,jy3);
2275             dz23             = _mm_sub_pd(iz2,jz3);
2276             dx31             = _mm_sub_pd(ix3,jx1);
2277             dy31             = _mm_sub_pd(iy3,jy1);
2278             dz31             = _mm_sub_pd(iz3,jz1);
2279             dx32             = _mm_sub_pd(ix3,jx2);
2280             dy32             = _mm_sub_pd(iy3,jy2);
2281             dz32             = _mm_sub_pd(iz3,jz2);
2282             dx33             = _mm_sub_pd(ix3,jx3);
2283             dy33             = _mm_sub_pd(iy3,jy3);
2284             dz33             = _mm_sub_pd(iz3,jz3);
2285
2286             /* Calculate squared distance and things based on it */
2287             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
2288             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
2289             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
2290             rsq13            = gmx_mm_calc_rsq_pd(dx13,dy13,dz13);
2291             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
2292             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
2293             rsq23            = gmx_mm_calc_rsq_pd(dx23,dy23,dz23);
2294             rsq31            = gmx_mm_calc_rsq_pd(dx31,dy31,dz31);
2295             rsq32            = gmx_mm_calc_rsq_pd(dx32,dy32,dz32);
2296             rsq33            = gmx_mm_calc_rsq_pd(dx33,dy33,dz33);
2297
2298             rinv00           = gmx_mm_invsqrt_pd(rsq00);
2299             rinv11           = gmx_mm_invsqrt_pd(rsq11);
2300             rinv12           = gmx_mm_invsqrt_pd(rsq12);
2301             rinv13           = gmx_mm_invsqrt_pd(rsq13);
2302             rinv21           = gmx_mm_invsqrt_pd(rsq21);
2303             rinv22           = gmx_mm_invsqrt_pd(rsq22);
2304             rinv23           = gmx_mm_invsqrt_pd(rsq23);
2305             rinv31           = gmx_mm_invsqrt_pd(rsq31);
2306             rinv32           = gmx_mm_invsqrt_pd(rsq32);
2307             rinv33           = gmx_mm_invsqrt_pd(rsq33);
2308
2309             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
2310             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
2311             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
2312             rinvsq13         = _mm_mul_pd(rinv13,rinv13);
2313             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
2314             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
2315             rinvsq23         = _mm_mul_pd(rinv23,rinv23);
2316             rinvsq31         = _mm_mul_pd(rinv31,rinv31);
2317             rinvsq32         = _mm_mul_pd(rinv32,rinv32);
2318             rinvsq33         = _mm_mul_pd(rinv33,rinv33);
2319
2320             fjx0             = _mm_setzero_pd();
2321             fjy0             = _mm_setzero_pd();
2322             fjz0             = _mm_setzero_pd();
2323             fjx1             = _mm_setzero_pd();
2324             fjy1             = _mm_setzero_pd();
2325             fjz1             = _mm_setzero_pd();
2326             fjx2             = _mm_setzero_pd();
2327             fjy2             = _mm_setzero_pd();
2328             fjz2             = _mm_setzero_pd();
2329             fjx3             = _mm_setzero_pd();
2330             fjy3             = _mm_setzero_pd();
2331             fjz3             = _mm_setzero_pd();
2332
2333             /**************************
2334              * CALCULATE INTERACTIONS *
2335              **************************/
2336
2337             if (gmx_mm_any_lt(rsq00,rcutoff2))
2338             {
2339
2340             r00              = _mm_mul_pd(rsq00,rinv00);
2341
2342             /* Analytical LJ-PME */
2343             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
2344             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
2345             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
2346             exponent         = gmx_simd_exp_d(ewcljrsq);
2347             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
2348             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
2349             /* f6A = 6 * C6grid * (1 - poly) */
2350             f6A              = _mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly));
2351             /* f6B = C6grid * exponent * beta^6 */
2352             f6B              = _mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6));
2353             /* fvdw = 12*C12/r13 - ((6*C6 - f6A)/r6 + f6B)/r */
2354             fvdw              = _mm_mul_pd(_mm_add_pd(_mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),_mm_sub_pd(c6_00,f6A)),rinvsix),f6B),rinvsq00);
2355
2356             cutoff_mask      = _mm_cmplt_pd(rsq00,rcutoff2);
2357
2358             fscal            = fvdw;
2359
2360             fscal            = _mm_and_pd(fscal,cutoff_mask);
2361
2362             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2363
2364             /* Calculate temporary vectorial force */
2365             tx               = _mm_mul_pd(fscal,dx00);
2366             ty               = _mm_mul_pd(fscal,dy00);
2367             tz               = _mm_mul_pd(fscal,dz00);
2368
2369             /* Update vectorial force */
2370             fix0             = _mm_add_pd(fix0,tx);
2371             fiy0             = _mm_add_pd(fiy0,ty);
2372             fiz0             = _mm_add_pd(fiz0,tz);
2373
2374             fjx0             = _mm_add_pd(fjx0,tx);
2375             fjy0             = _mm_add_pd(fjy0,ty);
2376             fjz0             = _mm_add_pd(fjz0,tz);
2377
2378             }
2379
2380             /**************************
2381              * CALCULATE INTERACTIONS *
2382              **************************/
2383
2384             if (gmx_mm_any_lt(rsq11,rcutoff2))
2385             {
2386
2387             r11              = _mm_mul_pd(rsq11,rinv11);
2388
2389             /* EWALD ELECTROSTATICS */
2390
2391             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2392             ewrt             = _mm_mul_pd(r11,ewtabscale);
2393             ewitab           = _mm_cvttpd_epi32(ewrt);
2394             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2395             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2396             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2397             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
2398
2399             cutoff_mask      = _mm_cmplt_pd(rsq11,rcutoff2);
2400
2401             fscal            = felec;
2402
2403             fscal            = _mm_and_pd(fscal,cutoff_mask);
2404
2405             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2406
2407             /* Calculate temporary vectorial force */
2408             tx               = _mm_mul_pd(fscal,dx11);
2409             ty               = _mm_mul_pd(fscal,dy11);
2410             tz               = _mm_mul_pd(fscal,dz11);
2411
2412             /* Update vectorial force */
2413             fix1             = _mm_add_pd(fix1,tx);
2414             fiy1             = _mm_add_pd(fiy1,ty);
2415             fiz1             = _mm_add_pd(fiz1,tz);
2416
2417             fjx1             = _mm_add_pd(fjx1,tx);
2418             fjy1             = _mm_add_pd(fjy1,ty);
2419             fjz1             = _mm_add_pd(fjz1,tz);
2420
2421             }
2422
2423             /**************************
2424              * CALCULATE INTERACTIONS *
2425              **************************/
2426
2427             if (gmx_mm_any_lt(rsq12,rcutoff2))
2428             {
2429
2430             r12              = _mm_mul_pd(rsq12,rinv12);
2431
2432             /* EWALD ELECTROSTATICS */
2433
2434             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2435             ewrt             = _mm_mul_pd(r12,ewtabscale);
2436             ewitab           = _mm_cvttpd_epi32(ewrt);
2437             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2438             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2439             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2440             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
2441
2442             cutoff_mask      = _mm_cmplt_pd(rsq12,rcutoff2);
2443
2444             fscal            = felec;
2445
2446             fscal            = _mm_and_pd(fscal,cutoff_mask);
2447
2448             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2449
2450             /* Calculate temporary vectorial force */
2451             tx               = _mm_mul_pd(fscal,dx12);
2452             ty               = _mm_mul_pd(fscal,dy12);
2453             tz               = _mm_mul_pd(fscal,dz12);
2454
2455             /* Update vectorial force */
2456             fix1             = _mm_add_pd(fix1,tx);
2457             fiy1             = _mm_add_pd(fiy1,ty);
2458             fiz1             = _mm_add_pd(fiz1,tz);
2459
2460             fjx2             = _mm_add_pd(fjx2,tx);
2461             fjy2             = _mm_add_pd(fjy2,ty);
2462             fjz2             = _mm_add_pd(fjz2,tz);
2463
2464             }
2465
2466             /**************************
2467              * CALCULATE INTERACTIONS *
2468              **************************/
2469
2470             if (gmx_mm_any_lt(rsq13,rcutoff2))
2471             {
2472
2473             r13              = _mm_mul_pd(rsq13,rinv13);
2474
2475             /* EWALD ELECTROSTATICS */
2476
2477             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2478             ewrt             = _mm_mul_pd(r13,ewtabscale);
2479             ewitab           = _mm_cvttpd_epi32(ewrt);
2480             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2481             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2482             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2483             felec            = _mm_mul_pd(_mm_mul_pd(qq13,rinv13),_mm_sub_pd(rinvsq13,felec));
2484
2485             cutoff_mask      = _mm_cmplt_pd(rsq13,rcutoff2);
2486
2487             fscal            = felec;
2488
2489             fscal            = _mm_and_pd(fscal,cutoff_mask);
2490
2491             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2492
2493             /* Calculate temporary vectorial force */
2494             tx               = _mm_mul_pd(fscal,dx13);
2495             ty               = _mm_mul_pd(fscal,dy13);
2496             tz               = _mm_mul_pd(fscal,dz13);
2497
2498             /* Update vectorial force */
2499             fix1             = _mm_add_pd(fix1,tx);
2500             fiy1             = _mm_add_pd(fiy1,ty);
2501             fiz1             = _mm_add_pd(fiz1,tz);
2502
2503             fjx3             = _mm_add_pd(fjx3,tx);
2504             fjy3             = _mm_add_pd(fjy3,ty);
2505             fjz3             = _mm_add_pd(fjz3,tz);
2506
2507             }
2508
2509             /**************************
2510              * CALCULATE INTERACTIONS *
2511              **************************/
2512
2513             if (gmx_mm_any_lt(rsq21,rcutoff2))
2514             {
2515
2516             r21              = _mm_mul_pd(rsq21,rinv21);
2517
2518             /* EWALD ELECTROSTATICS */
2519
2520             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2521             ewrt             = _mm_mul_pd(r21,ewtabscale);
2522             ewitab           = _mm_cvttpd_epi32(ewrt);
2523             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2524             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2525             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2526             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
2527
2528             cutoff_mask      = _mm_cmplt_pd(rsq21,rcutoff2);
2529
2530             fscal            = felec;
2531
2532             fscal            = _mm_and_pd(fscal,cutoff_mask);
2533
2534             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2535
2536             /* Calculate temporary vectorial force */
2537             tx               = _mm_mul_pd(fscal,dx21);
2538             ty               = _mm_mul_pd(fscal,dy21);
2539             tz               = _mm_mul_pd(fscal,dz21);
2540
2541             /* Update vectorial force */
2542             fix2             = _mm_add_pd(fix2,tx);
2543             fiy2             = _mm_add_pd(fiy2,ty);
2544             fiz2             = _mm_add_pd(fiz2,tz);
2545
2546             fjx1             = _mm_add_pd(fjx1,tx);
2547             fjy1             = _mm_add_pd(fjy1,ty);
2548             fjz1             = _mm_add_pd(fjz1,tz);
2549
2550             }
2551
2552             /**************************
2553              * CALCULATE INTERACTIONS *
2554              **************************/
2555
2556             if (gmx_mm_any_lt(rsq22,rcutoff2))
2557             {
2558
2559             r22              = _mm_mul_pd(rsq22,rinv22);
2560
2561             /* EWALD ELECTROSTATICS */
2562
2563             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2564             ewrt             = _mm_mul_pd(r22,ewtabscale);
2565             ewitab           = _mm_cvttpd_epi32(ewrt);
2566             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2567             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2568             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2569             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
2570
2571             cutoff_mask      = _mm_cmplt_pd(rsq22,rcutoff2);
2572
2573             fscal            = felec;
2574
2575             fscal            = _mm_and_pd(fscal,cutoff_mask);
2576
2577             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2578
2579             /* Calculate temporary vectorial force */
2580             tx               = _mm_mul_pd(fscal,dx22);
2581             ty               = _mm_mul_pd(fscal,dy22);
2582             tz               = _mm_mul_pd(fscal,dz22);
2583
2584             /* Update vectorial force */
2585             fix2             = _mm_add_pd(fix2,tx);
2586             fiy2             = _mm_add_pd(fiy2,ty);
2587             fiz2             = _mm_add_pd(fiz2,tz);
2588
2589             fjx2             = _mm_add_pd(fjx2,tx);
2590             fjy2             = _mm_add_pd(fjy2,ty);
2591             fjz2             = _mm_add_pd(fjz2,tz);
2592
2593             }
2594
2595             /**************************
2596              * CALCULATE INTERACTIONS *
2597              **************************/
2598
2599             if (gmx_mm_any_lt(rsq23,rcutoff2))
2600             {
2601
2602             r23              = _mm_mul_pd(rsq23,rinv23);
2603
2604             /* EWALD ELECTROSTATICS */
2605
2606             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2607             ewrt             = _mm_mul_pd(r23,ewtabscale);
2608             ewitab           = _mm_cvttpd_epi32(ewrt);
2609             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2610             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2611             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2612             felec            = _mm_mul_pd(_mm_mul_pd(qq23,rinv23),_mm_sub_pd(rinvsq23,felec));
2613
2614             cutoff_mask      = _mm_cmplt_pd(rsq23,rcutoff2);
2615
2616             fscal            = felec;
2617
2618             fscal            = _mm_and_pd(fscal,cutoff_mask);
2619
2620             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2621
2622             /* Calculate temporary vectorial force */
2623             tx               = _mm_mul_pd(fscal,dx23);
2624             ty               = _mm_mul_pd(fscal,dy23);
2625             tz               = _mm_mul_pd(fscal,dz23);
2626
2627             /* Update vectorial force */
2628             fix2             = _mm_add_pd(fix2,tx);
2629             fiy2             = _mm_add_pd(fiy2,ty);
2630             fiz2             = _mm_add_pd(fiz2,tz);
2631
2632             fjx3             = _mm_add_pd(fjx3,tx);
2633             fjy3             = _mm_add_pd(fjy3,ty);
2634             fjz3             = _mm_add_pd(fjz3,tz);
2635
2636             }
2637
2638             /**************************
2639              * CALCULATE INTERACTIONS *
2640              **************************/
2641
2642             if (gmx_mm_any_lt(rsq31,rcutoff2))
2643             {
2644
2645             r31              = _mm_mul_pd(rsq31,rinv31);
2646
2647             /* EWALD ELECTROSTATICS */
2648
2649             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2650             ewrt             = _mm_mul_pd(r31,ewtabscale);
2651             ewitab           = _mm_cvttpd_epi32(ewrt);
2652             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2653             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2654             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2655             felec            = _mm_mul_pd(_mm_mul_pd(qq31,rinv31),_mm_sub_pd(rinvsq31,felec));
2656
2657             cutoff_mask      = _mm_cmplt_pd(rsq31,rcutoff2);
2658
2659             fscal            = felec;
2660
2661             fscal            = _mm_and_pd(fscal,cutoff_mask);
2662
2663             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2664
2665             /* Calculate temporary vectorial force */
2666             tx               = _mm_mul_pd(fscal,dx31);
2667             ty               = _mm_mul_pd(fscal,dy31);
2668             tz               = _mm_mul_pd(fscal,dz31);
2669
2670             /* Update vectorial force */
2671             fix3             = _mm_add_pd(fix3,tx);
2672             fiy3             = _mm_add_pd(fiy3,ty);
2673             fiz3             = _mm_add_pd(fiz3,tz);
2674
2675             fjx1             = _mm_add_pd(fjx1,tx);
2676             fjy1             = _mm_add_pd(fjy1,ty);
2677             fjz1             = _mm_add_pd(fjz1,tz);
2678
2679             }
2680
2681             /**************************
2682              * CALCULATE INTERACTIONS *
2683              **************************/
2684
2685             if (gmx_mm_any_lt(rsq32,rcutoff2))
2686             {
2687
2688             r32              = _mm_mul_pd(rsq32,rinv32);
2689
2690             /* EWALD ELECTROSTATICS */
2691
2692             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2693             ewrt             = _mm_mul_pd(r32,ewtabscale);
2694             ewitab           = _mm_cvttpd_epi32(ewrt);
2695             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2696             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2697             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2698             felec            = _mm_mul_pd(_mm_mul_pd(qq32,rinv32),_mm_sub_pd(rinvsq32,felec));
2699
2700             cutoff_mask      = _mm_cmplt_pd(rsq32,rcutoff2);
2701
2702             fscal            = felec;
2703
2704             fscal            = _mm_and_pd(fscal,cutoff_mask);
2705
2706             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2707
2708             /* Calculate temporary vectorial force */
2709             tx               = _mm_mul_pd(fscal,dx32);
2710             ty               = _mm_mul_pd(fscal,dy32);
2711             tz               = _mm_mul_pd(fscal,dz32);
2712
2713             /* Update vectorial force */
2714             fix3             = _mm_add_pd(fix3,tx);
2715             fiy3             = _mm_add_pd(fiy3,ty);
2716             fiz3             = _mm_add_pd(fiz3,tz);
2717
2718             fjx2             = _mm_add_pd(fjx2,tx);
2719             fjy2             = _mm_add_pd(fjy2,ty);
2720             fjz2             = _mm_add_pd(fjz2,tz);
2721
2722             }
2723
2724             /**************************
2725              * CALCULATE INTERACTIONS *
2726              **************************/
2727
2728             if (gmx_mm_any_lt(rsq33,rcutoff2))
2729             {
2730
2731             r33              = _mm_mul_pd(rsq33,rinv33);
2732
2733             /* EWALD ELECTROSTATICS */
2734
2735             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2736             ewrt             = _mm_mul_pd(r33,ewtabscale);
2737             ewitab           = _mm_cvttpd_epi32(ewrt);
2738             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2739             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2740             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2741             felec            = _mm_mul_pd(_mm_mul_pd(qq33,rinv33),_mm_sub_pd(rinvsq33,felec));
2742
2743             cutoff_mask      = _mm_cmplt_pd(rsq33,rcutoff2);
2744
2745             fscal            = felec;
2746
2747             fscal            = _mm_and_pd(fscal,cutoff_mask);
2748
2749             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2750
2751             /* Calculate temporary vectorial force */
2752             tx               = _mm_mul_pd(fscal,dx33);
2753             ty               = _mm_mul_pd(fscal,dy33);
2754             tz               = _mm_mul_pd(fscal,dz33);
2755
2756             /* Update vectorial force */
2757             fix3             = _mm_add_pd(fix3,tx);
2758             fiy3             = _mm_add_pd(fiy3,ty);
2759             fiz3             = _mm_add_pd(fiz3,tz);
2760
2761             fjx3             = _mm_add_pd(fjx3,tx);
2762             fjy3             = _mm_add_pd(fjy3,ty);
2763             fjz3             = _mm_add_pd(fjz3,tz);
2764
2765             }
2766
2767             gmx_mm_decrement_4rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
2768
2769             /* Inner loop uses 403 flops */
2770         }
2771
2772         /* End of innermost loop */
2773
2774         gmx_mm_update_iforce_4atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,fix3,fiy3,fiz3,
2775                                               f+i_coord_offset,fshift+i_shift_offset);
2776
2777         /* Increment number of inner iterations */
2778         inneriter                  += j_index_end - j_index_start;
2779
2780         /* Outer loop uses 24 flops */
2781     }
2782
2783     /* Increment number of outer iterations */
2784     outeriter        += nri;
2785
2786     /* Update outer/inner flops */
2787
2788     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_F,outeriter*24 + inneriter*403);
2789 }