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