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