Compile nonbonded kernels as C++
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sse2_double / nb_kernel_ElecEw_VdwLJEw_GeomW3W3_sse2_double.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014,2015,2017,2018, 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 sse2_double kernel generator.
37  */
38 #include "gmxpre.h"
39
40 #include "config.h"
41
42 #include <math.h>
43
44 #include "../nb_kernel.h"
45 #include "gromacs/gmxlib/nrnb.h"
46
47 #include "kernelutil_x86_sse2_double.h"
48
49 /*
50  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwLJEw_GeomW3W3_VF_sse2_double
51  * Electrostatics interaction: Ewald
52  * VdW interaction:            LJEwald
53  * Geometry:                   Water3-Water3
54  * Calculate force/pot:        PotentialAndForce
55  */
56 void
57 nb_kernel_ElecEw_VdwLJEw_GeomW3W3_VF_sse2_double
58                     (t_nblist                    * gmx_restrict       nlist,
59                      rvec                        * gmx_restrict          xx,
60                      rvec                        * gmx_restrict          ff,
61                      struct t_forcerec           * gmx_restrict          fr,
62                      t_mdatoms                   * gmx_restrict     mdatoms,
63                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
64                      t_nrnb                      * gmx_restrict        nrnb)
65 {
66     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
67      * just 0 for non-waters.
68      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
69      * jnr indices corresponding to data put in the four positions in the SIMD register.
70      */
71     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
72     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
73     int              jnrA,jnrB;
74     int              j_coord_offsetA,j_coord_offsetB;
75     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
76     real             rcutoff_scalar;
77     real             *shiftvec,*fshift,*x,*f;
78     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
79     int              vdwioffset0;
80     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
81     int              vdwioffset1;
82     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
83     int              vdwioffset2;
84     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
85     int              vdwjidx0A,vdwjidx0B;
86     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
87     int              vdwjidx1A,vdwjidx1B;
88     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
89     int              vdwjidx2A,vdwjidx2B;
90     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
91     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
92     __m128d          dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
93     __m128d          dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
94     __m128d          dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
95     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
96     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
97     __m128d          dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
98     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
99     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
100     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
101     real             *charge;
102     int              nvdwtype;
103     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
104     int              *vdwtype;
105     real             *vdwparam;
106     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
107     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
108     __m128d           c6grid_00;
109     __m128d           c6grid_01;
110     __m128d           c6grid_02;
111     __m128d           c6grid_10;
112     __m128d           c6grid_11;
113     __m128d           c6grid_12;
114     __m128d           c6grid_20;
115     __m128d           c6grid_21;
116     __m128d           c6grid_22;
117     __m128d           ewclj,ewclj2,ewclj6,ewcljrsq,poly,exponent,f6A,f6B,sh_lj_ewald;
118     real             *vdwgridparam;
119     __m128d           one_half = _mm_set1_pd(0.5);
120     __m128d           minus_one = _mm_set1_pd(-1.0);
121     __m128i          ewitab;
122     __m128d          ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
123     real             *ewtab;
124     __m128d          dummy_mask,cutoff_mask;
125     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
126     __m128d          one     = _mm_set1_pd(1.0);
127     __m128d          two     = _mm_set1_pd(2.0);
128     x                = xx[0];
129     f                = ff[0];
130
131     nri              = nlist->nri;
132     iinr             = nlist->iinr;
133     jindex           = nlist->jindex;
134     jjnr             = nlist->jjnr;
135     shiftidx         = nlist->shift;
136     gid              = nlist->gid;
137     shiftvec         = fr->shift_vec[0];
138     fshift           = fr->fshift[0];
139     facel            = _mm_set1_pd(fr->ic->epsfac);
140     charge           = mdatoms->chargeA;
141     nvdwtype         = fr->ntype;
142     vdwparam         = fr->nbfp;
143     vdwtype          = mdatoms->typeA;
144     vdwgridparam     = fr->ljpme_c6grid;
145     sh_lj_ewald      = _mm_set1_pd(fr->ic->sh_lj_ewald);
146     ewclj            = _mm_set1_pd(fr->ic->ewaldcoeff_lj);
147     ewclj2           = _mm_mul_pd(minus_one,_mm_mul_pd(ewclj,ewclj));
148
149     sh_ewald         = _mm_set1_pd(fr->ic->sh_ewald);
150     ewtab            = fr->ic->tabq_coul_FDV0;
151     ewtabscale       = _mm_set1_pd(fr->ic->tabq_scale);
152     ewtabhalfspace   = _mm_set1_pd(0.5/fr->ic->tabq_scale);
153
154     /* Setup water-specific parameters */
155     inr              = nlist->iinr[0];
156     iq0              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+0]));
157     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
158     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
159     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
160
161     jq0              = _mm_set1_pd(charge[inr+0]);
162     jq1              = _mm_set1_pd(charge[inr+1]);
163     jq2              = _mm_set1_pd(charge[inr+2]);
164     vdwjidx0A        = 2*vdwtype[inr+0];
165     qq00             = _mm_mul_pd(iq0,jq0);
166     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
167     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
168     c6grid_00        = _mm_set1_pd(vdwgridparam[vdwioffset0+vdwjidx0A]);
169     qq01             = _mm_mul_pd(iq0,jq1);
170     qq02             = _mm_mul_pd(iq0,jq2);
171     qq10             = _mm_mul_pd(iq1,jq0);
172     qq11             = _mm_mul_pd(iq1,jq1);
173     qq12             = _mm_mul_pd(iq1,jq2);
174     qq20             = _mm_mul_pd(iq2,jq0);
175     qq21             = _mm_mul_pd(iq2,jq1);
176     qq22             = _mm_mul_pd(iq2,jq2);
177
178     /* Avoid stupid compiler warnings */
179     jnrA = jnrB = 0;
180     j_coord_offsetA = 0;
181     j_coord_offsetB = 0;
182
183     outeriter        = 0;
184     inneriter        = 0;
185
186     /* Start outer loop over neighborlists */
187     for(iidx=0; iidx<nri; iidx++)
188     {
189         /* Load shift vector for this list */
190         i_shift_offset   = DIM*shiftidx[iidx];
191
192         /* Load limits for loop over neighbors */
193         j_index_start    = jindex[iidx];
194         j_index_end      = jindex[iidx+1];
195
196         /* Get outer coordinate index */
197         inr              = iinr[iidx];
198         i_coord_offset   = DIM*inr;
199
200         /* Load i particle coords and add shift vector */
201         gmx_mm_load_shift_and_3rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
202                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
203
204         fix0             = _mm_setzero_pd();
205         fiy0             = _mm_setzero_pd();
206         fiz0             = _mm_setzero_pd();
207         fix1             = _mm_setzero_pd();
208         fiy1             = _mm_setzero_pd();
209         fiz1             = _mm_setzero_pd();
210         fix2             = _mm_setzero_pd();
211         fiy2             = _mm_setzero_pd();
212         fiz2             = _mm_setzero_pd();
213
214         /* Reset potential sums */
215         velecsum         = _mm_setzero_pd();
216         vvdwsum          = _mm_setzero_pd();
217
218         /* Start inner kernel loop */
219         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
220         {
221
222             /* Get j neighbor index, and coordinate index */
223             jnrA             = jjnr[jidx];
224             jnrB             = jjnr[jidx+1];
225             j_coord_offsetA  = DIM*jnrA;
226             j_coord_offsetB  = DIM*jnrB;
227
228             /* load j atom coordinates */
229             gmx_mm_load_3rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
230                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
231
232             /* Calculate displacement vector */
233             dx00             = _mm_sub_pd(ix0,jx0);
234             dy00             = _mm_sub_pd(iy0,jy0);
235             dz00             = _mm_sub_pd(iz0,jz0);
236             dx01             = _mm_sub_pd(ix0,jx1);
237             dy01             = _mm_sub_pd(iy0,jy1);
238             dz01             = _mm_sub_pd(iz0,jz1);
239             dx02             = _mm_sub_pd(ix0,jx2);
240             dy02             = _mm_sub_pd(iy0,jy2);
241             dz02             = _mm_sub_pd(iz0,jz2);
242             dx10             = _mm_sub_pd(ix1,jx0);
243             dy10             = _mm_sub_pd(iy1,jy0);
244             dz10             = _mm_sub_pd(iz1,jz0);
245             dx11             = _mm_sub_pd(ix1,jx1);
246             dy11             = _mm_sub_pd(iy1,jy1);
247             dz11             = _mm_sub_pd(iz1,jz1);
248             dx12             = _mm_sub_pd(ix1,jx2);
249             dy12             = _mm_sub_pd(iy1,jy2);
250             dz12             = _mm_sub_pd(iz1,jz2);
251             dx20             = _mm_sub_pd(ix2,jx0);
252             dy20             = _mm_sub_pd(iy2,jy0);
253             dz20             = _mm_sub_pd(iz2,jz0);
254             dx21             = _mm_sub_pd(ix2,jx1);
255             dy21             = _mm_sub_pd(iy2,jy1);
256             dz21             = _mm_sub_pd(iz2,jz1);
257             dx22             = _mm_sub_pd(ix2,jx2);
258             dy22             = _mm_sub_pd(iy2,jy2);
259             dz22             = _mm_sub_pd(iz2,jz2);
260
261             /* Calculate squared distance and things based on it */
262             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
263             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
264             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
265             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
266             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
267             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
268             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
269             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
270             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
271
272             rinv00           = sse2_invsqrt_d(rsq00);
273             rinv01           = sse2_invsqrt_d(rsq01);
274             rinv02           = sse2_invsqrt_d(rsq02);
275             rinv10           = sse2_invsqrt_d(rsq10);
276             rinv11           = sse2_invsqrt_d(rsq11);
277             rinv12           = sse2_invsqrt_d(rsq12);
278             rinv20           = sse2_invsqrt_d(rsq20);
279             rinv21           = sse2_invsqrt_d(rsq21);
280             rinv22           = sse2_invsqrt_d(rsq22);
281
282             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
283             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
284             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
285             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
286             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
287             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
288             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
289             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
290             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
291
292             fjx0             = _mm_setzero_pd();
293             fjy0             = _mm_setzero_pd();
294             fjz0             = _mm_setzero_pd();
295             fjx1             = _mm_setzero_pd();
296             fjy1             = _mm_setzero_pd();
297             fjz1             = _mm_setzero_pd();
298             fjx2             = _mm_setzero_pd();
299             fjy2             = _mm_setzero_pd();
300             fjz2             = _mm_setzero_pd();
301
302             /**************************
303              * CALCULATE INTERACTIONS *
304              **************************/
305
306             r00              = _mm_mul_pd(rsq00,rinv00);
307
308             /* EWALD ELECTROSTATICS */
309
310             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
311             ewrt             = _mm_mul_pd(r00,ewtabscale);
312             ewitab           = _mm_cvttpd_epi32(ewrt);
313             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
314             ewitab           = _mm_slli_epi32(ewitab,2);
315             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
316             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
317             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
318             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
319             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
320             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
321             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
322             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
323             velec            = _mm_mul_pd(qq00,_mm_sub_pd(rinv00,velec));
324             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
325
326             /* Analytical LJ-PME */
327             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
328             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
329             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
330             exponent         = sse2_exp_d(ewcljrsq);
331             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
332             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
333             /* vvdw6 = [C6 - C6grid * (1-poly)]/r6 */
334             vvdw6            = _mm_mul_pd(_mm_sub_pd(c6_00,_mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly))),rinvsix);
335             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
336             vvdw             = _mm_sub_pd(_mm_mul_pd(vvdw12,one_twelfth),_mm_mul_pd(vvdw6,one_sixth));
337             /* fvdw = vvdw12/r - (vvdw6/r + (C6grid * exponent * beta^6)/r) */
338             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,_mm_sub_pd(vvdw6,_mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6)))),rinvsq00);
339
340             /* Update potential sum for this i atom from the interaction with this j atom. */
341             velecsum         = _mm_add_pd(velecsum,velec);
342             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
343
344             fscal            = _mm_add_pd(felec,fvdw);
345
346             /* Calculate temporary vectorial force */
347             tx               = _mm_mul_pd(fscal,dx00);
348             ty               = _mm_mul_pd(fscal,dy00);
349             tz               = _mm_mul_pd(fscal,dz00);
350
351             /* Update vectorial force */
352             fix0             = _mm_add_pd(fix0,tx);
353             fiy0             = _mm_add_pd(fiy0,ty);
354             fiz0             = _mm_add_pd(fiz0,tz);
355
356             fjx0             = _mm_add_pd(fjx0,tx);
357             fjy0             = _mm_add_pd(fjy0,ty);
358             fjz0             = _mm_add_pd(fjz0,tz);
359
360             /**************************
361              * CALCULATE INTERACTIONS *
362              **************************/
363
364             r01              = _mm_mul_pd(rsq01,rinv01);
365
366             /* EWALD ELECTROSTATICS */
367
368             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
369             ewrt             = _mm_mul_pd(r01,ewtabscale);
370             ewitab           = _mm_cvttpd_epi32(ewrt);
371             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
372             ewitab           = _mm_slli_epi32(ewitab,2);
373             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
374             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
375             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
376             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
377             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
378             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
379             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
380             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
381             velec            = _mm_mul_pd(qq01,_mm_sub_pd(rinv01,velec));
382             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
383
384             /* Update potential sum for this i atom from the interaction with this j atom. */
385             velecsum         = _mm_add_pd(velecsum,velec);
386
387             fscal            = felec;
388
389             /* Calculate temporary vectorial force */
390             tx               = _mm_mul_pd(fscal,dx01);
391             ty               = _mm_mul_pd(fscal,dy01);
392             tz               = _mm_mul_pd(fscal,dz01);
393
394             /* Update vectorial force */
395             fix0             = _mm_add_pd(fix0,tx);
396             fiy0             = _mm_add_pd(fiy0,ty);
397             fiz0             = _mm_add_pd(fiz0,tz);
398
399             fjx1             = _mm_add_pd(fjx1,tx);
400             fjy1             = _mm_add_pd(fjy1,ty);
401             fjz1             = _mm_add_pd(fjz1,tz);
402
403             /**************************
404              * CALCULATE INTERACTIONS *
405              **************************/
406
407             r02              = _mm_mul_pd(rsq02,rinv02);
408
409             /* EWALD ELECTROSTATICS */
410
411             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
412             ewrt             = _mm_mul_pd(r02,ewtabscale);
413             ewitab           = _mm_cvttpd_epi32(ewrt);
414             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
415             ewitab           = _mm_slli_epi32(ewitab,2);
416             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
417             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
418             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
419             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
420             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
421             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
422             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
423             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
424             velec            = _mm_mul_pd(qq02,_mm_sub_pd(rinv02,velec));
425             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
426
427             /* Update potential sum for this i atom from the interaction with this j atom. */
428             velecsum         = _mm_add_pd(velecsum,velec);
429
430             fscal            = felec;
431
432             /* Calculate temporary vectorial force */
433             tx               = _mm_mul_pd(fscal,dx02);
434             ty               = _mm_mul_pd(fscal,dy02);
435             tz               = _mm_mul_pd(fscal,dz02);
436
437             /* Update vectorial force */
438             fix0             = _mm_add_pd(fix0,tx);
439             fiy0             = _mm_add_pd(fiy0,ty);
440             fiz0             = _mm_add_pd(fiz0,tz);
441
442             fjx2             = _mm_add_pd(fjx2,tx);
443             fjy2             = _mm_add_pd(fjy2,ty);
444             fjz2             = _mm_add_pd(fjz2,tz);
445
446             /**************************
447              * CALCULATE INTERACTIONS *
448              **************************/
449
450             r10              = _mm_mul_pd(rsq10,rinv10);
451
452             /* EWALD ELECTROSTATICS */
453
454             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
455             ewrt             = _mm_mul_pd(r10,ewtabscale);
456             ewitab           = _mm_cvttpd_epi32(ewrt);
457             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
458             ewitab           = _mm_slli_epi32(ewitab,2);
459             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
460             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
461             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
462             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
463             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
464             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
465             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
466             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
467             velec            = _mm_mul_pd(qq10,_mm_sub_pd(rinv10,velec));
468             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
469
470             /* Update potential sum for this i atom from the interaction with this j atom. */
471             velecsum         = _mm_add_pd(velecsum,velec);
472
473             fscal            = felec;
474
475             /* Calculate temporary vectorial force */
476             tx               = _mm_mul_pd(fscal,dx10);
477             ty               = _mm_mul_pd(fscal,dy10);
478             tz               = _mm_mul_pd(fscal,dz10);
479
480             /* Update vectorial force */
481             fix1             = _mm_add_pd(fix1,tx);
482             fiy1             = _mm_add_pd(fiy1,ty);
483             fiz1             = _mm_add_pd(fiz1,tz);
484
485             fjx0             = _mm_add_pd(fjx0,tx);
486             fjy0             = _mm_add_pd(fjy0,ty);
487             fjz0             = _mm_add_pd(fjz0,tz);
488
489             /**************************
490              * CALCULATE INTERACTIONS *
491              **************************/
492
493             r11              = _mm_mul_pd(rsq11,rinv11);
494
495             /* EWALD ELECTROSTATICS */
496
497             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
498             ewrt             = _mm_mul_pd(r11,ewtabscale);
499             ewitab           = _mm_cvttpd_epi32(ewrt);
500             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
501             ewitab           = _mm_slli_epi32(ewitab,2);
502             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
503             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
504             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
505             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
506             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
507             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
508             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
509             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
510             velec            = _mm_mul_pd(qq11,_mm_sub_pd(rinv11,velec));
511             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
512
513             /* Update potential sum for this i atom from the interaction with this j atom. */
514             velecsum         = _mm_add_pd(velecsum,velec);
515
516             fscal            = felec;
517
518             /* Calculate temporary vectorial force */
519             tx               = _mm_mul_pd(fscal,dx11);
520             ty               = _mm_mul_pd(fscal,dy11);
521             tz               = _mm_mul_pd(fscal,dz11);
522
523             /* Update vectorial force */
524             fix1             = _mm_add_pd(fix1,tx);
525             fiy1             = _mm_add_pd(fiy1,ty);
526             fiz1             = _mm_add_pd(fiz1,tz);
527
528             fjx1             = _mm_add_pd(fjx1,tx);
529             fjy1             = _mm_add_pd(fjy1,ty);
530             fjz1             = _mm_add_pd(fjz1,tz);
531
532             /**************************
533              * CALCULATE INTERACTIONS *
534              **************************/
535
536             r12              = _mm_mul_pd(rsq12,rinv12);
537
538             /* EWALD ELECTROSTATICS */
539
540             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
541             ewrt             = _mm_mul_pd(r12,ewtabscale);
542             ewitab           = _mm_cvttpd_epi32(ewrt);
543             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
544             ewitab           = _mm_slli_epi32(ewitab,2);
545             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
546             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
547             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
548             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
549             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
550             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
551             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
552             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
553             velec            = _mm_mul_pd(qq12,_mm_sub_pd(rinv12,velec));
554             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
555
556             /* Update potential sum for this i atom from the interaction with this j atom. */
557             velecsum         = _mm_add_pd(velecsum,velec);
558
559             fscal            = felec;
560
561             /* Calculate temporary vectorial force */
562             tx               = _mm_mul_pd(fscal,dx12);
563             ty               = _mm_mul_pd(fscal,dy12);
564             tz               = _mm_mul_pd(fscal,dz12);
565
566             /* Update vectorial force */
567             fix1             = _mm_add_pd(fix1,tx);
568             fiy1             = _mm_add_pd(fiy1,ty);
569             fiz1             = _mm_add_pd(fiz1,tz);
570
571             fjx2             = _mm_add_pd(fjx2,tx);
572             fjy2             = _mm_add_pd(fjy2,ty);
573             fjz2             = _mm_add_pd(fjz2,tz);
574
575             /**************************
576              * CALCULATE INTERACTIONS *
577              **************************/
578
579             r20              = _mm_mul_pd(rsq20,rinv20);
580
581             /* EWALD ELECTROSTATICS */
582
583             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
584             ewrt             = _mm_mul_pd(r20,ewtabscale);
585             ewitab           = _mm_cvttpd_epi32(ewrt);
586             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
587             ewitab           = _mm_slli_epi32(ewitab,2);
588             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
589             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
590             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
591             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
592             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
593             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
594             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
595             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
596             velec            = _mm_mul_pd(qq20,_mm_sub_pd(rinv20,velec));
597             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
598
599             /* Update potential sum for this i atom from the interaction with this j atom. */
600             velecsum         = _mm_add_pd(velecsum,velec);
601
602             fscal            = felec;
603
604             /* Calculate temporary vectorial force */
605             tx               = _mm_mul_pd(fscal,dx20);
606             ty               = _mm_mul_pd(fscal,dy20);
607             tz               = _mm_mul_pd(fscal,dz20);
608
609             /* Update vectorial force */
610             fix2             = _mm_add_pd(fix2,tx);
611             fiy2             = _mm_add_pd(fiy2,ty);
612             fiz2             = _mm_add_pd(fiz2,tz);
613
614             fjx0             = _mm_add_pd(fjx0,tx);
615             fjy0             = _mm_add_pd(fjy0,ty);
616             fjz0             = _mm_add_pd(fjz0,tz);
617
618             /**************************
619              * CALCULATE INTERACTIONS *
620              **************************/
621
622             r21              = _mm_mul_pd(rsq21,rinv21);
623
624             /* EWALD ELECTROSTATICS */
625
626             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
627             ewrt             = _mm_mul_pd(r21,ewtabscale);
628             ewitab           = _mm_cvttpd_epi32(ewrt);
629             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
630             ewitab           = _mm_slli_epi32(ewitab,2);
631             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
632             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
633             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
634             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
635             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
636             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
637             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
638             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
639             velec            = _mm_mul_pd(qq21,_mm_sub_pd(rinv21,velec));
640             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
641
642             /* Update potential sum for this i atom from the interaction with this j atom. */
643             velecsum         = _mm_add_pd(velecsum,velec);
644
645             fscal            = felec;
646
647             /* Calculate temporary vectorial force */
648             tx               = _mm_mul_pd(fscal,dx21);
649             ty               = _mm_mul_pd(fscal,dy21);
650             tz               = _mm_mul_pd(fscal,dz21);
651
652             /* Update vectorial force */
653             fix2             = _mm_add_pd(fix2,tx);
654             fiy2             = _mm_add_pd(fiy2,ty);
655             fiz2             = _mm_add_pd(fiz2,tz);
656
657             fjx1             = _mm_add_pd(fjx1,tx);
658             fjy1             = _mm_add_pd(fjy1,ty);
659             fjz1             = _mm_add_pd(fjz1,tz);
660
661             /**************************
662              * CALCULATE INTERACTIONS *
663              **************************/
664
665             r22              = _mm_mul_pd(rsq22,rinv22);
666
667             /* EWALD ELECTROSTATICS */
668
669             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
670             ewrt             = _mm_mul_pd(r22,ewtabscale);
671             ewitab           = _mm_cvttpd_epi32(ewrt);
672             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
673             ewitab           = _mm_slli_epi32(ewitab,2);
674             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
675             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
676             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
677             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
678             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
679             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
680             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
681             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
682             velec            = _mm_mul_pd(qq22,_mm_sub_pd(rinv22,velec));
683             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
684
685             /* Update potential sum for this i atom from the interaction with this j atom. */
686             velecsum         = _mm_add_pd(velecsum,velec);
687
688             fscal            = felec;
689
690             /* Calculate temporary vectorial force */
691             tx               = _mm_mul_pd(fscal,dx22);
692             ty               = _mm_mul_pd(fscal,dy22);
693             tz               = _mm_mul_pd(fscal,dz22);
694
695             /* Update vectorial force */
696             fix2             = _mm_add_pd(fix2,tx);
697             fiy2             = _mm_add_pd(fiy2,ty);
698             fiz2             = _mm_add_pd(fiz2,tz);
699
700             fjx2             = _mm_add_pd(fjx2,tx);
701             fjy2             = _mm_add_pd(fjy2,ty);
702             fjz2             = _mm_add_pd(fjz2,tz);
703
704             gmx_mm_decrement_3rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
705
706             /* Inner loop uses 397 flops */
707         }
708
709         if(jidx<j_index_end)
710         {
711
712             jnrA             = jjnr[jidx];
713             j_coord_offsetA  = DIM*jnrA;
714
715             /* load j atom coordinates */
716             gmx_mm_load_3rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
717                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
718
719             /* Calculate displacement vector */
720             dx00             = _mm_sub_pd(ix0,jx0);
721             dy00             = _mm_sub_pd(iy0,jy0);
722             dz00             = _mm_sub_pd(iz0,jz0);
723             dx01             = _mm_sub_pd(ix0,jx1);
724             dy01             = _mm_sub_pd(iy0,jy1);
725             dz01             = _mm_sub_pd(iz0,jz1);
726             dx02             = _mm_sub_pd(ix0,jx2);
727             dy02             = _mm_sub_pd(iy0,jy2);
728             dz02             = _mm_sub_pd(iz0,jz2);
729             dx10             = _mm_sub_pd(ix1,jx0);
730             dy10             = _mm_sub_pd(iy1,jy0);
731             dz10             = _mm_sub_pd(iz1,jz0);
732             dx11             = _mm_sub_pd(ix1,jx1);
733             dy11             = _mm_sub_pd(iy1,jy1);
734             dz11             = _mm_sub_pd(iz1,jz1);
735             dx12             = _mm_sub_pd(ix1,jx2);
736             dy12             = _mm_sub_pd(iy1,jy2);
737             dz12             = _mm_sub_pd(iz1,jz2);
738             dx20             = _mm_sub_pd(ix2,jx0);
739             dy20             = _mm_sub_pd(iy2,jy0);
740             dz20             = _mm_sub_pd(iz2,jz0);
741             dx21             = _mm_sub_pd(ix2,jx1);
742             dy21             = _mm_sub_pd(iy2,jy1);
743             dz21             = _mm_sub_pd(iz2,jz1);
744             dx22             = _mm_sub_pd(ix2,jx2);
745             dy22             = _mm_sub_pd(iy2,jy2);
746             dz22             = _mm_sub_pd(iz2,jz2);
747
748             /* Calculate squared distance and things based on it */
749             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
750             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
751             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
752             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
753             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
754             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
755             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
756             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
757             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
758
759             rinv00           = sse2_invsqrt_d(rsq00);
760             rinv01           = sse2_invsqrt_d(rsq01);
761             rinv02           = sse2_invsqrt_d(rsq02);
762             rinv10           = sse2_invsqrt_d(rsq10);
763             rinv11           = sse2_invsqrt_d(rsq11);
764             rinv12           = sse2_invsqrt_d(rsq12);
765             rinv20           = sse2_invsqrt_d(rsq20);
766             rinv21           = sse2_invsqrt_d(rsq21);
767             rinv22           = sse2_invsqrt_d(rsq22);
768
769             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
770             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
771             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
772             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
773             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
774             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
775             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
776             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
777             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
778
779             fjx0             = _mm_setzero_pd();
780             fjy0             = _mm_setzero_pd();
781             fjz0             = _mm_setzero_pd();
782             fjx1             = _mm_setzero_pd();
783             fjy1             = _mm_setzero_pd();
784             fjz1             = _mm_setzero_pd();
785             fjx2             = _mm_setzero_pd();
786             fjy2             = _mm_setzero_pd();
787             fjz2             = _mm_setzero_pd();
788
789             /**************************
790              * CALCULATE INTERACTIONS *
791              **************************/
792
793             r00              = _mm_mul_pd(rsq00,rinv00);
794
795             /* EWALD ELECTROSTATICS */
796
797             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
798             ewrt             = _mm_mul_pd(r00,ewtabscale);
799             ewitab           = _mm_cvttpd_epi32(ewrt);
800             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
801             ewitab           = _mm_slli_epi32(ewitab,2);
802             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
803             ewtabD           = _mm_setzero_pd();
804             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
805             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
806             ewtabFn          = _mm_setzero_pd();
807             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
808             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
809             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
810             velec            = _mm_mul_pd(qq00,_mm_sub_pd(rinv00,velec));
811             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
812
813             /* Analytical LJ-PME */
814             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
815             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
816             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
817             exponent         = sse2_exp_d(ewcljrsq);
818             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
819             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
820             /* vvdw6 = [C6 - C6grid * (1-poly)]/r6 */
821             vvdw6            = _mm_mul_pd(_mm_sub_pd(c6_00,_mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly))),rinvsix);
822             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
823             vvdw             = _mm_sub_pd(_mm_mul_pd(vvdw12,one_twelfth),_mm_mul_pd(vvdw6,one_sixth));
824             /* fvdw = vvdw12/r - (vvdw6/r + (C6grid * exponent * beta^6)/r) */
825             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,_mm_sub_pd(vvdw6,_mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6)))),rinvsq00);
826
827             /* Update potential sum for this i atom from the interaction with this j atom. */
828             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
829             velecsum         = _mm_add_pd(velecsum,velec);
830             vvdw             = _mm_unpacklo_pd(vvdw,_mm_setzero_pd());
831             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
832
833             fscal            = _mm_add_pd(felec,fvdw);
834
835             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
836
837             /* Calculate temporary vectorial force */
838             tx               = _mm_mul_pd(fscal,dx00);
839             ty               = _mm_mul_pd(fscal,dy00);
840             tz               = _mm_mul_pd(fscal,dz00);
841
842             /* Update vectorial force */
843             fix0             = _mm_add_pd(fix0,tx);
844             fiy0             = _mm_add_pd(fiy0,ty);
845             fiz0             = _mm_add_pd(fiz0,tz);
846
847             fjx0             = _mm_add_pd(fjx0,tx);
848             fjy0             = _mm_add_pd(fjy0,ty);
849             fjz0             = _mm_add_pd(fjz0,tz);
850
851             /**************************
852              * CALCULATE INTERACTIONS *
853              **************************/
854
855             r01              = _mm_mul_pd(rsq01,rinv01);
856
857             /* EWALD ELECTROSTATICS */
858
859             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
860             ewrt             = _mm_mul_pd(r01,ewtabscale);
861             ewitab           = _mm_cvttpd_epi32(ewrt);
862             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
863             ewitab           = _mm_slli_epi32(ewitab,2);
864             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
865             ewtabD           = _mm_setzero_pd();
866             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
867             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
868             ewtabFn          = _mm_setzero_pd();
869             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
870             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
871             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
872             velec            = _mm_mul_pd(qq01,_mm_sub_pd(rinv01,velec));
873             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
874
875             /* Update potential sum for this i atom from the interaction with this j atom. */
876             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
877             velecsum         = _mm_add_pd(velecsum,velec);
878
879             fscal            = felec;
880
881             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
882
883             /* Calculate temporary vectorial force */
884             tx               = _mm_mul_pd(fscal,dx01);
885             ty               = _mm_mul_pd(fscal,dy01);
886             tz               = _mm_mul_pd(fscal,dz01);
887
888             /* Update vectorial force */
889             fix0             = _mm_add_pd(fix0,tx);
890             fiy0             = _mm_add_pd(fiy0,ty);
891             fiz0             = _mm_add_pd(fiz0,tz);
892
893             fjx1             = _mm_add_pd(fjx1,tx);
894             fjy1             = _mm_add_pd(fjy1,ty);
895             fjz1             = _mm_add_pd(fjz1,tz);
896
897             /**************************
898              * CALCULATE INTERACTIONS *
899              **************************/
900
901             r02              = _mm_mul_pd(rsq02,rinv02);
902
903             /* EWALD ELECTROSTATICS */
904
905             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
906             ewrt             = _mm_mul_pd(r02,ewtabscale);
907             ewitab           = _mm_cvttpd_epi32(ewrt);
908             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
909             ewitab           = _mm_slli_epi32(ewitab,2);
910             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
911             ewtabD           = _mm_setzero_pd();
912             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
913             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
914             ewtabFn          = _mm_setzero_pd();
915             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
916             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
917             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
918             velec            = _mm_mul_pd(qq02,_mm_sub_pd(rinv02,velec));
919             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
920
921             /* Update potential sum for this i atom from the interaction with this j atom. */
922             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
923             velecsum         = _mm_add_pd(velecsum,velec);
924
925             fscal            = felec;
926
927             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
928
929             /* Calculate temporary vectorial force */
930             tx               = _mm_mul_pd(fscal,dx02);
931             ty               = _mm_mul_pd(fscal,dy02);
932             tz               = _mm_mul_pd(fscal,dz02);
933
934             /* Update vectorial force */
935             fix0             = _mm_add_pd(fix0,tx);
936             fiy0             = _mm_add_pd(fiy0,ty);
937             fiz0             = _mm_add_pd(fiz0,tz);
938
939             fjx2             = _mm_add_pd(fjx2,tx);
940             fjy2             = _mm_add_pd(fjy2,ty);
941             fjz2             = _mm_add_pd(fjz2,tz);
942
943             /**************************
944              * CALCULATE INTERACTIONS *
945              **************************/
946
947             r10              = _mm_mul_pd(rsq10,rinv10);
948
949             /* EWALD ELECTROSTATICS */
950
951             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
952             ewrt             = _mm_mul_pd(r10,ewtabscale);
953             ewitab           = _mm_cvttpd_epi32(ewrt);
954             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
955             ewitab           = _mm_slli_epi32(ewitab,2);
956             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
957             ewtabD           = _mm_setzero_pd();
958             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
959             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
960             ewtabFn          = _mm_setzero_pd();
961             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
962             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
963             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
964             velec            = _mm_mul_pd(qq10,_mm_sub_pd(rinv10,velec));
965             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
966
967             /* Update potential sum for this i atom from the interaction with this j atom. */
968             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
969             velecsum         = _mm_add_pd(velecsum,velec);
970
971             fscal            = felec;
972
973             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
974
975             /* Calculate temporary vectorial force */
976             tx               = _mm_mul_pd(fscal,dx10);
977             ty               = _mm_mul_pd(fscal,dy10);
978             tz               = _mm_mul_pd(fscal,dz10);
979
980             /* Update vectorial force */
981             fix1             = _mm_add_pd(fix1,tx);
982             fiy1             = _mm_add_pd(fiy1,ty);
983             fiz1             = _mm_add_pd(fiz1,tz);
984
985             fjx0             = _mm_add_pd(fjx0,tx);
986             fjy0             = _mm_add_pd(fjy0,ty);
987             fjz0             = _mm_add_pd(fjz0,tz);
988
989             /**************************
990              * CALCULATE INTERACTIONS *
991              **************************/
992
993             r11              = _mm_mul_pd(rsq11,rinv11);
994
995             /* EWALD ELECTROSTATICS */
996
997             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
998             ewrt             = _mm_mul_pd(r11,ewtabscale);
999             ewitab           = _mm_cvttpd_epi32(ewrt);
1000             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1001             ewitab           = _mm_slli_epi32(ewitab,2);
1002             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1003             ewtabD           = _mm_setzero_pd();
1004             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1005             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1006             ewtabFn          = _mm_setzero_pd();
1007             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1008             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1009             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1010             velec            = _mm_mul_pd(qq11,_mm_sub_pd(rinv11,velec));
1011             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1012
1013             /* Update potential sum for this i atom from the interaction with this j atom. */
1014             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1015             velecsum         = _mm_add_pd(velecsum,velec);
1016
1017             fscal            = felec;
1018
1019             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1020
1021             /* Calculate temporary vectorial force */
1022             tx               = _mm_mul_pd(fscal,dx11);
1023             ty               = _mm_mul_pd(fscal,dy11);
1024             tz               = _mm_mul_pd(fscal,dz11);
1025
1026             /* Update vectorial force */
1027             fix1             = _mm_add_pd(fix1,tx);
1028             fiy1             = _mm_add_pd(fiy1,ty);
1029             fiz1             = _mm_add_pd(fiz1,tz);
1030
1031             fjx1             = _mm_add_pd(fjx1,tx);
1032             fjy1             = _mm_add_pd(fjy1,ty);
1033             fjz1             = _mm_add_pd(fjz1,tz);
1034
1035             /**************************
1036              * CALCULATE INTERACTIONS *
1037              **************************/
1038
1039             r12              = _mm_mul_pd(rsq12,rinv12);
1040
1041             /* EWALD ELECTROSTATICS */
1042
1043             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1044             ewrt             = _mm_mul_pd(r12,ewtabscale);
1045             ewitab           = _mm_cvttpd_epi32(ewrt);
1046             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1047             ewitab           = _mm_slli_epi32(ewitab,2);
1048             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1049             ewtabD           = _mm_setzero_pd();
1050             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1051             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1052             ewtabFn          = _mm_setzero_pd();
1053             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1054             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1055             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1056             velec            = _mm_mul_pd(qq12,_mm_sub_pd(rinv12,velec));
1057             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1058
1059             /* Update potential sum for this i atom from the interaction with this j atom. */
1060             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1061             velecsum         = _mm_add_pd(velecsum,velec);
1062
1063             fscal            = felec;
1064
1065             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1066
1067             /* Calculate temporary vectorial force */
1068             tx               = _mm_mul_pd(fscal,dx12);
1069             ty               = _mm_mul_pd(fscal,dy12);
1070             tz               = _mm_mul_pd(fscal,dz12);
1071
1072             /* Update vectorial force */
1073             fix1             = _mm_add_pd(fix1,tx);
1074             fiy1             = _mm_add_pd(fiy1,ty);
1075             fiz1             = _mm_add_pd(fiz1,tz);
1076
1077             fjx2             = _mm_add_pd(fjx2,tx);
1078             fjy2             = _mm_add_pd(fjy2,ty);
1079             fjz2             = _mm_add_pd(fjz2,tz);
1080
1081             /**************************
1082              * CALCULATE INTERACTIONS *
1083              **************************/
1084
1085             r20              = _mm_mul_pd(rsq20,rinv20);
1086
1087             /* EWALD ELECTROSTATICS */
1088
1089             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1090             ewrt             = _mm_mul_pd(r20,ewtabscale);
1091             ewitab           = _mm_cvttpd_epi32(ewrt);
1092             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1093             ewitab           = _mm_slli_epi32(ewitab,2);
1094             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1095             ewtabD           = _mm_setzero_pd();
1096             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1097             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1098             ewtabFn          = _mm_setzero_pd();
1099             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1100             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1101             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1102             velec            = _mm_mul_pd(qq20,_mm_sub_pd(rinv20,velec));
1103             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
1104
1105             /* Update potential sum for this i atom from the interaction with this j atom. */
1106             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1107             velecsum         = _mm_add_pd(velecsum,velec);
1108
1109             fscal            = felec;
1110
1111             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1112
1113             /* Calculate temporary vectorial force */
1114             tx               = _mm_mul_pd(fscal,dx20);
1115             ty               = _mm_mul_pd(fscal,dy20);
1116             tz               = _mm_mul_pd(fscal,dz20);
1117
1118             /* Update vectorial force */
1119             fix2             = _mm_add_pd(fix2,tx);
1120             fiy2             = _mm_add_pd(fiy2,ty);
1121             fiz2             = _mm_add_pd(fiz2,tz);
1122
1123             fjx0             = _mm_add_pd(fjx0,tx);
1124             fjy0             = _mm_add_pd(fjy0,ty);
1125             fjz0             = _mm_add_pd(fjz0,tz);
1126
1127             /**************************
1128              * CALCULATE INTERACTIONS *
1129              **************************/
1130
1131             r21              = _mm_mul_pd(rsq21,rinv21);
1132
1133             /* EWALD ELECTROSTATICS */
1134
1135             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1136             ewrt             = _mm_mul_pd(r21,ewtabscale);
1137             ewitab           = _mm_cvttpd_epi32(ewrt);
1138             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1139             ewitab           = _mm_slli_epi32(ewitab,2);
1140             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1141             ewtabD           = _mm_setzero_pd();
1142             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1143             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1144             ewtabFn          = _mm_setzero_pd();
1145             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1146             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1147             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1148             velec            = _mm_mul_pd(qq21,_mm_sub_pd(rinv21,velec));
1149             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
1150
1151             /* Update potential sum for this i atom from the interaction with this j atom. */
1152             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1153             velecsum         = _mm_add_pd(velecsum,velec);
1154
1155             fscal            = felec;
1156
1157             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1158
1159             /* Calculate temporary vectorial force */
1160             tx               = _mm_mul_pd(fscal,dx21);
1161             ty               = _mm_mul_pd(fscal,dy21);
1162             tz               = _mm_mul_pd(fscal,dz21);
1163
1164             /* Update vectorial force */
1165             fix2             = _mm_add_pd(fix2,tx);
1166             fiy2             = _mm_add_pd(fiy2,ty);
1167             fiz2             = _mm_add_pd(fiz2,tz);
1168
1169             fjx1             = _mm_add_pd(fjx1,tx);
1170             fjy1             = _mm_add_pd(fjy1,ty);
1171             fjz1             = _mm_add_pd(fjz1,tz);
1172
1173             /**************************
1174              * CALCULATE INTERACTIONS *
1175              **************************/
1176
1177             r22              = _mm_mul_pd(rsq22,rinv22);
1178
1179             /* EWALD ELECTROSTATICS */
1180
1181             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1182             ewrt             = _mm_mul_pd(r22,ewtabscale);
1183             ewitab           = _mm_cvttpd_epi32(ewrt);
1184             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1185             ewitab           = _mm_slli_epi32(ewitab,2);
1186             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1187             ewtabD           = _mm_setzero_pd();
1188             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1189             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1190             ewtabFn          = _mm_setzero_pd();
1191             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1192             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1193             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1194             velec            = _mm_mul_pd(qq22,_mm_sub_pd(rinv22,velec));
1195             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
1196
1197             /* Update potential sum for this i atom from the interaction with this j atom. */
1198             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1199             velecsum         = _mm_add_pd(velecsum,velec);
1200
1201             fscal            = felec;
1202
1203             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1204
1205             /* Calculate temporary vectorial force */
1206             tx               = _mm_mul_pd(fscal,dx22);
1207             ty               = _mm_mul_pd(fscal,dy22);
1208             tz               = _mm_mul_pd(fscal,dz22);
1209
1210             /* Update vectorial force */
1211             fix2             = _mm_add_pd(fix2,tx);
1212             fiy2             = _mm_add_pd(fiy2,ty);
1213             fiz2             = _mm_add_pd(fiz2,tz);
1214
1215             fjx2             = _mm_add_pd(fjx2,tx);
1216             fjy2             = _mm_add_pd(fjy2,ty);
1217             fjz2             = _mm_add_pd(fjz2,tz);
1218
1219             gmx_mm_decrement_3rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1220
1221             /* Inner loop uses 397 flops */
1222         }
1223
1224         /* End of innermost loop */
1225
1226         gmx_mm_update_iforce_3atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1227                                               f+i_coord_offset,fshift+i_shift_offset);
1228
1229         ggid                        = gid[iidx];
1230         /* Update potential energies */
1231         gmx_mm_update_1pot_pd(velecsum,kernel_data->energygrp_elec+ggid);
1232         gmx_mm_update_1pot_pd(vvdwsum,kernel_data->energygrp_vdw+ggid);
1233
1234         /* Increment number of inner iterations */
1235         inneriter                  += j_index_end - j_index_start;
1236
1237         /* Outer loop uses 20 flops */
1238     }
1239
1240     /* Increment number of outer iterations */
1241     outeriter        += nri;
1242
1243     /* Update outer/inner flops */
1244
1245     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*20 + inneriter*397);
1246 }
1247 /*
1248  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwLJEw_GeomW3W3_F_sse2_double
1249  * Electrostatics interaction: Ewald
1250  * VdW interaction:            LJEwald
1251  * Geometry:                   Water3-Water3
1252  * Calculate force/pot:        Force
1253  */
1254 void
1255 nb_kernel_ElecEw_VdwLJEw_GeomW3W3_F_sse2_double
1256                     (t_nblist                    * gmx_restrict       nlist,
1257                      rvec                        * gmx_restrict          xx,
1258                      rvec                        * gmx_restrict          ff,
1259                      struct t_forcerec           * gmx_restrict          fr,
1260                      t_mdatoms                   * gmx_restrict     mdatoms,
1261                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
1262                      t_nrnb                      * gmx_restrict        nrnb)
1263 {
1264     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
1265      * just 0 for non-waters.
1266      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
1267      * jnr indices corresponding to data put in the four positions in the SIMD register.
1268      */
1269     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
1270     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1271     int              jnrA,jnrB;
1272     int              j_coord_offsetA,j_coord_offsetB;
1273     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
1274     real             rcutoff_scalar;
1275     real             *shiftvec,*fshift,*x,*f;
1276     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
1277     int              vdwioffset0;
1278     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1279     int              vdwioffset1;
1280     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1281     int              vdwioffset2;
1282     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1283     int              vdwjidx0A,vdwjidx0B;
1284     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1285     int              vdwjidx1A,vdwjidx1B;
1286     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1287     int              vdwjidx2A,vdwjidx2B;
1288     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1289     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1290     __m128d          dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
1291     __m128d          dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
1292     __m128d          dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
1293     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1294     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1295     __m128d          dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
1296     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1297     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1298     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
1299     real             *charge;
1300     int              nvdwtype;
1301     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1302     int              *vdwtype;
1303     real             *vdwparam;
1304     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
1305     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
1306     __m128d           c6grid_00;
1307     __m128d           c6grid_01;
1308     __m128d           c6grid_02;
1309     __m128d           c6grid_10;
1310     __m128d           c6grid_11;
1311     __m128d           c6grid_12;
1312     __m128d           c6grid_20;
1313     __m128d           c6grid_21;
1314     __m128d           c6grid_22;
1315     __m128d           ewclj,ewclj2,ewclj6,ewcljrsq,poly,exponent,f6A,f6B,sh_lj_ewald;
1316     real             *vdwgridparam;
1317     __m128d           one_half = _mm_set1_pd(0.5);
1318     __m128d           minus_one = _mm_set1_pd(-1.0);
1319     __m128i          ewitab;
1320     __m128d          ewtabscale,eweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
1321     real             *ewtab;
1322     __m128d          dummy_mask,cutoff_mask;
1323     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
1324     __m128d          one     = _mm_set1_pd(1.0);
1325     __m128d          two     = _mm_set1_pd(2.0);
1326     x                = xx[0];
1327     f                = ff[0];
1328
1329     nri              = nlist->nri;
1330     iinr             = nlist->iinr;
1331     jindex           = nlist->jindex;
1332     jjnr             = nlist->jjnr;
1333     shiftidx         = nlist->shift;
1334     gid              = nlist->gid;
1335     shiftvec         = fr->shift_vec[0];
1336     fshift           = fr->fshift[0];
1337     facel            = _mm_set1_pd(fr->ic->epsfac);
1338     charge           = mdatoms->chargeA;
1339     nvdwtype         = fr->ntype;
1340     vdwparam         = fr->nbfp;
1341     vdwtype          = mdatoms->typeA;
1342     vdwgridparam     = fr->ljpme_c6grid;
1343     sh_lj_ewald      = _mm_set1_pd(fr->ic->sh_lj_ewald);
1344     ewclj            = _mm_set1_pd(fr->ic->ewaldcoeff_lj);
1345     ewclj2           = _mm_mul_pd(minus_one,_mm_mul_pd(ewclj,ewclj));
1346
1347     sh_ewald         = _mm_set1_pd(fr->ic->sh_ewald);
1348     ewtab            = fr->ic->tabq_coul_F;
1349     ewtabscale       = _mm_set1_pd(fr->ic->tabq_scale);
1350     ewtabhalfspace   = _mm_set1_pd(0.5/fr->ic->tabq_scale);
1351
1352     /* Setup water-specific parameters */
1353     inr              = nlist->iinr[0];
1354     iq0              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+0]));
1355     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
1356     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
1357     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
1358
1359     jq0              = _mm_set1_pd(charge[inr+0]);
1360     jq1              = _mm_set1_pd(charge[inr+1]);
1361     jq2              = _mm_set1_pd(charge[inr+2]);
1362     vdwjidx0A        = 2*vdwtype[inr+0];
1363     qq00             = _mm_mul_pd(iq0,jq0);
1364     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
1365     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
1366     c6grid_00        = _mm_set1_pd(vdwgridparam[vdwioffset0+vdwjidx0A]);
1367     qq01             = _mm_mul_pd(iq0,jq1);
1368     qq02             = _mm_mul_pd(iq0,jq2);
1369     qq10             = _mm_mul_pd(iq1,jq0);
1370     qq11             = _mm_mul_pd(iq1,jq1);
1371     qq12             = _mm_mul_pd(iq1,jq2);
1372     qq20             = _mm_mul_pd(iq2,jq0);
1373     qq21             = _mm_mul_pd(iq2,jq1);
1374     qq22             = _mm_mul_pd(iq2,jq2);
1375
1376     /* Avoid stupid compiler warnings */
1377     jnrA = jnrB = 0;
1378     j_coord_offsetA = 0;
1379     j_coord_offsetB = 0;
1380
1381     outeriter        = 0;
1382     inneriter        = 0;
1383
1384     /* Start outer loop over neighborlists */
1385     for(iidx=0; iidx<nri; iidx++)
1386     {
1387         /* Load shift vector for this list */
1388         i_shift_offset   = DIM*shiftidx[iidx];
1389
1390         /* Load limits for loop over neighbors */
1391         j_index_start    = jindex[iidx];
1392         j_index_end      = jindex[iidx+1];
1393
1394         /* Get outer coordinate index */
1395         inr              = iinr[iidx];
1396         i_coord_offset   = DIM*inr;
1397
1398         /* Load i particle coords and add shift vector */
1399         gmx_mm_load_shift_and_3rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
1400                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
1401
1402         fix0             = _mm_setzero_pd();
1403         fiy0             = _mm_setzero_pd();
1404         fiz0             = _mm_setzero_pd();
1405         fix1             = _mm_setzero_pd();
1406         fiy1             = _mm_setzero_pd();
1407         fiz1             = _mm_setzero_pd();
1408         fix2             = _mm_setzero_pd();
1409         fiy2             = _mm_setzero_pd();
1410         fiz2             = _mm_setzero_pd();
1411
1412         /* Start inner kernel loop */
1413         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
1414         {
1415
1416             /* Get j neighbor index, and coordinate index */
1417             jnrA             = jjnr[jidx];
1418             jnrB             = jjnr[jidx+1];
1419             j_coord_offsetA  = DIM*jnrA;
1420             j_coord_offsetB  = DIM*jnrB;
1421
1422             /* load j atom coordinates */
1423             gmx_mm_load_3rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
1424                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1425
1426             /* Calculate displacement vector */
1427             dx00             = _mm_sub_pd(ix0,jx0);
1428             dy00             = _mm_sub_pd(iy0,jy0);
1429             dz00             = _mm_sub_pd(iz0,jz0);
1430             dx01             = _mm_sub_pd(ix0,jx1);
1431             dy01             = _mm_sub_pd(iy0,jy1);
1432             dz01             = _mm_sub_pd(iz0,jz1);
1433             dx02             = _mm_sub_pd(ix0,jx2);
1434             dy02             = _mm_sub_pd(iy0,jy2);
1435             dz02             = _mm_sub_pd(iz0,jz2);
1436             dx10             = _mm_sub_pd(ix1,jx0);
1437             dy10             = _mm_sub_pd(iy1,jy0);
1438             dz10             = _mm_sub_pd(iz1,jz0);
1439             dx11             = _mm_sub_pd(ix1,jx1);
1440             dy11             = _mm_sub_pd(iy1,jy1);
1441             dz11             = _mm_sub_pd(iz1,jz1);
1442             dx12             = _mm_sub_pd(ix1,jx2);
1443             dy12             = _mm_sub_pd(iy1,jy2);
1444             dz12             = _mm_sub_pd(iz1,jz2);
1445             dx20             = _mm_sub_pd(ix2,jx0);
1446             dy20             = _mm_sub_pd(iy2,jy0);
1447             dz20             = _mm_sub_pd(iz2,jz0);
1448             dx21             = _mm_sub_pd(ix2,jx1);
1449             dy21             = _mm_sub_pd(iy2,jy1);
1450             dz21             = _mm_sub_pd(iz2,jz1);
1451             dx22             = _mm_sub_pd(ix2,jx2);
1452             dy22             = _mm_sub_pd(iy2,jy2);
1453             dz22             = _mm_sub_pd(iz2,jz2);
1454
1455             /* Calculate squared distance and things based on it */
1456             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
1457             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
1458             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
1459             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
1460             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
1461             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
1462             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
1463             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
1464             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
1465
1466             rinv00           = sse2_invsqrt_d(rsq00);
1467             rinv01           = sse2_invsqrt_d(rsq01);
1468             rinv02           = sse2_invsqrt_d(rsq02);
1469             rinv10           = sse2_invsqrt_d(rsq10);
1470             rinv11           = sse2_invsqrt_d(rsq11);
1471             rinv12           = sse2_invsqrt_d(rsq12);
1472             rinv20           = sse2_invsqrt_d(rsq20);
1473             rinv21           = sse2_invsqrt_d(rsq21);
1474             rinv22           = sse2_invsqrt_d(rsq22);
1475
1476             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
1477             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
1478             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
1479             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
1480             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
1481             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
1482             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
1483             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
1484             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
1485
1486             fjx0             = _mm_setzero_pd();
1487             fjy0             = _mm_setzero_pd();
1488             fjz0             = _mm_setzero_pd();
1489             fjx1             = _mm_setzero_pd();
1490             fjy1             = _mm_setzero_pd();
1491             fjz1             = _mm_setzero_pd();
1492             fjx2             = _mm_setzero_pd();
1493             fjy2             = _mm_setzero_pd();
1494             fjz2             = _mm_setzero_pd();
1495
1496             /**************************
1497              * CALCULATE INTERACTIONS *
1498              **************************/
1499
1500             r00              = _mm_mul_pd(rsq00,rinv00);
1501
1502             /* EWALD ELECTROSTATICS */
1503
1504             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1505             ewrt             = _mm_mul_pd(r00,ewtabscale);
1506             ewitab           = _mm_cvttpd_epi32(ewrt);
1507             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1508             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1509                                          &ewtabF,&ewtabFn);
1510             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1511             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
1512
1513             /* Analytical LJ-PME */
1514             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
1515             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
1516             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
1517             exponent         = sse2_exp_d(ewcljrsq);
1518             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
1519             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
1520             /* f6A = 6 * C6grid * (1 - poly) */
1521             f6A              = _mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly));
1522             /* f6B = C6grid * exponent * beta^6 */
1523             f6B              = _mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6));
1524             /* fvdw = 12*C12/r13 - ((6*C6 - f6A)/r6 + f6B)/r */
1525             fvdw              = _mm_mul_pd(_mm_add_pd(_mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),_mm_sub_pd(c6_00,f6A)),rinvsix),f6B),rinvsq00);
1526
1527             fscal            = _mm_add_pd(felec,fvdw);
1528
1529             /* Calculate temporary vectorial force */
1530             tx               = _mm_mul_pd(fscal,dx00);
1531             ty               = _mm_mul_pd(fscal,dy00);
1532             tz               = _mm_mul_pd(fscal,dz00);
1533
1534             /* Update vectorial force */
1535             fix0             = _mm_add_pd(fix0,tx);
1536             fiy0             = _mm_add_pd(fiy0,ty);
1537             fiz0             = _mm_add_pd(fiz0,tz);
1538
1539             fjx0             = _mm_add_pd(fjx0,tx);
1540             fjy0             = _mm_add_pd(fjy0,ty);
1541             fjz0             = _mm_add_pd(fjz0,tz);
1542
1543             /**************************
1544              * CALCULATE INTERACTIONS *
1545              **************************/
1546
1547             r01              = _mm_mul_pd(rsq01,rinv01);
1548
1549             /* EWALD ELECTROSTATICS */
1550
1551             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1552             ewrt             = _mm_mul_pd(r01,ewtabscale);
1553             ewitab           = _mm_cvttpd_epi32(ewrt);
1554             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1555             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1556                                          &ewtabF,&ewtabFn);
1557             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1558             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
1559
1560             fscal            = felec;
1561
1562             /* Calculate temporary vectorial force */
1563             tx               = _mm_mul_pd(fscal,dx01);
1564             ty               = _mm_mul_pd(fscal,dy01);
1565             tz               = _mm_mul_pd(fscal,dz01);
1566
1567             /* Update vectorial force */
1568             fix0             = _mm_add_pd(fix0,tx);
1569             fiy0             = _mm_add_pd(fiy0,ty);
1570             fiz0             = _mm_add_pd(fiz0,tz);
1571
1572             fjx1             = _mm_add_pd(fjx1,tx);
1573             fjy1             = _mm_add_pd(fjy1,ty);
1574             fjz1             = _mm_add_pd(fjz1,tz);
1575
1576             /**************************
1577              * CALCULATE INTERACTIONS *
1578              **************************/
1579
1580             r02              = _mm_mul_pd(rsq02,rinv02);
1581
1582             /* EWALD ELECTROSTATICS */
1583
1584             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1585             ewrt             = _mm_mul_pd(r02,ewtabscale);
1586             ewitab           = _mm_cvttpd_epi32(ewrt);
1587             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1588             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1589                                          &ewtabF,&ewtabFn);
1590             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1591             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
1592
1593             fscal            = felec;
1594
1595             /* Calculate temporary vectorial force */
1596             tx               = _mm_mul_pd(fscal,dx02);
1597             ty               = _mm_mul_pd(fscal,dy02);
1598             tz               = _mm_mul_pd(fscal,dz02);
1599
1600             /* Update vectorial force */
1601             fix0             = _mm_add_pd(fix0,tx);
1602             fiy0             = _mm_add_pd(fiy0,ty);
1603             fiz0             = _mm_add_pd(fiz0,tz);
1604
1605             fjx2             = _mm_add_pd(fjx2,tx);
1606             fjy2             = _mm_add_pd(fjy2,ty);
1607             fjz2             = _mm_add_pd(fjz2,tz);
1608
1609             /**************************
1610              * CALCULATE INTERACTIONS *
1611              **************************/
1612
1613             r10              = _mm_mul_pd(rsq10,rinv10);
1614
1615             /* EWALD ELECTROSTATICS */
1616
1617             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1618             ewrt             = _mm_mul_pd(r10,ewtabscale);
1619             ewitab           = _mm_cvttpd_epi32(ewrt);
1620             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1621             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1622                                          &ewtabF,&ewtabFn);
1623             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1624             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
1625
1626             fscal            = felec;
1627
1628             /* Calculate temporary vectorial force */
1629             tx               = _mm_mul_pd(fscal,dx10);
1630             ty               = _mm_mul_pd(fscal,dy10);
1631             tz               = _mm_mul_pd(fscal,dz10);
1632
1633             /* Update vectorial force */
1634             fix1             = _mm_add_pd(fix1,tx);
1635             fiy1             = _mm_add_pd(fiy1,ty);
1636             fiz1             = _mm_add_pd(fiz1,tz);
1637
1638             fjx0             = _mm_add_pd(fjx0,tx);
1639             fjy0             = _mm_add_pd(fjy0,ty);
1640             fjz0             = _mm_add_pd(fjz0,tz);
1641
1642             /**************************
1643              * CALCULATE INTERACTIONS *
1644              **************************/
1645
1646             r11              = _mm_mul_pd(rsq11,rinv11);
1647
1648             /* EWALD ELECTROSTATICS */
1649
1650             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1651             ewrt             = _mm_mul_pd(r11,ewtabscale);
1652             ewitab           = _mm_cvttpd_epi32(ewrt);
1653             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1654             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1655                                          &ewtabF,&ewtabFn);
1656             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1657             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1658
1659             fscal            = felec;
1660
1661             /* Calculate temporary vectorial force */
1662             tx               = _mm_mul_pd(fscal,dx11);
1663             ty               = _mm_mul_pd(fscal,dy11);
1664             tz               = _mm_mul_pd(fscal,dz11);
1665
1666             /* Update vectorial force */
1667             fix1             = _mm_add_pd(fix1,tx);
1668             fiy1             = _mm_add_pd(fiy1,ty);
1669             fiz1             = _mm_add_pd(fiz1,tz);
1670
1671             fjx1             = _mm_add_pd(fjx1,tx);
1672             fjy1             = _mm_add_pd(fjy1,ty);
1673             fjz1             = _mm_add_pd(fjz1,tz);
1674
1675             /**************************
1676              * CALCULATE INTERACTIONS *
1677              **************************/
1678
1679             r12              = _mm_mul_pd(rsq12,rinv12);
1680
1681             /* EWALD ELECTROSTATICS */
1682
1683             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1684             ewrt             = _mm_mul_pd(r12,ewtabscale);
1685             ewitab           = _mm_cvttpd_epi32(ewrt);
1686             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1687             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1688                                          &ewtabF,&ewtabFn);
1689             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1690             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1691
1692             fscal            = felec;
1693
1694             /* Calculate temporary vectorial force */
1695             tx               = _mm_mul_pd(fscal,dx12);
1696             ty               = _mm_mul_pd(fscal,dy12);
1697             tz               = _mm_mul_pd(fscal,dz12);
1698
1699             /* Update vectorial force */
1700             fix1             = _mm_add_pd(fix1,tx);
1701             fiy1             = _mm_add_pd(fiy1,ty);
1702             fiz1             = _mm_add_pd(fiz1,tz);
1703
1704             fjx2             = _mm_add_pd(fjx2,tx);
1705             fjy2             = _mm_add_pd(fjy2,ty);
1706             fjz2             = _mm_add_pd(fjz2,tz);
1707
1708             /**************************
1709              * CALCULATE INTERACTIONS *
1710              **************************/
1711
1712             r20              = _mm_mul_pd(rsq20,rinv20);
1713
1714             /* EWALD ELECTROSTATICS */
1715
1716             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1717             ewrt             = _mm_mul_pd(r20,ewtabscale);
1718             ewitab           = _mm_cvttpd_epi32(ewrt);
1719             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1720             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1721                                          &ewtabF,&ewtabFn);
1722             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1723             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
1724
1725             fscal            = felec;
1726
1727             /* Calculate temporary vectorial force */
1728             tx               = _mm_mul_pd(fscal,dx20);
1729             ty               = _mm_mul_pd(fscal,dy20);
1730             tz               = _mm_mul_pd(fscal,dz20);
1731
1732             /* Update vectorial force */
1733             fix2             = _mm_add_pd(fix2,tx);
1734             fiy2             = _mm_add_pd(fiy2,ty);
1735             fiz2             = _mm_add_pd(fiz2,tz);
1736
1737             fjx0             = _mm_add_pd(fjx0,tx);
1738             fjy0             = _mm_add_pd(fjy0,ty);
1739             fjz0             = _mm_add_pd(fjz0,tz);
1740
1741             /**************************
1742              * CALCULATE INTERACTIONS *
1743              **************************/
1744
1745             r21              = _mm_mul_pd(rsq21,rinv21);
1746
1747             /* EWALD ELECTROSTATICS */
1748
1749             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1750             ewrt             = _mm_mul_pd(r21,ewtabscale);
1751             ewitab           = _mm_cvttpd_epi32(ewrt);
1752             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1753             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1754                                          &ewtabF,&ewtabFn);
1755             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1756             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
1757
1758             fscal            = felec;
1759
1760             /* Calculate temporary vectorial force */
1761             tx               = _mm_mul_pd(fscal,dx21);
1762             ty               = _mm_mul_pd(fscal,dy21);
1763             tz               = _mm_mul_pd(fscal,dz21);
1764
1765             /* Update vectorial force */
1766             fix2             = _mm_add_pd(fix2,tx);
1767             fiy2             = _mm_add_pd(fiy2,ty);
1768             fiz2             = _mm_add_pd(fiz2,tz);
1769
1770             fjx1             = _mm_add_pd(fjx1,tx);
1771             fjy1             = _mm_add_pd(fjy1,ty);
1772             fjz1             = _mm_add_pd(fjz1,tz);
1773
1774             /**************************
1775              * CALCULATE INTERACTIONS *
1776              **************************/
1777
1778             r22              = _mm_mul_pd(rsq22,rinv22);
1779
1780             /* EWALD ELECTROSTATICS */
1781
1782             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1783             ewrt             = _mm_mul_pd(r22,ewtabscale);
1784             ewitab           = _mm_cvttpd_epi32(ewrt);
1785             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1786             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1787                                          &ewtabF,&ewtabFn);
1788             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1789             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
1790
1791             fscal            = felec;
1792
1793             /* Calculate temporary vectorial force */
1794             tx               = _mm_mul_pd(fscal,dx22);
1795             ty               = _mm_mul_pd(fscal,dy22);
1796             tz               = _mm_mul_pd(fscal,dz22);
1797
1798             /* Update vectorial force */
1799             fix2             = _mm_add_pd(fix2,tx);
1800             fiy2             = _mm_add_pd(fiy2,ty);
1801             fiz2             = _mm_add_pd(fiz2,tz);
1802
1803             fjx2             = _mm_add_pd(fjx2,tx);
1804             fjy2             = _mm_add_pd(fjy2,ty);
1805             fjz2             = _mm_add_pd(fjz2,tz);
1806
1807             gmx_mm_decrement_3rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1808
1809             /* Inner loop uses 347 flops */
1810         }
1811
1812         if(jidx<j_index_end)
1813         {
1814
1815             jnrA             = jjnr[jidx];
1816             j_coord_offsetA  = DIM*jnrA;
1817
1818             /* load j atom coordinates */
1819             gmx_mm_load_3rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
1820                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1821
1822             /* Calculate displacement vector */
1823             dx00             = _mm_sub_pd(ix0,jx0);
1824             dy00             = _mm_sub_pd(iy0,jy0);
1825             dz00             = _mm_sub_pd(iz0,jz0);
1826             dx01             = _mm_sub_pd(ix0,jx1);
1827             dy01             = _mm_sub_pd(iy0,jy1);
1828             dz01             = _mm_sub_pd(iz0,jz1);
1829             dx02             = _mm_sub_pd(ix0,jx2);
1830             dy02             = _mm_sub_pd(iy0,jy2);
1831             dz02             = _mm_sub_pd(iz0,jz2);
1832             dx10             = _mm_sub_pd(ix1,jx0);
1833             dy10             = _mm_sub_pd(iy1,jy0);
1834             dz10             = _mm_sub_pd(iz1,jz0);
1835             dx11             = _mm_sub_pd(ix1,jx1);
1836             dy11             = _mm_sub_pd(iy1,jy1);
1837             dz11             = _mm_sub_pd(iz1,jz1);
1838             dx12             = _mm_sub_pd(ix1,jx2);
1839             dy12             = _mm_sub_pd(iy1,jy2);
1840             dz12             = _mm_sub_pd(iz1,jz2);
1841             dx20             = _mm_sub_pd(ix2,jx0);
1842             dy20             = _mm_sub_pd(iy2,jy0);
1843             dz20             = _mm_sub_pd(iz2,jz0);
1844             dx21             = _mm_sub_pd(ix2,jx1);
1845             dy21             = _mm_sub_pd(iy2,jy1);
1846             dz21             = _mm_sub_pd(iz2,jz1);
1847             dx22             = _mm_sub_pd(ix2,jx2);
1848             dy22             = _mm_sub_pd(iy2,jy2);
1849             dz22             = _mm_sub_pd(iz2,jz2);
1850
1851             /* Calculate squared distance and things based on it */
1852             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
1853             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
1854             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
1855             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
1856             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
1857             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
1858             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
1859             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
1860             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
1861
1862             rinv00           = sse2_invsqrt_d(rsq00);
1863             rinv01           = sse2_invsqrt_d(rsq01);
1864             rinv02           = sse2_invsqrt_d(rsq02);
1865             rinv10           = sse2_invsqrt_d(rsq10);
1866             rinv11           = sse2_invsqrt_d(rsq11);
1867             rinv12           = sse2_invsqrt_d(rsq12);
1868             rinv20           = sse2_invsqrt_d(rsq20);
1869             rinv21           = sse2_invsqrt_d(rsq21);
1870             rinv22           = sse2_invsqrt_d(rsq22);
1871
1872             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
1873             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
1874             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
1875             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
1876             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
1877             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
1878             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
1879             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
1880             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
1881
1882             fjx0             = _mm_setzero_pd();
1883             fjy0             = _mm_setzero_pd();
1884             fjz0             = _mm_setzero_pd();
1885             fjx1             = _mm_setzero_pd();
1886             fjy1             = _mm_setzero_pd();
1887             fjz1             = _mm_setzero_pd();
1888             fjx2             = _mm_setzero_pd();
1889             fjy2             = _mm_setzero_pd();
1890             fjz2             = _mm_setzero_pd();
1891
1892             /**************************
1893              * CALCULATE INTERACTIONS *
1894              **************************/
1895
1896             r00              = _mm_mul_pd(rsq00,rinv00);
1897
1898             /* EWALD ELECTROSTATICS */
1899
1900             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1901             ewrt             = _mm_mul_pd(r00,ewtabscale);
1902             ewitab           = _mm_cvttpd_epi32(ewrt);
1903             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1904             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1905             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1906             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
1907
1908             /* Analytical LJ-PME */
1909             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
1910             ewcljrsq         = _mm_mul_pd(ewclj2,rsq00);
1911             ewclj6           = _mm_mul_pd(ewclj2,_mm_mul_pd(ewclj2,ewclj2));
1912             exponent         = sse2_exp_d(ewcljrsq);
1913             /* poly = exp(-(beta*r)^2) * (1 + (beta*r)^2 + (beta*r)^4 /2) */
1914             poly             = _mm_mul_pd(exponent,_mm_add_pd(_mm_sub_pd(one,ewcljrsq),_mm_mul_pd(_mm_mul_pd(ewcljrsq,ewcljrsq),one_half)));
1915             /* f6A = 6 * C6grid * (1 - poly) */
1916             f6A              = _mm_mul_pd(c6grid_00,_mm_sub_pd(one,poly));
1917             /* f6B = C6grid * exponent * beta^6 */
1918             f6B              = _mm_mul_pd(_mm_mul_pd(c6grid_00,one_sixth),_mm_mul_pd(exponent,ewclj6));
1919             /* fvdw = 12*C12/r13 - ((6*C6 - f6A)/r6 + f6B)/r */
1920             fvdw              = _mm_mul_pd(_mm_add_pd(_mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),_mm_sub_pd(c6_00,f6A)),rinvsix),f6B),rinvsq00);
1921
1922             fscal            = _mm_add_pd(felec,fvdw);
1923
1924             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1925
1926             /* Calculate temporary vectorial force */
1927             tx               = _mm_mul_pd(fscal,dx00);
1928             ty               = _mm_mul_pd(fscal,dy00);
1929             tz               = _mm_mul_pd(fscal,dz00);
1930
1931             /* Update vectorial force */
1932             fix0             = _mm_add_pd(fix0,tx);
1933             fiy0             = _mm_add_pd(fiy0,ty);
1934             fiz0             = _mm_add_pd(fiz0,tz);
1935
1936             fjx0             = _mm_add_pd(fjx0,tx);
1937             fjy0             = _mm_add_pd(fjy0,ty);
1938             fjz0             = _mm_add_pd(fjz0,tz);
1939
1940             /**************************
1941              * CALCULATE INTERACTIONS *
1942              **************************/
1943
1944             r01              = _mm_mul_pd(rsq01,rinv01);
1945
1946             /* EWALD ELECTROSTATICS */
1947
1948             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1949             ewrt             = _mm_mul_pd(r01,ewtabscale);
1950             ewitab           = _mm_cvttpd_epi32(ewrt);
1951             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1952             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1953             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1954             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
1955
1956             fscal            = felec;
1957
1958             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1959
1960             /* Calculate temporary vectorial force */
1961             tx               = _mm_mul_pd(fscal,dx01);
1962             ty               = _mm_mul_pd(fscal,dy01);
1963             tz               = _mm_mul_pd(fscal,dz01);
1964
1965             /* Update vectorial force */
1966             fix0             = _mm_add_pd(fix0,tx);
1967             fiy0             = _mm_add_pd(fiy0,ty);
1968             fiz0             = _mm_add_pd(fiz0,tz);
1969
1970             fjx1             = _mm_add_pd(fjx1,tx);
1971             fjy1             = _mm_add_pd(fjy1,ty);
1972             fjz1             = _mm_add_pd(fjz1,tz);
1973
1974             /**************************
1975              * CALCULATE INTERACTIONS *
1976              **************************/
1977
1978             r02              = _mm_mul_pd(rsq02,rinv02);
1979
1980             /* EWALD ELECTROSTATICS */
1981
1982             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1983             ewrt             = _mm_mul_pd(r02,ewtabscale);
1984             ewitab           = _mm_cvttpd_epi32(ewrt);
1985             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
1986             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1987             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1988             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
1989
1990             fscal            = felec;
1991
1992             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1993
1994             /* Calculate temporary vectorial force */
1995             tx               = _mm_mul_pd(fscal,dx02);
1996             ty               = _mm_mul_pd(fscal,dy02);
1997             tz               = _mm_mul_pd(fscal,dz02);
1998
1999             /* Update vectorial force */
2000             fix0             = _mm_add_pd(fix0,tx);
2001             fiy0             = _mm_add_pd(fiy0,ty);
2002             fiz0             = _mm_add_pd(fiz0,tz);
2003
2004             fjx2             = _mm_add_pd(fjx2,tx);
2005             fjy2             = _mm_add_pd(fjy2,ty);
2006             fjz2             = _mm_add_pd(fjz2,tz);
2007
2008             /**************************
2009              * CALCULATE INTERACTIONS *
2010              **************************/
2011
2012             r10              = _mm_mul_pd(rsq10,rinv10);
2013
2014             /* EWALD ELECTROSTATICS */
2015
2016             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2017             ewrt             = _mm_mul_pd(r10,ewtabscale);
2018             ewitab           = _mm_cvttpd_epi32(ewrt);
2019             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2020             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2021             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2022             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
2023
2024             fscal            = felec;
2025
2026             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2027
2028             /* Calculate temporary vectorial force */
2029             tx               = _mm_mul_pd(fscal,dx10);
2030             ty               = _mm_mul_pd(fscal,dy10);
2031             tz               = _mm_mul_pd(fscal,dz10);
2032
2033             /* Update vectorial force */
2034             fix1             = _mm_add_pd(fix1,tx);
2035             fiy1             = _mm_add_pd(fiy1,ty);
2036             fiz1             = _mm_add_pd(fiz1,tz);
2037
2038             fjx0             = _mm_add_pd(fjx0,tx);
2039             fjy0             = _mm_add_pd(fjy0,ty);
2040             fjz0             = _mm_add_pd(fjz0,tz);
2041
2042             /**************************
2043              * CALCULATE INTERACTIONS *
2044              **************************/
2045
2046             r11              = _mm_mul_pd(rsq11,rinv11);
2047
2048             /* EWALD ELECTROSTATICS */
2049
2050             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2051             ewrt             = _mm_mul_pd(r11,ewtabscale);
2052             ewitab           = _mm_cvttpd_epi32(ewrt);
2053             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2054             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2055             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2056             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
2057
2058             fscal            = felec;
2059
2060             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2061
2062             /* Calculate temporary vectorial force */
2063             tx               = _mm_mul_pd(fscal,dx11);
2064             ty               = _mm_mul_pd(fscal,dy11);
2065             tz               = _mm_mul_pd(fscal,dz11);
2066
2067             /* Update vectorial force */
2068             fix1             = _mm_add_pd(fix1,tx);
2069             fiy1             = _mm_add_pd(fiy1,ty);
2070             fiz1             = _mm_add_pd(fiz1,tz);
2071
2072             fjx1             = _mm_add_pd(fjx1,tx);
2073             fjy1             = _mm_add_pd(fjy1,ty);
2074             fjz1             = _mm_add_pd(fjz1,tz);
2075
2076             /**************************
2077              * CALCULATE INTERACTIONS *
2078              **************************/
2079
2080             r12              = _mm_mul_pd(rsq12,rinv12);
2081
2082             /* EWALD ELECTROSTATICS */
2083
2084             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2085             ewrt             = _mm_mul_pd(r12,ewtabscale);
2086             ewitab           = _mm_cvttpd_epi32(ewrt);
2087             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2088             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2089             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2090             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
2091
2092             fscal            = felec;
2093
2094             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2095
2096             /* Calculate temporary vectorial force */
2097             tx               = _mm_mul_pd(fscal,dx12);
2098             ty               = _mm_mul_pd(fscal,dy12);
2099             tz               = _mm_mul_pd(fscal,dz12);
2100
2101             /* Update vectorial force */
2102             fix1             = _mm_add_pd(fix1,tx);
2103             fiy1             = _mm_add_pd(fiy1,ty);
2104             fiz1             = _mm_add_pd(fiz1,tz);
2105
2106             fjx2             = _mm_add_pd(fjx2,tx);
2107             fjy2             = _mm_add_pd(fjy2,ty);
2108             fjz2             = _mm_add_pd(fjz2,tz);
2109
2110             /**************************
2111              * CALCULATE INTERACTIONS *
2112              **************************/
2113
2114             r20              = _mm_mul_pd(rsq20,rinv20);
2115
2116             /* EWALD ELECTROSTATICS */
2117
2118             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2119             ewrt             = _mm_mul_pd(r20,ewtabscale);
2120             ewitab           = _mm_cvttpd_epi32(ewrt);
2121             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2122             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2123             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2124             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
2125
2126             fscal            = felec;
2127
2128             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2129
2130             /* Calculate temporary vectorial force */
2131             tx               = _mm_mul_pd(fscal,dx20);
2132             ty               = _mm_mul_pd(fscal,dy20);
2133             tz               = _mm_mul_pd(fscal,dz20);
2134
2135             /* Update vectorial force */
2136             fix2             = _mm_add_pd(fix2,tx);
2137             fiy2             = _mm_add_pd(fiy2,ty);
2138             fiz2             = _mm_add_pd(fiz2,tz);
2139
2140             fjx0             = _mm_add_pd(fjx0,tx);
2141             fjy0             = _mm_add_pd(fjy0,ty);
2142             fjz0             = _mm_add_pd(fjz0,tz);
2143
2144             /**************************
2145              * CALCULATE INTERACTIONS *
2146              **************************/
2147
2148             r21              = _mm_mul_pd(rsq21,rinv21);
2149
2150             /* EWALD ELECTROSTATICS */
2151
2152             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2153             ewrt             = _mm_mul_pd(r21,ewtabscale);
2154             ewitab           = _mm_cvttpd_epi32(ewrt);
2155             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2156             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2157             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2158             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
2159
2160             fscal            = felec;
2161
2162             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2163
2164             /* Calculate temporary vectorial force */
2165             tx               = _mm_mul_pd(fscal,dx21);
2166             ty               = _mm_mul_pd(fscal,dy21);
2167             tz               = _mm_mul_pd(fscal,dz21);
2168
2169             /* Update vectorial force */
2170             fix2             = _mm_add_pd(fix2,tx);
2171             fiy2             = _mm_add_pd(fiy2,ty);
2172             fiz2             = _mm_add_pd(fiz2,tz);
2173
2174             fjx1             = _mm_add_pd(fjx1,tx);
2175             fjy1             = _mm_add_pd(fjy1,ty);
2176             fjz1             = _mm_add_pd(fjz1,tz);
2177
2178             /**************************
2179              * CALCULATE INTERACTIONS *
2180              **************************/
2181
2182             r22              = _mm_mul_pd(rsq22,rinv22);
2183
2184             /* EWALD ELECTROSTATICS */
2185
2186             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2187             ewrt             = _mm_mul_pd(r22,ewtabscale);
2188             ewitab           = _mm_cvttpd_epi32(ewrt);
2189             eweps            = _mm_sub_pd(ewrt,_mm_cvtepi32_pd(ewitab));
2190             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2191             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2192             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
2193
2194             fscal            = felec;
2195
2196             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2197
2198             /* Calculate temporary vectorial force */
2199             tx               = _mm_mul_pd(fscal,dx22);
2200             ty               = _mm_mul_pd(fscal,dy22);
2201             tz               = _mm_mul_pd(fscal,dz22);
2202
2203             /* Update vectorial force */
2204             fix2             = _mm_add_pd(fix2,tx);
2205             fiy2             = _mm_add_pd(fiy2,ty);
2206             fiz2             = _mm_add_pd(fiz2,tz);
2207
2208             fjx2             = _mm_add_pd(fjx2,tx);
2209             fjy2             = _mm_add_pd(fjy2,ty);
2210             fjz2             = _mm_add_pd(fjz2,tz);
2211
2212             gmx_mm_decrement_3rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
2213
2214             /* Inner loop uses 347 flops */
2215         }
2216
2217         /* End of innermost loop */
2218
2219         gmx_mm_update_iforce_3atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
2220                                               f+i_coord_offset,fshift+i_shift_offset);
2221
2222         /* Increment number of inner iterations */
2223         inneriter                  += j_index_end - j_index_start;
2224
2225         /* Outer loop uses 18 flops */
2226     }
2227
2228     /* Increment number of outer iterations */
2229     outeriter        += nri;
2230
2231     /* Update outer/inner flops */
2232
2233     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*18 + inneriter*347);
2234 }