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