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