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