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