Use full path for legacyheaders
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sse2_single / nb_kernel_ElecRF_VdwCSTab_GeomW3W3_sse2_single.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*
36  * Note: this file was generated by the GROMACS sse2_single kernel generator.
37  */
38 #include "config.h"
39
40 #include <math.h>
41
42 #include "../nb_kernel.h"
43 #include "gromacs/legacyheaders/types/simple.h"
44 #include "gromacs/math/vec.h"
45 #include "gromacs/legacyheaders/nrnb.h"
46
47 #include "gromacs/simd/math_x86_sse2_single.h"
48 #include "kernelutil_x86_sse2_single.h"
49
50 /*
51  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwCSTab_GeomW3W3_VF_sse2_single
52  * Electrostatics interaction: ReactionField
53  * VdW interaction:            CubicSplineTable
54  * Geometry:                   Water3-Water3
55  * Calculate force/pot:        PotentialAndForce
56  */
57 void
58 nb_kernel_ElecRF_VdwCSTab_GeomW3W3_VF_sse2_single
59                     (t_nblist                    * gmx_restrict       nlist,
60                      rvec                        * gmx_restrict          xx,
61                      rvec                        * gmx_restrict          ff,
62                      t_forcerec                  * gmx_restrict          fr,
63                      t_mdatoms                   * gmx_restrict     mdatoms,
64                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
65                      t_nrnb                      * gmx_restrict        nrnb)
66 {
67     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or 
68      * just 0 for non-waters.
69      * Suffixes A,B,C,D refer to j loop unrolling done with SSE, e.g. for the four different
70      * jnr indices corresponding to data put in the four positions in the SIMD register.
71      */
72     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
73     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
74     int              jnrA,jnrB,jnrC,jnrD;
75     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
76     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
77     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
78     real             rcutoff_scalar;
79     real             *shiftvec,*fshift,*x,*f;
80     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD;
81     real             scratch[4*DIM];
82     __m128           tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
83     int              vdwioffset0;
84     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
85     int              vdwioffset1;
86     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
87     int              vdwioffset2;
88     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
89     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
90     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
91     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
92     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
93     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
94     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
95     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
96     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
97     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
98     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
99     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
100     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
101     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
102     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
103     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
104     __m128           velec,felec,velecsum,facel,crf,krf,krf2;
105     real             *charge;
106     int              nvdwtype;
107     __m128           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
108     int              *vdwtype;
109     real             *vdwparam;
110     __m128           one_sixth   = _mm_set1_ps(1.0/6.0);
111     __m128           one_twelfth = _mm_set1_ps(1.0/12.0);
112     __m128i          vfitab;
113     __m128i          ifour       = _mm_set1_epi32(4);
114     __m128           rt,vfeps,vftabscale,Y,F,G,H,Heps,Fp,VV,FF;
115     real             *vftab;
116     __m128           dummy_mask,cutoff_mask;
117     __m128           signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
118     __m128           one     = _mm_set1_ps(1.0);
119     __m128           two     = _mm_set1_ps(2.0);
120     x                = xx[0];
121     f                = ff[0];
122
123     nri              = nlist->nri;
124     iinr             = nlist->iinr;
125     jindex           = nlist->jindex;
126     jjnr             = nlist->jjnr;
127     shiftidx         = nlist->shift;
128     gid              = nlist->gid;
129     shiftvec         = fr->shift_vec[0];
130     fshift           = fr->fshift[0];
131     facel            = _mm_set1_ps(fr->epsfac);
132     charge           = mdatoms->chargeA;
133     krf              = _mm_set1_ps(fr->ic->k_rf);
134     krf2             = _mm_set1_ps(fr->ic->k_rf*2.0);
135     crf              = _mm_set1_ps(fr->ic->c_rf);
136     nvdwtype         = fr->ntype;
137     vdwparam         = fr->nbfp;
138     vdwtype          = mdatoms->typeA;
139
140     vftab            = kernel_data->table_vdw->data;
141     vftabscale       = _mm_set1_ps(kernel_data->table_vdw->scale);
142
143     /* Setup water-specific parameters */
144     inr              = nlist->iinr[0];
145     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
146     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
147     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
148     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
149
150     jq0              = _mm_set1_ps(charge[inr+0]);
151     jq1              = _mm_set1_ps(charge[inr+1]);
152     jq2              = _mm_set1_ps(charge[inr+2]);
153     vdwjidx0A        = 2*vdwtype[inr+0];
154     qq00             = _mm_mul_ps(iq0,jq0);
155     c6_00            = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
156     c12_00           = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
157     qq01             = _mm_mul_ps(iq0,jq1);
158     qq02             = _mm_mul_ps(iq0,jq2);
159     qq10             = _mm_mul_ps(iq1,jq0);
160     qq11             = _mm_mul_ps(iq1,jq1);
161     qq12             = _mm_mul_ps(iq1,jq2);
162     qq20             = _mm_mul_ps(iq2,jq0);
163     qq21             = _mm_mul_ps(iq2,jq1);
164     qq22             = _mm_mul_ps(iq2,jq2);
165
166     /* Avoid stupid compiler warnings */
167     jnrA = jnrB = jnrC = jnrD = 0;
168     j_coord_offsetA = 0;
169     j_coord_offsetB = 0;
170     j_coord_offsetC = 0;
171     j_coord_offsetD = 0;
172
173     outeriter        = 0;
174     inneriter        = 0;
175
176     for(iidx=0;iidx<4*DIM;iidx++)
177     {
178         scratch[iidx] = 0.0;
179     }  
180
181     /* Start outer loop over neighborlists */
182     for(iidx=0; iidx<nri; iidx++)
183     {
184         /* Load shift vector for this list */
185         i_shift_offset   = DIM*shiftidx[iidx];
186
187         /* Load limits for loop over neighbors */
188         j_index_start    = jindex[iidx];
189         j_index_end      = jindex[iidx+1];
190
191         /* Get outer coordinate index */
192         inr              = iinr[iidx];
193         i_coord_offset   = DIM*inr;
194
195         /* Load i particle coords and add shift vector */
196         gmx_mm_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
197                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
198         
199         fix0             = _mm_setzero_ps();
200         fiy0             = _mm_setzero_ps();
201         fiz0             = _mm_setzero_ps();
202         fix1             = _mm_setzero_ps();
203         fiy1             = _mm_setzero_ps();
204         fiz1             = _mm_setzero_ps();
205         fix2             = _mm_setzero_ps();
206         fiy2             = _mm_setzero_ps();
207         fiz2             = _mm_setzero_ps();
208
209         /* Reset potential sums */
210         velecsum         = _mm_setzero_ps();
211         vvdwsum          = _mm_setzero_ps();
212
213         /* Start inner kernel loop */
214         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
215         {
216
217             /* Get j neighbor index, and coordinate index */
218             jnrA             = jjnr[jidx];
219             jnrB             = jjnr[jidx+1];
220             jnrC             = jjnr[jidx+2];
221             jnrD             = jjnr[jidx+3];
222             j_coord_offsetA  = DIM*jnrA;
223             j_coord_offsetB  = DIM*jnrB;
224             j_coord_offsetC  = DIM*jnrC;
225             j_coord_offsetD  = DIM*jnrD;
226
227             /* load j atom coordinates */
228             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
229                                               x+j_coord_offsetC,x+j_coord_offsetD,
230                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
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             dx01             = _mm_sub_ps(ix0,jx1);
237             dy01             = _mm_sub_ps(iy0,jy1);
238             dz01             = _mm_sub_ps(iz0,jz1);
239             dx02             = _mm_sub_ps(ix0,jx2);
240             dy02             = _mm_sub_ps(iy0,jy2);
241             dz02             = _mm_sub_ps(iz0,jz2);
242             dx10             = _mm_sub_ps(ix1,jx0);
243             dy10             = _mm_sub_ps(iy1,jy0);
244             dz10             = _mm_sub_ps(iz1,jz0);
245             dx11             = _mm_sub_ps(ix1,jx1);
246             dy11             = _mm_sub_ps(iy1,jy1);
247             dz11             = _mm_sub_ps(iz1,jz1);
248             dx12             = _mm_sub_ps(ix1,jx2);
249             dy12             = _mm_sub_ps(iy1,jy2);
250             dz12             = _mm_sub_ps(iz1,jz2);
251             dx20             = _mm_sub_ps(ix2,jx0);
252             dy20             = _mm_sub_ps(iy2,jy0);
253             dz20             = _mm_sub_ps(iz2,jz0);
254             dx21             = _mm_sub_ps(ix2,jx1);
255             dy21             = _mm_sub_ps(iy2,jy1);
256             dz21             = _mm_sub_ps(iz2,jz1);
257             dx22             = _mm_sub_ps(ix2,jx2);
258             dy22             = _mm_sub_ps(iy2,jy2);
259             dz22             = _mm_sub_ps(iz2,jz2);
260
261             /* Calculate squared distance and things based on it */
262             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
263             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
264             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
265             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
266             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
267             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
268             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
269             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
270             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
271
272             rinv00           = gmx_mm_invsqrt_ps(rsq00);
273             rinv01           = gmx_mm_invsqrt_ps(rsq01);
274             rinv02           = gmx_mm_invsqrt_ps(rsq02);
275             rinv10           = gmx_mm_invsqrt_ps(rsq10);
276             rinv11           = gmx_mm_invsqrt_ps(rsq11);
277             rinv12           = gmx_mm_invsqrt_ps(rsq12);
278             rinv20           = gmx_mm_invsqrt_ps(rsq20);
279             rinv21           = gmx_mm_invsqrt_ps(rsq21);
280             rinv22           = gmx_mm_invsqrt_ps(rsq22);
281
282             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
283             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
284             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
285             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
286             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
287             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
288             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
289             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
290             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
291
292             fjx0             = _mm_setzero_ps();
293             fjy0             = _mm_setzero_ps();
294             fjz0             = _mm_setzero_ps();
295             fjx1             = _mm_setzero_ps();
296             fjy1             = _mm_setzero_ps();
297             fjz1             = _mm_setzero_ps();
298             fjx2             = _mm_setzero_ps();
299             fjy2             = _mm_setzero_ps();
300             fjz2             = _mm_setzero_ps();
301
302             /**************************
303              * CALCULATE INTERACTIONS *
304              **************************/
305
306             r00              = _mm_mul_ps(rsq00,rinv00);
307
308             /* Calculate table index by multiplying r with table scale and truncate to integer */
309             rt               = _mm_mul_ps(r00,vftabscale);
310             vfitab           = _mm_cvttps_epi32(rt);
311             vfeps            = _mm_sub_ps(rt,_mm_cvtepi32_ps(vfitab));
312             vfitab           = _mm_slli_epi32(vfitab,3);
313
314             /* REACTION-FIELD ELECTROSTATICS */
315             velec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_add_ps(rinv00,_mm_mul_ps(krf,rsq00)),crf));
316             felec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_mul_ps(rinv00,rinvsq00),krf2));
317
318             /* CUBIC SPLINE TABLE DISPERSION */
319             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
320             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
321             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
322             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
323             _MM_TRANSPOSE4_PS(Y,F,G,H);
324             Heps             = _mm_mul_ps(vfeps,H);
325             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
326             VV               = _mm_add_ps(Y,_mm_mul_ps(vfeps,Fp));
327             vvdw6            = _mm_mul_ps(c6_00,VV);
328             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
329             fvdw6            = _mm_mul_ps(c6_00,FF);
330
331             /* CUBIC SPLINE TABLE REPULSION */
332             vfitab           = _mm_add_epi32(vfitab,ifour);
333             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
334             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
335             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
336             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
337             _MM_TRANSPOSE4_PS(Y,F,G,H);
338             Heps             = _mm_mul_ps(vfeps,H);
339             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
340             VV               = _mm_add_ps(Y,_mm_mul_ps(vfeps,Fp));
341             vvdw12           = _mm_mul_ps(c12_00,VV);
342             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
343             fvdw12           = _mm_mul_ps(c12_00,FF);
344             vvdw             = _mm_add_ps(vvdw12,vvdw6);
345             fvdw             = _mm_xor_ps(signbit,_mm_mul_ps(_mm_add_ps(fvdw6,fvdw12),_mm_mul_ps(vftabscale,rinv00)));
346
347             /* Update potential sum for this i atom from the interaction with this j atom. */
348             velecsum         = _mm_add_ps(velecsum,velec);
349             vvdwsum          = _mm_add_ps(vvdwsum,vvdw);
350
351             fscal            = _mm_add_ps(felec,fvdw);
352
353             /* Calculate temporary vectorial force */
354             tx               = _mm_mul_ps(fscal,dx00);
355             ty               = _mm_mul_ps(fscal,dy00);
356             tz               = _mm_mul_ps(fscal,dz00);
357
358             /* Update vectorial force */
359             fix0             = _mm_add_ps(fix0,tx);
360             fiy0             = _mm_add_ps(fiy0,ty);
361             fiz0             = _mm_add_ps(fiz0,tz);
362
363             fjx0             = _mm_add_ps(fjx0,tx);
364             fjy0             = _mm_add_ps(fjy0,ty);
365             fjz0             = _mm_add_ps(fjz0,tz);
366             
367             /**************************
368              * CALCULATE INTERACTIONS *
369              **************************/
370
371             /* REACTION-FIELD ELECTROSTATICS */
372             velec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_add_ps(rinv01,_mm_mul_ps(krf,rsq01)),crf));
373             felec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_mul_ps(rinv01,rinvsq01),krf2));
374
375             /* Update potential sum for this i atom from the interaction with this j atom. */
376             velecsum         = _mm_add_ps(velecsum,velec);
377
378             fscal            = felec;
379
380             /* Calculate temporary vectorial force */
381             tx               = _mm_mul_ps(fscal,dx01);
382             ty               = _mm_mul_ps(fscal,dy01);
383             tz               = _mm_mul_ps(fscal,dz01);
384
385             /* Update vectorial force */
386             fix0             = _mm_add_ps(fix0,tx);
387             fiy0             = _mm_add_ps(fiy0,ty);
388             fiz0             = _mm_add_ps(fiz0,tz);
389
390             fjx1             = _mm_add_ps(fjx1,tx);
391             fjy1             = _mm_add_ps(fjy1,ty);
392             fjz1             = _mm_add_ps(fjz1,tz);
393             
394             /**************************
395              * CALCULATE INTERACTIONS *
396              **************************/
397
398             /* REACTION-FIELD ELECTROSTATICS */
399             velec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_add_ps(rinv02,_mm_mul_ps(krf,rsq02)),crf));
400             felec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_mul_ps(rinv02,rinvsq02),krf2));
401
402             /* Update potential sum for this i atom from the interaction with this j atom. */
403             velecsum         = _mm_add_ps(velecsum,velec);
404
405             fscal            = felec;
406
407             /* Calculate temporary vectorial force */
408             tx               = _mm_mul_ps(fscal,dx02);
409             ty               = _mm_mul_ps(fscal,dy02);
410             tz               = _mm_mul_ps(fscal,dz02);
411
412             /* Update vectorial force */
413             fix0             = _mm_add_ps(fix0,tx);
414             fiy0             = _mm_add_ps(fiy0,ty);
415             fiz0             = _mm_add_ps(fiz0,tz);
416
417             fjx2             = _mm_add_ps(fjx2,tx);
418             fjy2             = _mm_add_ps(fjy2,ty);
419             fjz2             = _mm_add_ps(fjz2,tz);
420             
421             /**************************
422              * CALCULATE INTERACTIONS *
423              **************************/
424
425             /* REACTION-FIELD ELECTROSTATICS */
426             velec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_add_ps(rinv10,_mm_mul_ps(krf,rsq10)),crf));
427             felec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_mul_ps(rinv10,rinvsq10),krf2));
428
429             /* Update potential sum for this i atom from the interaction with this j atom. */
430             velecsum         = _mm_add_ps(velecsum,velec);
431
432             fscal            = felec;
433
434             /* Calculate temporary vectorial force */
435             tx               = _mm_mul_ps(fscal,dx10);
436             ty               = _mm_mul_ps(fscal,dy10);
437             tz               = _mm_mul_ps(fscal,dz10);
438
439             /* Update vectorial force */
440             fix1             = _mm_add_ps(fix1,tx);
441             fiy1             = _mm_add_ps(fiy1,ty);
442             fiz1             = _mm_add_ps(fiz1,tz);
443
444             fjx0             = _mm_add_ps(fjx0,tx);
445             fjy0             = _mm_add_ps(fjy0,ty);
446             fjz0             = _mm_add_ps(fjz0,tz);
447             
448             /**************************
449              * CALCULATE INTERACTIONS *
450              **************************/
451
452             /* REACTION-FIELD ELECTROSTATICS */
453             velec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_add_ps(rinv11,_mm_mul_ps(krf,rsq11)),crf));
454             felec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_mul_ps(rinv11,rinvsq11),krf2));
455
456             /* Update potential sum for this i atom from the interaction with this j atom. */
457             velecsum         = _mm_add_ps(velecsum,velec);
458
459             fscal            = felec;
460
461             /* Calculate temporary vectorial force */
462             tx               = _mm_mul_ps(fscal,dx11);
463             ty               = _mm_mul_ps(fscal,dy11);
464             tz               = _mm_mul_ps(fscal,dz11);
465
466             /* Update vectorial force */
467             fix1             = _mm_add_ps(fix1,tx);
468             fiy1             = _mm_add_ps(fiy1,ty);
469             fiz1             = _mm_add_ps(fiz1,tz);
470
471             fjx1             = _mm_add_ps(fjx1,tx);
472             fjy1             = _mm_add_ps(fjy1,ty);
473             fjz1             = _mm_add_ps(fjz1,tz);
474             
475             /**************************
476              * CALCULATE INTERACTIONS *
477              **************************/
478
479             /* REACTION-FIELD ELECTROSTATICS */
480             velec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_add_ps(rinv12,_mm_mul_ps(krf,rsq12)),crf));
481             felec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_mul_ps(rinv12,rinvsq12),krf2));
482
483             /* Update potential sum for this i atom from the interaction with this j atom. */
484             velecsum         = _mm_add_ps(velecsum,velec);
485
486             fscal            = felec;
487
488             /* Calculate temporary vectorial force */
489             tx               = _mm_mul_ps(fscal,dx12);
490             ty               = _mm_mul_ps(fscal,dy12);
491             tz               = _mm_mul_ps(fscal,dz12);
492
493             /* Update vectorial force */
494             fix1             = _mm_add_ps(fix1,tx);
495             fiy1             = _mm_add_ps(fiy1,ty);
496             fiz1             = _mm_add_ps(fiz1,tz);
497
498             fjx2             = _mm_add_ps(fjx2,tx);
499             fjy2             = _mm_add_ps(fjy2,ty);
500             fjz2             = _mm_add_ps(fjz2,tz);
501             
502             /**************************
503              * CALCULATE INTERACTIONS *
504              **************************/
505
506             /* REACTION-FIELD ELECTROSTATICS */
507             velec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_add_ps(rinv20,_mm_mul_ps(krf,rsq20)),crf));
508             felec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_mul_ps(rinv20,rinvsq20),krf2));
509
510             /* Update potential sum for this i atom from the interaction with this j atom. */
511             velecsum         = _mm_add_ps(velecsum,velec);
512
513             fscal            = felec;
514
515             /* Calculate temporary vectorial force */
516             tx               = _mm_mul_ps(fscal,dx20);
517             ty               = _mm_mul_ps(fscal,dy20);
518             tz               = _mm_mul_ps(fscal,dz20);
519
520             /* Update vectorial force */
521             fix2             = _mm_add_ps(fix2,tx);
522             fiy2             = _mm_add_ps(fiy2,ty);
523             fiz2             = _mm_add_ps(fiz2,tz);
524
525             fjx0             = _mm_add_ps(fjx0,tx);
526             fjy0             = _mm_add_ps(fjy0,ty);
527             fjz0             = _mm_add_ps(fjz0,tz);
528             
529             /**************************
530              * CALCULATE INTERACTIONS *
531              **************************/
532
533             /* REACTION-FIELD ELECTROSTATICS */
534             velec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_add_ps(rinv21,_mm_mul_ps(krf,rsq21)),crf));
535             felec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_mul_ps(rinv21,rinvsq21),krf2));
536
537             /* Update potential sum for this i atom from the interaction with this j atom. */
538             velecsum         = _mm_add_ps(velecsum,velec);
539
540             fscal            = felec;
541
542             /* Calculate temporary vectorial force */
543             tx               = _mm_mul_ps(fscal,dx21);
544             ty               = _mm_mul_ps(fscal,dy21);
545             tz               = _mm_mul_ps(fscal,dz21);
546
547             /* Update vectorial force */
548             fix2             = _mm_add_ps(fix2,tx);
549             fiy2             = _mm_add_ps(fiy2,ty);
550             fiz2             = _mm_add_ps(fiz2,tz);
551
552             fjx1             = _mm_add_ps(fjx1,tx);
553             fjy1             = _mm_add_ps(fjy1,ty);
554             fjz1             = _mm_add_ps(fjz1,tz);
555             
556             /**************************
557              * CALCULATE INTERACTIONS *
558              **************************/
559
560             /* REACTION-FIELD ELECTROSTATICS */
561             velec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_add_ps(rinv22,_mm_mul_ps(krf,rsq22)),crf));
562             felec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_mul_ps(rinv22,rinvsq22),krf2));
563
564             /* Update potential sum for this i atom from the interaction with this j atom. */
565             velecsum         = _mm_add_ps(velecsum,velec);
566
567             fscal            = felec;
568
569             /* Calculate temporary vectorial force */
570             tx               = _mm_mul_ps(fscal,dx22);
571             ty               = _mm_mul_ps(fscal,dy22);
572             tz               = _mm_mul_ps(fscal,dz22);
573
574             /* Update vectorial force */
575             fix2             = _mm_add_ps(fix2,tx);
576             fiy2             = _mm_add_ps(fiy2,ty);
577             fiz2             = _mm_add_ps(fiz2,tz);
578
579             fjx2             = _mm_add_ps(fjx2,tx);
580             fjy2             = _mm_add_ps(fjy2,ty);
581             fjz2             = _mm_add_ps(fjz2,tz);
582             
583             fjptrA             = f+j_coord_offsetA;
584             fjptrB             = f+j_coord_offsetB;
585             fjptrC             = f+j_coord_offsetC;
586             fjptrD             = f+j_coord_offsetD;
587
588             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
589                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
590
591             /* Inner loop uses 323 flops */
592         }
593
594         if(jidx<j_index_end)
595         {
596
597             /* Get j neighbor index, and coordinate index */
598             jnrlistA         = jjnr[jidx];
599             jnrlistB         = jjnr[jidx+1];
600             jnrlistC         = jjnr[jidx+2];
601             jnrlistD         = jjnr[jidx+3];
602             /* Sign of each element will be negative for non-real atoms.
603              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
604              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
605              */
606             dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
607             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
608             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
609             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
610             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
611             j_coord_offsetA  = DIM*jnrA;
612             j_coord_offsetB  = DIM*jnrB;
613             j_coord_offsetC  = DIM*jnrC;
614             j_coord_offsetD  = DIM*jnrD;
615
616             /* load j atom coordinates */
617             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
618                                               x+j_coord_offsetC,x+j_coord_offsetD,
619                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
620
621             /* Calculate displacement vector */
622             dx00             = _mm_sub_ps(ix0,jx0);
623             dy00             = _mm_sub_ps(iy0,jy0);
624             dz00             = _mm_sub_ps(iz0,jz0);
625             dx01             = _mm_sub_ps(ix0,jx1);
626             dy01             = _mm_sub_ps(iy0,jy1);
627             dz01             = _mm_sub_ps(iz0,jz1);
628             dx02             = _mm_sub_ps(ix0,jx2);
629             dy02             = _mm_sub_ps(iy0,jy2);
630             dz02             = _mm_sub_ps(iz0,jz2);
631             dx10             = _mm_sub_ps(ix1,jx0);
632             dy10             = _mm_sub_ps(iy1,jy0);
633             dz10             = _mm_sub_ps(iz1,jz0);
634             dx11             = _mm_sub_ps(ix1,jx1);
635             dy11             = _mm_sub_ps(iy1,jy1);
636             dz11             = _mm_sub_ps(iz1,jz1);
637             dx12             = _mm_sub_ps(ix1,jx2);
638             dy12             = _mm_sub_ps(iy1,jy2);
639             dz12             = _mm_sub_ps(iz1,jz2);
640             dx20             = _mm_sub_ps(ix2,jx0);
641             dy20             = _mm_sub_ps(iy2,jy0);
642             dz20             = _mm_sub_ps(iz2,jz0);
643             dx21             = _mm_sub_ps(ix2,jx1);
644             dy21             = _mm_sub_ps(iy2,jy1);
645             dz21             = _mm_sub_ps(iz2,jz1);
646             dx22             = _mm_sub_ps(ix2,jx2);
647             dy22             = _mm_sub_ps(iy2,jy2);
648             dz22             = _mm_sub_ps(iz2,jz2);
649
650             /* Calculate squared distance and things based on it */
651             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
652             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
653             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
654             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
655             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
656             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
657             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
658             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
659             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
660
661             rinv00           = gmx_mm_invsqrt_ps(rsq00);
662             rinv01           = gmx_mm_invsqrt_ps(rsq01);
663             rinv02           = gmx_mm_invsqrt_ps(rsq02);
664             rinv10           = gmx_mm_invsqrt_ps(rsq10);
665             rinv11           = gmx_mm_invsqrt_ps(rsq11);
666             rinv12           = gmx_mm_invsqrt_ps(rsq12);
667             rinv20           = gmx_mm_invsqrt_ps(rsq20);
668             rinv21           = gmx_mm_invsqrt_ps(rsq21);
669             rinv22           = gmx_mm_invsqrt_ps(rsq22);
670
671             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
672             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
673             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
674             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
675             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
676             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
677             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
678             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
679             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
680
681             fjx0             = _mm_setzero_ps();
682             fjy0             = _mm_setzero_ps();
683             fjz0             = _mm_setzero_ps();
684             fjx1             = _mm_setzero_ps();
685             fjy1             = _mm_setzero_ps();
686             fjz1             = _mm_setzero_ps();
687             fjx2             = _mm_setzero_ps();
688             fjy2             = _mm_setzero_ps();
689             fjz2             = _mm_setzero_ps();
690
691             /**************************
692              * CALCULATE INTERACTIONS *
693              **************************/
694
695             r00              = _mm_mul_ps(rsq00,rinv00);
696             r00              = _mm_andnot_ps(dummy_mask,r00);
697
698             /* Calculate table index by multiplying r with table scale and truncate to integer */
699             rt               = _mm_mul_ps(r00,vftabscale);
700             vfitab           = _mm_cvttps_epi32(rt);
701             vfeps            = _mm_sub_ps(rt,_mm_cvtepi32_ps(vfitab));
702             vfitab           = _mm_slli_epi32(vfitab,3);
703
704             /* REACTION-FIELD ELECTROSTATICS */
705             velec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_add_ps(rinv00,_mm_mul_ps(krf,rsq00)),crf));
706             felec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_mul_ps(rinv00,rinvsq00),krf2));
707
708             /* CUBIC SPLINE TABLE DISPERSION */
709             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
710             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
711             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
712             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
713             _MM_TRANSPOSE4_PS(Y,F,G,H);
714             Heps             = _mm_mul_ps(vfeps,H);
715             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
716             VV               = _mm_add_ps(Y,_mm_mul_ps(vfeps,Fp));
717             vvdw6            = _mm_mul_ps(c6_00,VV);
718             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
719             fvdw6            = _mm_mul_ps(c6_00,FF);
720
721             /* CUBIC SPLINE TABLE REPULSION */
722             vfitab           = _mm_add_epi32(vfitab,ifour);
723             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
724             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
725             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
726             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
727             _MM_TRANSPOSE4_PS(Y,F,G,H);
728             Heps             = _mm_mul_ps(vfeps,H);
729             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
730             VV               = _mm_add_ps(Y,_mm_mul_ps(vfeps,Fp));
731             vvdw12           = _mm_mul_ps(c12_00,VV);
732             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
733             fvdw12           = _mm_mul_ps(c12_00,FF);
734             vvdw             = _mm_add_ps(vvdw12,vvdw6);
735             fvdw             = _mm_xor_ps(signbit,_mm_mul_ps(_mm_add_ps(fvdw6,fvdw12),_mm_mul_ps(vftabscale,rinv00)));
736
737             /* Update potential sum for this i atom from the interaction with this j atom. */
738             velec            = _mm_andnot_ps(dummy_mask,velec);
739             velecsum         = _mm_add_ps(velecsum,velec);
740             vvdw             = _mm_andnot_ps(dummy_mask,vvdw);
741             vvdwsum          = _mm_add_ps(vvdwsum,vvdw);
742
743             fscal            = _mm_add_ps(felec,fvdw);
744
745             fscal            = _mm_andnot_ps(dummy_mask,fscal);
746
747             /* Calculate temporary vectorial force */
748             tx               = _mm_mul_ps(fscal,dx00);
749             ty               = _mm_mul_ps(fscal,dy00);
750             tz               = _mm_mul_ps(fscal,dz00);
751
752             /* Update vectorial force */
753             fix0             = _mm_add_ps(fix0,tx);
754             fiy0             = _mm_add_ps(fiy0,ty);
755             fiz0             = _mm_add_ps(fiz0,tz);
756
757             fjx0             = _mm_add_ps(fjx0,tx);
758             fjy0             = _mm_add_ps(fjy0,ty);
759             fjz0             = _mm_add_ps(fjz0,tz);
760             
761             /**************************
762              * CALCULATE INTERACTIONS *
763              **************************/
764
765             /* REACTION-FIELD ELECTROSTATICS */
766             velec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_add_ps(rinv01,_mm_mul_ps(krf,rsq01)),crf));
767             felec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_mul_ps(rinv01,rinvsq01),krf2));
768
769             /* Update potential sum for this i atom from the interaction with this j atom. */
770             velec            = _mm_andnot_ps(dummy_mask,velec);
771             velecsum         = _mm_add_ps(velecsum,velec);
772
773             fscal            = felec;
774
775             fscal            = _mm_andnot_ps(dummy_mask,fscal);
776
777             /* Calculate temporary vectorial force */
778             tx               = _mm_mul_ps(fscal,dx01);
779             ty               = _mm_mul_ps(fscal,dy01);
780             tz               = _mm_mul_ps(fscal,dz01);
781
782             /* Update vectorial force */
783             fix0             = _mm_add_ps(fix0,tx);
784             fiy0             = _mm_add_ps(fiy0,ty);
785             fiz0             = _mm_add_ps(fiz0,tz);
786
787             fjx1             = _mm_add_ps(fjx1,tx);
788             fjy1             = _mm_add_ps(fjy1,ty);
789             fjz1             = _mm_add_ps(fjz1,tz);
790             
791             /**************************
792              * CALCULATE INTERACTIONS *
793              **************************/
794
795             /* REACTION-FIELD ELECTROSTATICS */
796             velec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_add_ps(rinv02,_mm_mul_ps(krf,rsq02)),crf));
797             felec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_mul_ps(rinv02,rinvsq02),krf2));
798
799             /* Update potential sum for this i atom from the interaction with this j atom. */
800             velec            = _mm_andnot_ps(dummy_mask,velec);
801             velecsum         = _mm_add_ps(velecsum,velec);
802
803             fscal            = felec;
804
805             fscal            = _mm_andnot_ps(dummy_mask,fscal);
806
807             /* Calculate temporary vectorial force */
808             tx               = _mm_mul_ps(fscal,dx02);
809             ty               = _mm_mul_ps(fscal,dy02);
810             tz               = _mm_mul_ps(fscal,dz02);
811
812             /* Update vectorial force */
813             fix0             = _mm_add_ps(fix0,tx);
814             fiy0             = _mm_add_ps(fiy0,ty);
815             fiz0             = _mm_add_ps(fiz0,tz);
816
817             fjx2             = _mm_add_ps(fjx2,tx);
818             fjy2             = _mm_add_ps(fjy2,ty);
819             fjz2             = _mm_add_ps(fjz2,tz);
820             
821             /**************************
822              * CALCULATE INTERACTIONS *
823              **************************/
824
825             /* REACTION-FIELD ELECTROSTATICS */
826             velec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_add_ps(rinv10,_mm_mul_ps(krf,rsq10)),crf));
827             felec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_mul_ps(rinv10,rinvsq10),krf2));
828
829             /* Update potential sum for this i atom from the interaction with this j atom. */
830             velec            = _mm_andnot_ps(dummy_mask,velec);
831             velecsum         = _mm_add_ps(velecsum,velec);
832
833             fscal            = felec;
834
835             fscal            = _mm_andnot_ps(dummy_mask,fscal);
836
837             /* Calculate temporary vectorial force */
838             tx               = _mm_mul_ps(fscal,dx10);
839             ty               = _mm_mul_ps(fscal,dy10);
840             tz               = _mm_mul_ps(fscal,dz10);
841
842             /* Update vectorial force */
843             fix1             = _mm_add_ps(fix1,tx);
844             fiy1             = _mm_add_ps(fiy1,ty);
845             fiz1             = _mm_add_ps(fiz1,tz);
846
847             fjx0             = _mm_add_ps(fjx0,tx);
848             fjy0             = _mm_add_ps(fjy0,ty);
849             fjz0             = _mm_add_ps(fjz0,tz);
850             
851             /**************************
852              * CALCULATE INTERACTIONS *
853              **************************/
854
855             /* REACTION-FIELD ELECTROSTATICS */
856             velec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_add_ps(rinv11,_mm_mul_ps(krf,rsq11)),crf));
857             felec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_mul_ps(rinv11,rinvsq11),krf2));
858
859             /* Update potential sum for this i atom from the interaction with this j atom. */
860             velec            = _mm_andnot_ps(dummy_mask,velec);
861             velecsum         = _mm_add_ps(velecsum,velec);
862
863             fscal            = felec;
864
865             fscal            = _mm_andnot_ps(dummy_mask,fscal);
866
867             /* Calculate temporary vectorial force */
868             tx               = _mm_mul_ps(fscal,dx11);
869             ty               = _mm_mul_ps(fscal,dy11);
870             tz               = _mm_mul_ps(fscal,dz11);
871
872             /* Update vectorial force */
873             fix1             = _mm_add_ps(fix1,tx);
874             fiy1             = _mm_add_ps(fiy1,ty);
875             fiz1             = _mm_add_ps(fiz1,tz);
876
877             fjx1             = _mm_add_ps(fjx1,tx);
878             fjy1             = _mm_add_ps(fjy1,ty);
879             fjz1             = _mm_add_ps(fjz1,tz);
880             
881             /**************************
882              * CALCULATE INTERACTIONS *
883              **************************/
884
885             /* REACTION-FIELD ELECTROSTATICS */
886             velec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_add_ps(rinv12,_mm_mul_ps(krf,rsq12)),crf));
887             felec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_mul_ps(rinv12,rinvsq12),krf2));
888
889             /* Update potential sum for this i atom from the interaction with this j atom. */
890             velec            = _mm_andnot_ps(dummy_mask,velec);
891             velecsum         = _mm_add_ps(velecsum,velec);
892
893             fscal            = felec;
894
895             fscal            = _mm_andnot_ps(dummy_mask,fscal);
896
897             /* Calculate temporary vectorial force */
898             tx               = _mm_mul_ps(fscal,dx12);
899             ty               = _mm_mul_ps(fscal,dy12);
900             tz               = _mm_mul_ps(fscal,dz12);
901
902             /* Update vectorial force */
903             fix1             = _mm_add_ps(fix1,tx);
904             fiy1             = _mm_add_ps(fiy1,ty);
905             fiz1             = _mm_add_ps(fiz1,tz);
906
907             fjx2             = _mm_add_ps(fjx2,tx);
908             fjy2             = _mm_add_ps(fjy2,ty);
909             fjz2             = _mm_add_ps(fjz2,tz);
910             
911             /**************************
912              * CALCULATE INTERACTIONS *
913              **************************/
914
915             /* REACTION-FIELD ELECTROSTATICS */
916             velec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_add_ps(rinv20,_mm_mul_ps(krf,rsq20)),crf));
917             felec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_mul_ps(rinv20,rinvsq20),krf2));
918
919             /* Update potential sum for this i atom from the interaction with this j atom. */
920             velec            = _mm_andnot_ps(dummy_mask,velec);
921             velecsum         = _mm_add_ps(velecsum,velec);
922
923             fscal            = felec;
924
925             fscal            = _mm_andnot_ps(dummy_mask,fscal);
926
927             /* Calculate temporary vectorial force */
928             tx               = _mm_mul_ps(fscal,dx20);
929             ty               = _mm_mul_ps(fscal,dy20);
930             tz               = _mm_mul_ps(fscal,dz20);
931
932             /* Update vectorial force */
933             fix2             = _mm_add_ps(fix2,tx);
934             fiy2             = _mm_add_ps(fiy2,ty);
935             fiz2             = _mm_add_ps(fiz2,tz);
936
937             fjx0             = _mm_add_ps(fjx0,tx);
938             fjy0             = _mm_add_ps(fjy0,ty);
939             fjz0             = _mm_add_ps(fjz0,tz);
940             
941             /**************************
942              * CALCULATE INTERACTIONS *
943              **************************/
944
945             /* REACTION-FIELD ELECTROSTATICS */
946             velec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_add_ps(rinv21,_mm_mul_ps(krf,rsq21)),crf));
947             felec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_mul_ps(rinv21,rinvsq21),krf2));
948
949             /* Update potential sum for this i atom from the interaction with this j atom. */
950             velec            = _mm_andnot_ps(dummy_mask,velec);
951             velecsum         = _mm_add_ps(velecsum,velec);
952
953             fscal            = felec;
954
955             fscal            = _mm_andnot_ps(dummy_mask,fscal);
956
957             /* Calculate temporary vectorial force */
958             tx               = _mm_mul_ps(fscal,dx21);
959             ty               = _mm_mul_ps(fscal,dy21);
960             tz               = _mm_mul_ps(fscal,dz21);
961
962             /* Update vectorial force */
963             fix2             = _mm_add_ps(fix2,tx);
964             fiy2             = _mm_add_ps(fiy2,ty);
965             fiz2             = _mm_add_ps(fiz2,tz);
966
967             fjx1             = _mm_add_ps(fjx1,tx);
968             fjy1             = _mm_add_ps(fjy1,ty);
969             fjz1             = _mm_add_ps(fjz1,tz);
970             
971             /**************************
972              * CALCULATE INTERACTIONS *
973              **************************/
974
975             /* REACTION-FIELD ELECTROSTATICS */
976             velec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_add_ps(rinv22,_mm_mul_ps(krf,rsq22)),crf));
977             felec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_mul_ps(rinv22,rinvsq22),krf2));
978
979             /* Update potential sum for this i atom from the interaction with this j atom. */
980             velec            = _mm_andnot_ps(dummy_mask,velec);
981             velecsum         = _mm_add_ps(velecsum,velec);
982
983             fscal            = felec;
984
985             fscal            = _mm_andnot_ps(dummy_mask,fscal);
986
987             /* Calculate temporary vectorial force */
988             tx               = _mm_mul_ps(fscal,dx22);
989             ty               = _mm_mul_ps(fscal,dy22);
990             tz               = _mm_mul_ps(fscal,dz22);
991
992             /* Update vectorial force */
993             fix2             = _mm_add_ps(fix2,tx);
994             fiy2             = _mm_add_ps(fiy2,ty);
995             fiz2             = _mm_add_ps(fiz2,tz);
996
997             fjx2             = _mm_add_ps(fjx2,tx);
998             fjy2             = _mm_add_ps(fjy2,ty);
999             fjz2             = _mm_add_ps(fjz2,tz);
1000             
1001             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
1002             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
1003             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
1004             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
1005
1006             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1007                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1008
1009             /* Inner loop uses 324 flops */
1010         }
1011
1012         /* End of innermost loop */
1013
1014         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1015                                               f+i_coord_offset,fshift+i_shift_offset);
1016
1017         ggid                        = gid[iidx];
1018         /* Update potential energies */
1019         gmx_mm_update_1pot_ps(velecsum,kernel_data->energygrp_elec+ggid);
1020         gmx_mm_update_1pot_ps(vvdwsum,kernel_data->energygrp_vdw+ggid);
1021
1022         /* Increment number of inner iterations */
1023         inneriter                  += j_index_end - j_index_start;
1024
1025         /* Outer loop uses 20 flops */
1026     }
1027
1028     /* Increment number of outer iterations */
1029     outeriter        += nri;
1030
1031     /* Update outer/inner flops */
1032
1033     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*20 + inneriter*324);
1034 }
1035 /*
1036  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwCSTab_GeomW3W3_F_sse2_single
1037  * Electrostatics interaction: ReactionField
1038  * VdW interaction:            CubicSplineTable
1039  * Geometry:                   Water3-Water3
1040  * Calculate force/pot:        Force
1041  */
1042 void
1043 nb_kernel_ElecRF_VdwCSTab_GeomW3W3_F_sse2_single
1044                     (t_nblist                    * gmx_restrict       nlist,
1045                      rvec                        * gmx_restrict          xx,
1046                      rvec                        * gmx_restrict          ff,
1047                      t_forcerec                  * gmx_restrict          fr,
1048                      t_mdatoms                   * gmx_restrict     mdatoms,
1049                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
1050                      t_nrnb                      * gmx_restrict        nrnb)
1051 {
1052     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or 
1053      * just 0 for non-waters.
1054      * Suffixes A,B,C,D refer to j loop unrolling done with SSE, e.g. for the four different
1055      * jnr indices corresponding to data put in the four positions in the SIMD register.
1056      */
1057     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
1058     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1059     int              jnrA,jnrB,jnrC,jnrD;
1060     int              jnrlistA,jnrlistB,jnrlistC,jnrlistD;
1061     int              j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
1062     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
1063     real             rcutoff_scalar;
1064     real             *shiftvec,*fshift,*x,*f;
1065     real             *fjptrA,*fjptrB,*fjptrC,*fjptrD;
1066     real             scratch[4*DIM];
1067     __m128           tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
1068     int              vdwioffset0;
1069     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1070     int              vdwioffset1;
1071     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1072     int              vdwioffset2;
1073     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1074     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
1075     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1076     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
1077     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1078     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
1079     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1080     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1081     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
1082     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
1083     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
1084     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1085     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1086     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
1087     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1088     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1089     __m128           velec,felec,velecsum,facel,crf,krf,krf2;
1090     real             *charge;
1091     int              nvdwtype;
1092     __m128           rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1093     int              *vdwtype;
1094     real             *vdwparam;
1095     __m128           one_sixth   = _mm_set1_ps(1.0/6.0);
1096     __m128           one_twelfth = _mm_set1_ps(1.0/12.0);
1097     __m128i          vfitab;
1098     __m128i          ifour       = _mm_set1_epi32(4);
1099     __m128           rt,vfeps,vftabscale,Y,F,G,H,Heps,Fp,VV,FF;
1100     real             *vftab;
1101     __m128           dummy_mask,cutoff_mask;
1102     __m128           signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
1103     __m128           one     = _mm_set1_ps(1.0);
1104     __m128           two     = _mm_set1_ps(2.0);
1105     x                = xx[0];
1106     f                = ff[0];
1107
1108     nri              = nlist->nri;
1109     iinr             = nlist->iinr;
1110     jindex           = nlist->jindex;
1111     jjnr             = nlist->jjnr;
1112     shiftidx         = nlist->shift;
1113     gid              = nlist->gid;
1114     shiftvec         = fr->shift_vec[0];
1115     fshift           = fr->fshift[0];
1116     facel            = _mm_set1_ps(fr->epsfac);
1117     charge           = mdatoms->chargeA;
1118     krf              = _mm_set1_ps(fr->ic->k_rf);
1119     krf2             = _mm_set1_ps(fr->ic->k_rf*2.0);
1120     crf              = _mm_set1_ps(fr->ic->c_rf);
1121     nvdwtype         = fr->ntype;
1122     vdwparam         = fr->nbfp;
1123     vdwtype          = mdatoms->typeA;
1124
1125     vftab            = kernel_data->table_vdw->data;
1126     vftabscale       = _mm_set1_ps(kernel_data->table_vdw->scale);
1127
1128     /* Setup water-specific parameters */
1129     inr              = nlist->iinr[0];
1130     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
1131     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
1132     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
1133     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
1134
1135     jq0              = _mm_set1_ps(charge[inr+0]);
1136     jq1              = _mm_set1_ps(charge[inr+1]);
1137     jq2              = _mm_set1_ps(charge[inr+2]);
1138     vdwjidx0A        = 2*vdwtype[inr+0];
1139     qq00             = _mm_mul_ps(iq0,jq0);
1140     c6_00            = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
1141     c12_00           = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
1142     qq01             = _mm_mul_ps(iq0,jq1);
1143     qq02             = _mm_mul_ps(iq0,jq2);
1144     qq10             = _mm_mul_ps(iq1,jq0);
1145     qq11             = _mm_mul_ps(iq1,jq1);
1146     qq12             = _mm_mul_ps(iq1,jq2);
1147     qq20             = _mm_mul_ps(iq2,jq0);
1148     qq21             = _mm_mul_ps(iq2,jq1);
1149     qq22             = _mm_mul_ps(iq2,jq2);
1150
1151     /* Avoid stupid compiler warnings */
1152     jnrA = jnrB = jnrC = jnrD = 0;
1153     j_coord_offsetA = 0;
1154     j_coord_offsetB = 0;
1155     j_coord_offsetC = 0;
1156     j_coord_offsetD = 0;
1157
1158     outeriter        = 0;
1159     inneriter        = 0;
1160
1161     for(iidx=0;iidx<4*DIM;iidx++)
1162     {
1163         scratch[iidx] = 0.0;
1164     }  
1165
1166     /* Start outer loop over neighborlists */
1167     for(iidx=0; iidx<nri; iidx++)
1168     {
1169         /* Load shift vector for this list */
1170         i_shift_offset   = DIM*shiftidx[iidx];
1171
1172         /* Load limits for loop over neighbors */
1173         j_index_start    = jindex[iidx];
1174         j_index_end      = jindex[iidx+1];
1175
1176         /* Get outer coordinate index */
1177         inr              = iinr[iidx];
1178         i_coord_offset   = DIM*inr;
1179
1180         /* Load i particle coords and add shift vector */
1181         gmx_mm_load_shift_and_3rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
1182                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
1183         
1184         fix0             = _mm_setzero_ps();
1185         fiy0             = _mm_setzero_ps();
1186         fiz0             = _mm_setzero_ps();
1187         fix1             = _mm_setzero_ps();
1188         fiy1             = _mm_setzero_ps();
1189         fiz1             = _mm_setzero_ps();
1190         fix2             = _mm_setzero_ps();
1191         fiy2             = _mm_setzero_ps();
1192         fiz2             = _mm_setzero_ps();
1193
1194         /* Start inner kernel loop */
1195         for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
1196         {
1197
1198             /* Get j neighbor index, and coordinate index */
1199             jnrA             = jjnr[jidx];
1200             jnrB             = jjnr[jidx+1];
1201             jnrC             = jjnr[jidx+2];
1202             jnrD             = jjnr[jidx+3];
1203             j_coord_offsetA  = DIM*jnrA;
1204             j_coord_offsetB  = DIM*jnrB;
1205             j_coord_offsetC  = DIM*jnrC;
1206             j_coord_offsetD  = DIM*jnrD;
1207
1208             /* load j atom coordinates */
1209             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1210                                               x+j_coord_offsetC,x+j_coord_offsetD,
1211                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1212
1213             /* Calculate displacement vector */
1214             dx00             = _mm_sub_ps(ix0,jx0);
1215             dy00             = _mm_sub_ps(iy0,jy0);
1216             dz00             = _mm_sub_ps(iz0,jz0);
1217             dx01             = _mm_sub_ps(ix0,jx1);
1218             dy01             = _mm_sub_ps(iy0,jy1);
1219             dz01             = _mm_sub_ps(iz0,jz1);
1220             dx02             = _mm_sub_ps(ix0,jx2);
1221             dy02             = _mm_sub_ps(iy0,jy2);
1222             dz02             = _mm_sub_ps(iz0,jz2);
1223             dx10             = _mm_sub_ps(ix1,jx0);
1224             dy10             = _mm_sub_ps(iy1,jy0);
1225             dz10             = _mm_sub_ps(iz1,jz0);
1226             dx11             = _mm_sub_ps(ix1,jx1);
1227             dy11             = _mm_sub_ps(iy1,jy1);
1228             dz11             = _mm_sub_ps(iz1,jz1);
1229             dx12             = _mm_sub_ps(ix1,jx2);
1230             dy12             = _mm_sub_ps(iy1,jy2);
1231             dz12             = _mm_sub_ps(iz1,jz2);
1232             dx20             = _mm_sub_ps(ix2,jx0);
1233             dy20             = _mm_sub_ps(iy2,jy0);
1234             dz20             = _mm_sub_ps(iz2,jz0);
1235             dx21             = _mm_sub_ps(ix2,jx1);
1236             dy21             = _mm_sub_ps(iy2,jy1);
1237             dz21             = _mm_sub_ps(iz2,jz1);
1238             dx22             = _mm_sub_ps(ix2,jx2);
1239             dy22             = _mm_sub_ps(iy2,jy2);
1240             dz22             = _mm_sub_ps(iz2,jz2);
1241
1242             /* Calculate squared distance and things based on it */
1243             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1244             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
1245             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
1246             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
1247             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1248             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1249             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
1250             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1251             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1252
1253             rinv00           = gmx_mm_invsqrt_ps(rsq00);
1254             rinv01           = gmx_mm_invsqrt_ps(rsq01);
1255             rinv02           = gmx_mm_invsqrt_ps(rsq02);
1256             rinv10           = gmx_mm_invsqrt_ps(rsq10);
1257             rinv11           = gmx_mm_invsqrt_ps(rsq11);
1258             rinv12           = gmx_mm_invsqrt_ps(rsq12);
1259             rinv20           = gmx_mm_invsqrt_ps(rsq20);
1260             rinv21           = gmx_mm_invsqrt_ps(rsq21);
1261             rinv22           = gmx_mm_invsqrt_ps(rsq22);
1262
1263             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
1264             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
1265             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
1266             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
1267             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
1268             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
1269             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
1270             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
1271             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
1272
1273             fjx0             = _mm_setzero_ps();
1274             fjy0             = _mm_setzero_ps();
1275             fjz0             = _mm_setzero_ps();
1276             fjx1             = _mm_setzero_ps();
1277             fjy1             = _mm_setzero_ps();
1278             fjz1             = _mm_setzero_ps();
1279             fjx2             = _mm_setzero_ps();
1280             fjy2             = _mm_setzero_ps();
1281             fjz2             = _mm_setzero_ps();
1282
1283             /**************************
1284              * CALCULATE INTERACTIONS *
1285              **************************/
1286
1287             r00              = _mm_mul_ps(rsq00,rinv00);
1288
1289             /* Calculate table index by multiplying r with table scale and truncate to integer */
1290             rt               = _mm_mul_ps(r00,vftabscale);
1291             vfitab           = _mm_cvttps_epi32(rt);
1292             vfeps            = _mm_sub_ps(rt,_mm_cvtepi32_ps(vfitab));
1293             vfitab           = _mm_slli_epi32(vfitab,3);
1294
1295             /* REACTION-FIELD ELECTROSTATICS */
1296             felec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_mul_ps(rinv00,rinvsq00),krf2));
1297
1298             /* CUBIC SPLINE TABLE DISPERSION */
1299             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
1300             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
1301             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
1302             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
1303             _MM_TRANSPOSE4_PS(Y,F,G,H);
1304             Heps             = _mm_mul_ps(vfeps,H);
1305             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
1306             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
1307             fvdw6            = _mm_mul_ps(c6_00,FF);
1308
1309             /* CUBIC SPLINE TABLE REPULSION */
1310             vfitab           = _mm_add_epi32(vfitab,ifour);
1311             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
1312             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
1313             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
1314             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
1315             _MM_TRANSPOSE4_PS(Y,F,G,H);
1316             Heps             = _mm_mul_ps(vfeps,H);
1317             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
1318             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
1319             fvdw12           = _mm_mul_ps(c12_00,FF);
1320             fvdw             = _mm_xor_ps(signbit,_mm_mul_ps(_mm_add_ps(fvdw6,fvdw12),_mm_mul_ps(vftabscale,rinv00)));
1321
1322             fscal            = _mm_add_ps(felec,fvdw);
1323
1324             /* Calculate temporary vectorial force */
1325             tx               = _mm_mul_ps(fscal,dx00);
1326             ty               = _mm_mul_ps(fscal,dy00);
1327             tz               = _mm_mul_ps(fscal,dz00);
1328
1329             /* Update vectorial force */
1330             fix0             = _mm_add_ps(fix0,tx);
1331             fiy0             = _mm_add_ps(fiy0,ty);
1332             fiz0             = _mm_add_ps(fiz0,tz);
1333
1334             fjx0             = _mm_add_ps(fjx0,tx);
1335             fjy0             = _mm_add_ps(fjy0,ty);
1336             fjz0             = _mm_add_ps(fjz0,tz);
1337             
1338             /**************************
1339              * CALCULATE INTERACTIONS *
1340              **************************/
1341
1342             /* REACTION-FIELD ELECTROSTATICS */
1343             felec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_mul_ps(rinv01,rinvsq01),krf2));
1344
1345             fscal            = felec;
1346
1347             /* Calculate temporary vectorial force */
1348             tx               = _mm_mul_ps(fscal,dx01);
1349             ty               = _mm_mul_ps(fscal,dy01);
1350             tz               = _mm_mul_ps(fscal,dz01);
1351
1352             /* Update vectorial force */
1353             fix0             = _mm_add_ps(fix0,tx);
1354             fiy0             = _mm_add_ps(fiy0,ty);
1355             fiz0             = _mm_add_ps(fiz0,tz);
1356
1357             fjx1             = _mm_add_ps(fjx1,tx);
1358             fjy1             = _mm_add_ps(fjy1,ty);
1359             fjz1             = _mm_add_ps(fjz1,tz);
1360             
1361             /**************************
1362              * CALCULATE INTERACTIONS *
1363              **************************/
1364
1365             /* REACTION-FIELD ELECTROSTATICS */
1366             felec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_mul_ps(rinv02,rinvsq02),krf2));
1367
1368             fscal            = felec;
1369
1370             /* Calculate temporary vectorial force */
1371             tx               = _mm_mul_ps(fscal,dx02);
1372             ty               = _mm_mul_ps(fscal,dy02);
1373             tz               = _mm_mul_ps(fscal,dz02);
1374
1375             /* Update vectorial force */
1376             fix0             = _mm_add_ps(fix0,tx);
1377             fiy0             = _mm_add_ps(fiy0,ty);
1378             fiz0             = _mm_add_ps(fiz0,tz);
1379
1380             fjx2             = _mm_add_ps(fjx2,tx);
1381             fjy2             = _mm_add_ps(fjy2,ty);
1382             fjz2             = _mm_add_ps(fjz2,tz);
1383             
1384             /**************************
1385              * CALCULATE INTERACTIONS *
1386              **************************/
1387
1388             /* REACTION-FIELD ELECTROSTATICS */
1389             felec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_mul_ps(rinv10,rinvsq10),krf2));
1390
1391             fscal            = felec;
1392
1393             /* Calculate temporary vectorial force */
1394             tx               = _mm_mul_ps(fscal,dx10);
1395             ty               = _mm_mul_ps(fscal,dy10);
1396             tz               = _mm_mul_ps(fscal,dz10);
1397
1398             /* Update vectorial force */
1399             fix1             = _mm_add_ps(fix1,tx);
1400             fiy1             = _mm_add_ps(fiy1,ty);
1401             fiz1             = _mm_add_ps(fiz1,tz);
1402
1403             fjx0             = _mm_add_ps(fjx0,tx);
1404             fjy0             = _mm_add_ps(fjy0,ty);
1405             fjz0             = _mm_add_ps(fjz0,tz);
1406             
1407             /**************************
1408              * CALCULATE INTERACTIONS *
1409              **************************/
1410
1411             /* REACTION-FIELD ELECTROSTATICS */
1412             felec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_mul_ps(rinv11,rinvsq11),krf2));
1413
1414             fscal            = felec;
1415
1416             /* Calculate temporary vectorial force */
1417             tx               = _mm_mul_ps(fscal,dx11);
1418             ty               = _mm_mul_ps(fscal,dy11);
1419             tz               = _mm_mul_ps(fscal,dz11);
1420
1421             /* Update vectorial force */
1422             fix1             = _mm_add_ps(fix1,tx);
1423             fiy1             = _mm_add_ps(fiy1,ty);
1424             fiz1             = _mm_add_ps(fiz1,tz);
1425
1426             fjx1             = _mm_add_ps(fjx1,tx);
1427             fjy1             = _mm_add_ps(fjy1,ty);
1428             fjz1             = _mm_add_ps(fjz1,tz);
1429             
1430             /**************************
1431              * CALCULATE INTERACTIONS *
1432              **************************/
1433
1434             /* REACTION-FIELD ELECTROSTATICS */
1435             felec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_mul_ps(rinv12,rinvsq12),krf2));
1436
1437             fscal            = felec;
1438
1439             /* Calculate temporary vectorial force */
1440             tx               = _mm_mul_ps(fscal,dx12);
1441             ty               = _mm_mul_ps(fscal,dy12);
1442             tz               = _mm_mul_ps(fscal,dz12);
1443
1444             /* Update vectorial force */
1445             fix1             = _mm_add_ps(fix1,tx);
1446             fiy1             = _mm_add_ps(fiy1,ty);
1447             fiz1             = _mm_add_ps(fiz1,tz);
1448
1449             fjx2             = _mm_add_ps(fjx2,tx);
1450             fjy2             = _mm_add_ps(fjy2,ty);
1451             fjz2             = _mm_add_ps(fjz2,tz);
1452             
1453             /**************************
1454              * CALCULATE INTERACTIONS *
1455              **************************/
1456
1457             /* REACTION-FIELD ELECTROSTATICS */
1458             felec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_mul_ps(rinv20,rinvsq20),krf2));
1459
1460             fscal            = felec;
1461
1462             /* Calculate temporary vectorial force */
1463             tx               = _mm_mul_ps(fscal,dx20);
1464             ty               = _mm_mul_ps(fscal,dy20);
1465             tz               = _mm_mul_ps(fscal,dz20);
1466
1467             /* Update vectorial force */
1468             fix2             = _mm_add_ps(fix2,tx);
1469             fiy2             = _mm_add_ps(fiy2,ty);
1470             fiz2             = _mm_add_ps(fiz2,tz);
1471
1472             fjx0             = _mm_add_ps(fjx0,tx);
1473             fjy0             = _mm_add_ps(fjy0,ty);
1474             fjz0             = _mm_add_ps(fjz0,tz);
1475             
1476             /**************************
1477              * CALCULATE INTERACTIONS *
1478              **************************/
1479
1480             /* REACTION-FIELD ELECTROSTATICS */
1481             felec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_mul_ps(rinv21,rinvsq21),krf2));
1482
1483             fscal            = felec;
1484
1485             /* Calculate temporary vectorial force */
1486             tx               = _mm_mul_ps(fscal,dx21);
1487             ty               = _mm_mul_ps(fscal,dy21);
1488             tz               = _mm_mul_ps(fscal,dz21);
1489
1490             /* Update vectorial force */
1491             fix2             = _mm_add_ps(fix2,tx);
1492             fiy2             = _mm_add_ps(fiy2,ty);
1493             fiz2             = _mm_add_ps(fiz2,tz);
1494
1495             fjx1             = _mm_add_ps(fjx1,tx);
1496             fjy1             = _mm_add_ps(fjy1,ty);
1497             fjz1             = _mm_add_ps(fjz1,tz);
1498             
1499             /**************************
1500              * CALCULATE INTERACTIONS *
1501              **************************/
1502
1503             /* REACTION-FIELD ELECTROSTATICS */
1504             felec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_mul_ps(rinv22,rinvsq22),krf2));
1505
1506             fscal            = felec;
1507
1508             /* Calculate temporary vectorial force */
1509             tx               = _mm_mul_ps(fscal,dx22);
1510             ty               = _mm_mul_ps(fscal,dy22);
1511             tz               = _mm_mul_ps(fscal,dz22);
1512
1513             /* Update vectorial force */
1514             fix2             = _mm_add_ps(fix2,tx);
1515             fiy2             = _mm_add_ps(fiy2,ty);
1516             fiz2             = _mm_add_ps(fiz2,tz);
1517
1518             fjx2             = _mm_add_ps(fjx2,tx);
1519             fjy2             = _mm_add_ps(fjy2,ty);
1520             fjz2             = _mm_add_ps(fjz2,tz);
1521             
1522             fjptrA             = f+j_coord_offsetA;
1523             fjptrB             = f+j_coord_offsetB;
1524             fjptrC             = f+j_coord_offsetC;
1525             fjptrD             = f+j_coord_offsetD;
1526
1527             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1528                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1529
1530             /* Inner loop uses 270 flops */
1531         }
1532
1533         if(jidx<j_index_end)
1534         {
1535
1536             /* Get j neighbor index, and coordinate index */
1537             jnrlistA         = jjnr[jidx];
1538             jnrlistB         = jjnr[jidx+1];
1539             jnrlistC         = jjnr[jidx+2];
1540             jnrlistD         = jjnr[jidx+3];
1541             /* Sign of each element will be negative for non-real atoms.
1542              * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
1543              * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
1544              */
1545             dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
1546             jnrA       = (jnrlistA>=0) ? jnrlistA : 0;
1547             jnrB       = (jnrlistB>=0) ? jnrlistB : 0;
1548             jnrC       = (jnrlistC>=0) ? jnrlistC : 0;
1549             jnrD       = (jnrlistD>=0) ? jnrlistD : 0;
1550             j_coord_offsetA  = DIM*jnrA;
1551             j_coord_offsetB  = DIM*jnrB;
1552             j_coord_offsetC  = DIM*jnrC;
1553             j_coord_offsetD  = DIM*jnrD;
1554
1555             /* load j atom coordinates */
1556             gmx_mm_load_3rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1557                                               x+j_coord_offsetC,x+j_coord_offsetD,
1558                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1559
1560             /* Calculate displacement vector */
1561             dx00             = _mm_sub_ps(ix0,jx0);
1562             dy00             = _mm_sub_ps(iy0,jy0);
1563             dz00             = _mm_sub_ps(iz0,jz0);
1564             dx01             = _mm_sub_ps(ix0,jx1);
1565             dy01             = _mm_sub_ps(iy0,jy1);
1566             dz01             = _mm_sub_ps(iz0,jz1);
1567             dx02             = _mm_sub_ps(ix0,jx2);
1568             dy02             = _mm_sub_ps(iy0,jy2);
1569             dz02             = _mm_sub_ps(iz0,jz2);
1570             dx10             = _mm_sub_ps(ix1,jx0);
1571             dy10             = _mm_sub_ps(iy1,jy0);
1572             dz10             = _mm_sub_ps(iz1,jz0);
1573             dx11             = _mm_sub_ps(ix1,jx1);
1574             dy11             = _mm_sub_ps(iy1,jy1);
1575             dz11             = _mm_sub_ps(iz1,jz1);
1576             dx12             = _mm_sub_ps(ix1,jx2);
1577             dy12             = _mm_sub_ps(iy1,jy2);
1578             dz12             = _mm_sub_ps(iz1,jz2);
1579             dx20             = _mm_sub_ps(ix2,jx0);
1580             dy20             = _mm_sub_ps(iy2,jy0);
1581             dz20             = _mm_sub_ps(iz2,jz0);
1582             dx21             = _mm_sub_ps(ix2,jx1);
1583             dy21             = _mm_sub_ps(iy2,jy1);
1584             dz21             = _mm_sub_ps(iz2,jz1);
1585             dx22             = _mm_sub_ps(ix2,jx2);
1586             dy22             = _mm_sub_ps(iy2,jy2);
1587             dz22             = _mm_sub_ps(iz2,jz2);
1588
1589             /* Calculate squared distance and things based on it */
1590             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1591             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
1592             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
1593             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
1594             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1595             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1596             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
1597             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1598             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1599
1600             rinv00           = gmx_mm_invsqrt_ps(rsq00);
1601             rinv01           = gmx_mm_invsqrt_ps(rsq01);
1602             rinv02           = gmx_mm_invsqrt_ps(rsq02);
1603             rinv10           = gmx_mm_invsqrt_ps(rsq10);
1604             rinv11           = gmx_mm_invsqrt_ps(rsq11);
1605             rinv12           = gmx_mm_invsqrt_ps(rsq12);
1606             rinv20           = gmx_mm_invsqrt_ps(rsq20);
1607             rinv21           = gmx_mm_invsqrt_ps(rsq21);
1608             rinv22           = gmx_mm_invsqrt_ps(rsq22);
1609
1610             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
1611             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
1612             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
1613             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
1614             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
1615             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
1616             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
1617             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
1618             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
1619
1620             fjx0             = _mm_setzero_ps();
1621             fjy0             = _mm_setzero_ps();
1622             fjz0             = _mm_setzero_ps();
1623             fjx1             = _mm_setzero_ps();
1624             fjy1             = _mm_setzero_ps();
1625             fjz1             = _mm_setzero_ps();
1626             fjx2             = _mm_setzero_ps();
1627             fjy2             = _mm_setzero_ps();
1628             fjz2             = _mm_setzero_ps();
1629
1630             /**************************
1631              * CALCULATE INTERACTIONS *
1632              **************************/
1633
1634             r00              = _mm_mul_ps(rsq00,rinv00);
1635             r00              = _mm_andnot_ps(dummy_mask,r00);
1636
1637             /* Calculate table index by multiplying r with table scale and truncate to integer */
1638             rt               = _mm_mul_ps(r00,vftabscale);
1639             vfitab           = _mm_cvttps_epi32(rt);
1640             vfeps            = _mm_sub_ps(rt,_mm_cvtepi32_ps(vfitab));
1641             vfitab           = _mm_slli_epi32(vfitab,3);
1642
1643             /* REACTION-FIELD ELECTROSTATICS */
1644             felec            = _mm_mul_ps(qq00,_mm_sub_ps(_mm_mul_ps(rinv00,rinvsq00),krf2));
1645
1646             /* CUBIC SPLINE TABLE DISPERSION */
1647             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
1648             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
1649             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
1650             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
1651             _MM_TRANSPOSE4_PS(Y,F,G,H);
1652             Heps             = _mm_mul_ps(vfeps,H);
1653             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
1654             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
1655             fvdw6            = _mm_mul_ps(c6_00,FF);
1656
1657             /* CUBIC SPLINE TABLE REPULSION */
1658             vfitab           = _mm_add_epi32(vfitab,ifour);
1659             Y                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,0) );
1660             F                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,1) );
1661             G                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,2) );
1662             H                = _mm_load_ps( vftab + gmx_mm_extract_epi32(vfitab,3) );
1663             _MM_TRANSPOSE4_PS(Y,F,G,H);
1664             Heps             = _mm_mul_ps(vfeps,H);
1665             Fp               = _mm_add_ps(F,_mm_mul_ps(vfeps,_mm_add_ps(G,Heps)));
1666             FF               = _mm_add_ps(Fp,_mm_mul_ps(vfeps,_mm_add_ps(G,_mm_add_ps(Heps,Heps))));
1667             fvdw12           = _mm_mul_ps(c12_00,FF);
1668             fvdw             = _mm_xor_ps(signbit,_mm_mul_ps(_mm_add_ps(fvdw6,fvdw12),_mm_mul_ps(vftabscale,rinv00)));
1669
1670             fscal            = _mm_add_ps(felec,fvdw);
1671
1672             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1673
1674             /* Calculate temporary vectorial force */
1675             tx               = _mm_mul_ps(fscal,dx00);
1676             ty               = _mm_mul_ps(fscal,dy00);
1677             tz               = _mm_mul_ps(fscal,dz00);
1678
1679             /* Update vectorial force */
1680             fix0             = _mm_add_ps(fix0,tx);
1681             fiy0             = _mm_add_ps(fiy0,ty);
1682             fiz0             = _mm_add_ps(fiz0,tz);
1683
1684             fjx0             = _mm_add_ps(fjx0,tx);
1685             fjy0             = _mm_add_ps(fjy0,ty);
1686             fjz0             = _mm_add_ps(fjz0,tz);
1687             
1688             /**************************
1689              * CALCULATE INTERACTIONS *
1690              **************************/
1691
1692             /* REACTION-FIELD ELECTROSTATICS */
1693             felec            = _mm_mul_ps(qq01,_mm_sub_ps(_mm_mul_ps(rinv01,rinvsq01),krf2));
1694
1695             fscal            = felec;
1696
1697             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1698
1699             /* Calculate temporary vectorial force */
1700             tx               = _mm_mul_ps(fscal,dx01);
1701             ty               = _mm_mul_ps(fscal,dy01);
1702             tz               = _mm_mul_ps(fscal,dz01);
1703
1704             /* Update vectorial force */
1705             fix0             = _mm_add_ps(fix0,tx);
1706             fiy0             = _mm_add_ps(fiy0,ty);
1707             fiz0             = _mm_add_ps(fiz0,tz);
1708
1709             fjx1             = _mm_add_ps(fjx1,tx);
1710             fjy1             = _mm_add_ps(fjy1,ty);
1711             fjz1             = _mm_add_ps(fjz1,tz);
1712             
1713             /**************************
1714              * CALCULATE INTERACTIONS *
1715              **************************/
1716
1717             /* REACTION-FIELD ELECTROSTATICS */
1718             felec            = _mm_mul_ps(qq02,_mm_sub_ps(_mm_mul_ps(rinv02,rinvsq02),krf2));
1719
1720             fscal            = felec;
1721
1722             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1723
1724             /* Calculate temporary vectorial force */
1725             tx               = _mm_mul_ps(fscal,dx02);
1726             ty               = _mm_mul_ps(fscal,dy02);
1727             tz               = _mm_mul_ps(fscal,dz02);
1728
1729             /* Update vectorial force */
1730             fix0             = _mm_add_ps(fix0,tx);
1731             fiy0             = _mm_add_ps(fiy0,ty);
1732             fiz0             = _mm_add_ps(fiz0,tz);
1733
1734             fjx2             = _mm_add_ps(fjx2,tx);
1735             fjy2             = _mm_add_ps(fjy2,ty);
1736             fjz2             = _mm_add_ps(fjz2,tz);
1737             
1738             /**************************
1739              * CALCULATE INTERACTIONS *
1740              **************************/
1741
1742             /* REACTION-FIELD ELECTROSTATICS */
1743             felec            = _mm_mul_ps(qq10,_mm_sub_ps(_mm_mul_ps(rinv10,rinvsq10),krf2));
1744
1745             fscal            = felec;
1746
1747             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1748
1749             /* Calculate temporary vectorial force */
1750             tx               = _mm_mul_ps(fscal,dx10);
1751             ty               = _mm_mul_ps(fscal,dy10);
1752             tz               = _mm_mul_ps(fscal,dz10);
1753
1754             /* Update vectorial force */
1755             fix1             = _mm_add_ps(fix1,tx);
1756             fiy1             = _mm_add_ps(fiy1,ty);
1757             fiz1             = _mm_add_ps(fiz1,tz);
1758
1759             fjx0             = _mm_add_ps(fjx0,tx);
1760             fjy0             = _mm_add_ps(fjy0,ty);
1761             fjz0             = _mm_add_ps(fjz0,tz);
1762             
1763             /**************************
1764              * CALCULATE INTERACTIONS *
1765              **************************/
1766
1767             /* REACTION-FIELD ELECTROSTATICS */
1768             felec            = _mm_mul_ps(qq11,_mm_sub_ps(_mm_mul_ps(rinv11,rinvsq11),krf2));
1769
1770             fscal            = felec;
1771
1772             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1773
1774             /* Calculate temporary vectorial force */
1775             tx               = _mm_mul_ps(fscal,dx11);
1776             ty               = _mm_mul_ps(fscal,dy11);
1777             tz               = _mm_mul_ps(fscal,dz11);
1778
1779             /* Update vectorial force */
1780             fix1             = _mm_add_ps(fix1,tx);
1781             fiy1             = _mm_add_ps(fiy1,ty);
1782             fiz1             = _mm_add_ps(fiz1,tz);
1783
1784             fjx1             = _mm_add_ps(fjx1,tx);
1785             fjy1             = _mm_add_ps(fjy1,ty);
1786             fjz1             = _mm_add_ps(fjz1,tz);
1787             
1788             /**************************
1789              * CALCULATE INTERACTIONS *
1790              **************************/
1791
1792             /* REACTION-FIELD ELECTROSTATICS */
1793             felec            = _mm_mul_ps(qq12,_mm_sub_ps(_mm_mul_ps(rinv12,rinvsq12),krf2));
1794
1795             fscal            = felec;
1796
1797             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1798
1799             /* Calculate temporary vectorial force */
1800             tx               = _mm_mul_ps(fscal,dx12);
1801             ty               = _mm_mul_ps(fscal,dy12);
1802             tz               = _mm_mul_ps(fscal,dz12);
1803
1804             /* Update vectorial force */
1805             fix1             = _mm_add_ps(fix1,tx);
1806             fiy1             = _mm_add_ps(fiy1,ty);
1807             fiz1             = _mm_add_ps(fiz1,tz);
1808
1809             fjx2             = _mm_add_ps(fjx2,tx);
1810             fjy2             = _mm_add_ps(fjy2,ty);
1811             fjz2             = _mm_add_ps(fjz2,tz);
1812             
1813             /**************************
1814              * CALCULATE INTERACTIONS *
1815              **************************/
1816
1817             /* REACTION-FIELD ELECTROSTATICS */
1818             felec            = _mm_mul_ps(qq20,_mm_sub_ps(_mm_mul_ps(rinv20,rinvsq20),krf2));
1819
1820             fscal            = felec;
1821
1822             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1823
1824             /* Calculate temporary vectorial force */
1825             tx               = _mm_mul_ps(fscal,dx20);
1826             ty               = _mm_mul_ps(fscal,dy20);
1827             tz               = _mm_mul_ps(fscal,dz20);
1828
1829             /* Update vectorial force */
1830             fix2             = _mm_add_ps(fix2,tx);
1831             fiy2             = _mm_add_ps(fiy2,ty);
1832             fiz2             = _mm_add_ps(fiz2,tz);
1833
1834             fjx0             = _mm_add_ps(fjx0,tx);
1835             fjy0             = _mm_add_ps(fjy0,ty);
1836             fjz0             = _mm_add_ps(fjz0,tz);
1837             
1838             /**************************
1839              * CALCULATE INTERACTIONS *
1840              **************************/
1841
1842             /* REACTION-FIELD ELECTROSTATICS */
1843             felec            = _mm_mul_ps(qq21,_mm_sub_ps(_mm_mul_ps(rinv21,rinvsq21),krf2));
1844
1845             fscal            = felec;
1846
1847             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1848
1849             /* Calculate temporary vectorial force */
1850             tx               = _mm_mul_ps(fscal,dx21);
1851             ty               = _mm_mul_ps(fscal,dy21);
1852             tz               = _mm_mul_ps(fscal,dz21);
1853
1854             /* Update vectorial force */
1855             fix2             = _mm_add_ps(fix2,tx);
1856             fiy2             = _mm_add_ps(fiy2,ty);
1857             fiz2             = _mm_add_ps(fiz2,tz);
1858
1859             fjx1             = _mm_add_ps(fjx1,tx);
1860             fjy1             = _mm_add_ps(fjy1,ty);
1861             fjz1             = _mm_add_ps(fjz1,tz);
1862             
1863             /**************************
1864              * CALCULATE INTERACTIONS *
1865              **************************/
1866
1867             /* REACTION-FIELD ELECTROSTATICS */
1868             felec            = _mm_mul_ps(qq22,_mm_sub_ps(_mm_mul_ps(rinv22,rinvsq22),krf2));
1869
1870             fscal            = felec;
1871
1872             fscal            = _mm_andnot_ps(dummy_mask,fscal);
1873
1874             /* Calculate temporary vectorial force */
1875             tx               = _mm_mul_ps(fscal,dx22);
1876             ty               = _mm_mul_ps(fscal,dy22);
1877             tz               = _mm_mul_ps(fscal,dz22);
1878
1879             /* Update vectorial force */
1880             fix2             = _mm_add_ps(fix2,tx);
1881             fiy2             = _mm_add_ps(fiy2,ty);
1882             fiz2             = _mm_add_ps(fiz2,tz);
1883
1884             fjx2             = _mm_add_ps(fjx2,tx);
1885             fjy2             = _mm_add_ps(fjy2,ty);
1886             fjz2             = _mm_add_ps(fjz2,tz);
1887             
1888             fjptrA             = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
1889             fjptrB             = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
1890             fjptrC             = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
1891             fjptrD             = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
1892
1893             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1894                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1895
1896             /* Inner loop uses 271 flops */
1897         }
1898
1899         /* End of innermost loop */
1900
1901         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1902                                               f+i_coord_offset,fshift+i_shift_offset);
1903
1904         /* Increment number of inner iterations */
1905         inneriter                  += j_index_end - j_index_start;
1906
1907         /* Outer loop uses 18 flops */
1908     }
1909
1910     /* Increment number of outer iterations */
1911     outeriter        += nri;
1912
1913     /* Update outer/inner flops */
1914
1915     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*18 + inneriter*271);
1916 }