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