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