Merge 'release-4-6' into master
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sse2_single / nb_kernel_ElecEw_VdwNone_GeomW3W3_sse2_single.c
1 /*
2  * Note: this file was generated by the Gromacs sse2_single kernel generator.
3  *
4  *                This source code is part of
5  *
6  *                 G   R   O   M   A   C   S
7  *
8  * Copyright (c) 2001-2012, The GROMACS Development Team
9  *
10  * Gromacs is a library for molecular simulation and trajectory analysis,
11  * written by Erik Lindahl, David van der Spoel, Berk Hess, and others - for
12  * a full list of developers and information, check out http://www.gromacs.org
13  *
14  * This program is free software; you can redistribute it and/or modify it under
15  * the terms of the GNU Lesser General Public License as published by the Free
16  * Software Foundation; either version 2 of the License, or (at your option) any
17  * later version.
18  *
19  * To help fund GROMACS development, we humbly ask that you cite
20  * the papers people have written on it - you can find them on the website.
21  */
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <math.h>
27
28 #include "../nb_kernel.h"
29 #include "types/simple.h"
30 #include "vec.h"
31 #include "nrnb.h"
32
33 #include "gmx_math_x86_sse2_single.h"
34 #include "kernelutil_x86_sse2_single.h"
35
36 /*
37  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwNone_GeomW3W3_VF_sse2_single
38  * Electrostatics interaction: Ewald
39  * VdW interaction:            None
40  * Geometry:                   Water3-Water3
41  * Calculate force/pot:        PotentialAndForce
42  */
43 void
44 nb_kernel_ElecEw_VdwNone_GeomW3W3_VF_sse2_single
45                     (t_nblist * gmx_restrict                nlist,
46                      rvec * gmx_restrict                    xx,
47                      rvec * gmx_restrict                    ff,
48                      t_forcerec * gmx_restrict              fr,
49                      t_mdatoms * gmx_restrict               mdatoms,
50                      nb_kernel_data_t * gmx_restrict        kernel_data,
51                      t_nrnb * gmx_restrict                  nrnb)
52 {
53     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or 
54      * just 0 for non-waters.
55      * Suffixes A,B,C,D refer to j loop unrolling done with SSE, e.g. for the four different
56      * jnr indices corresponding to data put in the four positions in the SIMD register.
57      */
58     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
59     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
60     int              jnrA,jnrB,jnrC,jnrD;
61     int              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              vdwioffset0;
67     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
68     int              vdwioffset1;
69     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
70     int              vdwioffset2;
71     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
72     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
73     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
74     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
75     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
76     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
77     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
78     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
79     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
80     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
81     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
82     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
83     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
84     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
85     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
86     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
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     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
118     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
119     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
120
121     jq0              = _mm_set1_ps(charge[inr+0]);
122     jq1              = _mm_set1_ps(charge[inr+1]);
123     jq2              = _mm_set1_ps(charge[inr+2]);
124     qq00             = _mm_mul_ps(iq0,jq0);
125     qq01             = _mm_mul_ps(iq0,jq1);
126     qq02             = _mm_mul_ps(iq0,jq2);
127     qq10             = _mm_mul_ps(iq1,jq0);
128     qq11             = _mm_mul_ps(iq1,jq1);
129     qq12             = _mm_mul_ps(iq1,jq2);
130     qq20             = _mm_mul_ps(iq2,jq0);
131     qq21             = _mm_mul_ps(iq2,jq1);
132     qq22             = _mm_mul_ps(iq2,jq2);
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         ix0              = _mm_set1_ps(shX + x[i_coord_offset+DIM*0+XX]);
163         iy0              = _mm_set1_ps(shY + x[i_coord_offset+DIM*0+YY]);
164         iz0              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*0+ZZ]);
165         ix1              = _mm_set1_ps(shX + x[i_coord_offset+DIM*1+XX]);
166         iy1              = _mm_set1_ps(shY + x[i_coord_offset+DIM*1+YY]);
167         iz1              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*1+ZZ]);
168         ix2              = _mm_set1_ps(shX + x[i_coord_offset+DIM*2+XX]);
169         iy2              = _mm_set1_ps(shY + x[i_coord_offset+DIM*2+YY]);
170         iz2              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*2+ZZ]);
171
172         fix0             = _mm_setzero_ps();
173         fiy0             = _mm_setzero_ps();
174         fiz0             = _mm_setzero_ps();
175         fix1             = _mm_setzero_ps();
176         fiy1             = _mm_setzero_ps();
177         fiz1             = _mm_setzero_ps();
178         fix2             = _mm_setzero_ps();
179         fiy2             = _mm_setzero_ps();
180         fiz2             = _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,x+j_coord_offsetB,
202                                               x+j_coord_offsetC,x+j_coord_offsetD,
203                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
204
205             /* Calculate displacement vector */
206             dx00             = _mm_sub_ps(ix0,jx0);
207             dy00             = _mm_sub_ps(iy0,jy0);
208             dz00             = _mm_sub_ps(iz0,jz0);
209             dx01             = _mm_sub_ps(ix0,jx1);
210             dy01             = _mm_sub_ps(iy0,jy1);
211             dz01             = _mm_sub_ps(iz0,jz1);
212             dx02             = _mm_sub_ps(ix0,jx2);
213             dy02             = _mm_sub_ps(iy0,jy2);
214             dz02             = _mm_sub_ps(iz0,jz2);
215             dx10             = _mm_sub_ps(ix1,jx0);
216             dy10             = _mm_sub_ps(iy1,jy0);
217             dz10             = _mm_sub_ps(iz1,jz0);
218             dx11             = _mm_sub_ps(ix1,jx1);
219             dy11             = _mm_sub_ps(iy1,jy1);
220             dz11             = _mm_sub_ps(iz1,jz1);
221             dx12             = _mm_sub_ps(ix1,jx2);
222             dy12             = _mm_sub_ps(iy1,jy2);
223             dz12             = _mm_sub_ps(iz1,jz2);
224             dx20             = _mm_sub_ps(ix2,jx0);
225             dy20             = _mm_sub_ps(iy2,jy0);
226             dz20             = _mm_sub_ps(iz2,jz0);
227             dx21             = _mm_sub_ps(ix2,jx1);
228             dy21             = _mm_sub_ps(iy2,jy1);
229             dz21             = _mm_sub_ps(iz2,jz1);
230             dx22             = _mm_sub_ps(ix2,jx2);
231             dy22             = _mm_sub_ps(iy2,jy2);
232             dz22             = _mm_sub_ps(iz2,jz2);
233
234             /* Calculate squared distance and things based on it */
235             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
236             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
237             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
238             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
239             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
240             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
241             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
242             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
243             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
244
245             rinv00           = gmx_mm_invsqrt_ps(rsq00);
246             rinv01           = gmx_mm_invsqrt_ps(rsq01);
247             rinv02           = gmx_mm_invsqrt_ps(rsq02);
248             rinv10           = gmx_mm_invsqrt_ps(rsq10);
249             rinv11           = gmx_mm_invsqrt_ps(rsq11);
250             rinv12           = gmx_mm_invsqrt_ps(rsq12);
251             rinv20           = gmx_mm_invsqrt_ps(rsq20);
252             rinv21           = gmx_mm_invsqrt_ps(rsq21);
253             rinv22           = gmx_mm_invsqrt_ps(rsq22);
254
255             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
256             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
257             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
258             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
259             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
260             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
261             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
262             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
263             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
264
265             fjx0             = _mm_setzero_ps();
266             fjy0             = _mm_setzero_ps();
267             fjz0             = _mm_setzero_ps();
268             fjx1             = _mm_setzero_ps();
269             fjy1             = _mm_setzero_ps();
270             fjz1             = _mm_setzero_ps();
271             fjx2             = _mm_setzero_ps();
272             fjy2             = _mm_setzero_ps();
273             fjz2             = _mm_setzero_ps();
274
275             /**************************
276              * CALCULATE INTERACTIONS *
277              **************************/
278
279             r00              = _mm_mul_ps(rsq00,rinv00);
280
281             /* EWALD ELECTROSTATICS */
282
283             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
284             ewrt             = _mm_mul_ps(r00,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(qq00,_mm_sub_ps(rinv00,velec));
296             felec            = _mm_mul_ps(_mm_mul_ps(qq00,rinv00),_mm_sub_ps(rinvsq00,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,dx00);
305             ty               = _mm_mul_ps(fscal,dy00);
306             tz               = _mm_mul_ps(fscal,dz00);
307
308             /* Update vectorial force */
309             fix0             = _mm_add_ps(fix0,tx);
310             fiy0             = _mm_add_ps(fiy0,ty);
311             fiz0             = _mm_add_ps(fiz0,tz);
312
313             fjx0             = _mm_add_ps(fjx0,tx);
314             fjy0             = _mm_add_ps(fjy0,ty);
315             fjz0             = _mm_add_ps(fjz0,tz);
316
317             /**************************
318              * CALCULATE INTERACTIONS *
319              **************************/
320
321             r01              = _mm_mul_ps(rsq01,rinv01);
322
323             /* EWALD ELECTROSTATICS */
324
325             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
326             ewrt             = _mm_mul_ps(r01,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(qq01,_mm_sub_ps(rinv01,velec));
338             felec            = _mm_mul_ps(_mm_mul_ps(qq01,rinv01),_mm_sub_ps(rinvsq01,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,dx01);
347             ty               = _mm_mul_ps(fscal,dy01);
348             tz               = _mm_mul_ps(fscal,dz01);
349
350             /* Update vectorial force */
351             fix0             = _mm_add_ps(fix0,tx);
352             fiy0             = _mm_add_ps(fiy0,ty);
353             fiz0             = _mm_add_ps(fiz0,tz);
354
355             fjx1             = _mm_add_ps(fjx1,tx);
356             fjy1             = _mm_add_ps(fjy1,ty);
357             fjz1             = _mm_add_ps(fjz1,tz);
358
359             /**************************
360              * CALCULATE INTERACTIONS *
361              **************************/
362
363             r02              = _mm_mul_ps(rsq02,rinv02);
364
365             /* EWALD ELECTROSTATICS */
366
367             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
368             ewrt             = _mm_mul_ps(r02,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(qq02,_mm_sub_ps(rinv02,velec));
380             felec            = _mm_mul_ps(_mm_mul_ps(qq02,rinv02),_mm_sub_ps(rinvsq02,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,dx02);
389             ty               = _mm_mul_ps(fscal,dy02);
390             tz               = _mm_mul_ps(fscal,dz02);
391
392             /* Update vectorial force */
393             fix0             = _mm_add_ps(fix0,tx);
394             fiy0             = _mm_add_ps(fiy0,ty);
395             fiz0             = _mm_add_ps(fiz0,tz);
396
397             fjx2             = _mm_add_ps(fjx2,tx);
398             fjy2             = _mm_add_ps(fjy2,ty);
399             fjz2             = _mm_add_ps(fjz2,tz);
400
401             /**************************
402              * CALCULATE INTERACTIONS *
403              **************************/
404
405             r10              = _mm_mul_ps(rsq10,rinv10);
406
407             /* EWALD ELECTROSTATICS */
408
409             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
410             ewrt             = _mm_mul_ps(r10,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(qq10,_mm_sub_ps(rinv10,velec));
422             felec            = _mm_mul_ps(_mm_mul_ps(qq10,rinv10),_mm_sub_ps(rinvsq10,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,dx10);
431             ty               = _mm_mul_ps(fscal,dy10);
432             tz               = _mm_mul_ps(fscal,dz10);
433
434             /* Update vectorial force */
435             fix1             = _mm_add_ps(fix1,tx);
436             fiy1             = _mm_add_ps(fiy1,ty);
437             fiz1             = _mm_add_ps(fiz1,tz);
438
439             fjx0             = _mm_add_ps(fjx0,tx);
440             fjy0             = _mm_add_ps(fjy0,ty);
441             fjz0             = _mm_add_ps(fjz0,tz);
442
443             /**************************
444              * CALCULATE INTERACTIONS *
445              **************************/
446
447             r11              = _mm_mul_ps(rsq11,rinv11);
448
449             /* EWALD ELECTROSTATICS */
450
451             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
452             ewrt             = _mm_mul_ps(r11,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(qq11,_mm_sub_ps(rinv11,velec));
464             felec            = _mm_mul_ps(_mm_mul_ps(qq11,rinv11),_mm_sub_ps(rinvsq11,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,dx11);
473             ty               = _mm_mul_ps(fscal,dy11);
474             tz               = _mm_mul_ps(fscal,dz11);
475
476             /* Update vectorial force */
477             fix1             = _mm_add_ps(fix1,tx);
478             fiy1             = _mm_add_ps(fiy1,ty);
479             fiz1             = _mm_add_ps(fiz1,tz);
480
481             fjx1             = _mm_add_ps(fjx1,tx);
482             fjy1             = _mm_add_ps(fjy1,ty);
483             fjz1             = _mm_add_ps(fjz1,tz);
484
485             /**************************
486              * CALCULATE INTERACTIONS *
487              **************************/
488
489             r12              = _mm_mul_ps(rsq12,rinv12);
490
491             /* EWALD ELECTROSTATICS */
492
493             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
494             ewrt             = _mm_mul_ps(r12,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(qq12,_mm_sub_ps(rinv12,velec));
506             felec            = _mm_mul_ps(_mm_mul_ps(qq12,rinv12),_mm_sub_ps(rinvsq12,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,dx12);
515             ty               = _mm_mul_ps(fscal,dy12);
516             tz               = _mm_mul_ps(fscal,dz12);
517
518             /* Update vectorial force */
519             fix1             = _mm_add_ps(fix1,tx);
520             fiy1             = _mm_add_ps(fiy1,ty);
521             fiz1             = _mm_add_ps(fiz1,tz);
522
523             fjx2             = _mm_add_ps(fjx2,tx);
524             fjy2             = _mm_add_ps(fjy2,ty);
525             fjz2             = _mm_add_ps(fjz2,tz);
526
527             /**************************
528              * CALCULATE INTERACTIONS *
529              **************************/
530
531             r20              = _mm_mul_ps(rsq20,rinv20);
532
533             /* EWALD ELECTROSTATICS */
534
535             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
536             ewrt             = _mm_mul_ps(r20,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(qq20,_mm_sub_ps(rinv20,velec));
548             felec            = _mm_mul_ps(_mm_mul_ps(qq20,rinv20),_mm_sub_ps(rinvsq20,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,dx20);
557             ty               = _mm_mul_ps(fscal,dy20);
558             tz               = _mm_mul_ps(fscal,dz20);
559
560             /* Update vectorial force */
561             fix2             = _mm_add_ps(fix2,tx);
562             fiy2             = _mm_add_ps(fiy2,ty);
563             fiz2             = _mm_add_ps(fiz2,tz);
564
565             fjx0             = _mm_add_ps(fjx0,tx);
566             fjy0             = _mm_add_ps(fjy0,ty);
567             fjz0             = _mm_add_ps(fjz0,tz);
568
569             /**************************
570              * CALCULATE INTERACTIONS *
571              **************************/
572
573             r21              = _mm_mul_ps(rsq21,rinv21);
574
575             /* EWALD ELECTROSTATICS */
576
577             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
578             ewrt             = _mm_mul_ps(r21,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(qq21,_mm_sub_ps(rinv21,velec));
590             felec            = _mm_mul_ps(_mm_mul_ps(qq21,rinv21),_mm_sub_ps(rinvsq21,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,dx21);
599             ty               = _mm_mul_ps(fscal,dy21);
600             tz               = _mm_mul_ps(fscal,dz21);
601
602             /* Update vectorial force */
603             fix2             = _mm_add_ps(fix2,tx);
604             fiy2             = _mm_add_ps(fiy2,ty);
605             fiz2             = _mm_add_ps(fiz2,tz);
606
607             fjx1             = _mm_add_ps(fjx1,tx);
608             fjy1             = _mm_add_ps(fjy1,ty);
609             fjz1             = _mm_add_ps(fjz1,tz);
610
611             /**************************
612              * CALCULATE INTERACTIONS *
613              **************************/
614
615             r22              = _mm_mul_ps(rsq22,rinv22);
616
617             /* EWALD ELECTROSTATICS */
618
619             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
620             ewrt             = _mm_mul_ps(r22,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(qq22,_mm_sub_ps(rinv22,velec));
632             felec            = _mm_mul_ps(_mm_mul_ps(qq22,rinv22),_mm_sub_ps(rinvsq22,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,dx22);
641             ty               = _mm_mul_ps(fscal,dy22);
642             tz               = _mm_mul_ps(fscal,dz22);
643
644             /* Update vectorial force */
645             fix2             = _mm_add_ps(fix2,tx);
646             fiy2             = _mm_add_ps(fiy2,ty);
647             fiz2             = _mm_add_ps(fiz2,tz);
648
649             fjx2             = _mm_add_ps(fjx2,tx);
650             fjy2             = _mm_add_ps(fjy2,ty);
651             fjz2             = _mm_add_ps(fjz2,tz);
652
653             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(f+j_coord_offsetA,f+j_coord_offsetB,
654                                                    f+j_coord_offsetC,f+j_coord_offsetD,
655                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
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,x+j_coord_offsetB,
686                                               x+j_coord_offsetC,x+j_coord_offsetD,
687                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
688
689             /* Calculate displacement vector */
690             dx00             = _mm_sub_ps(ix0,jx0);
691             dy00             = _mm_sub_ps(iy0,jy0);
692             dz00             = _mm_sub_ps(iz0,jz0);
693             dx01             = _mm_sub_ps(ix0,jx1);
694             dy01             = _mm_sub_ps(iy0,jy1);
695             dz01             = _mm_sub_ps(iz0,jz1);
696             dx02             = _mm_sub_ps(ix0,jx2);
697             dy02             = _mm_sub_ps(iy0,jy2);
698             dz02             = _mm_sub_ps(iz0,jz2);
699             dx10             = _mm_sub_ps(ix1,jx0);
700             dy10             = _mm_sub_ps(iy1,jy0);
701             dz10             = _mm_sub_ps(iz1,jz0);
702             dx11             = _mm_sub_ps(ix1,jx1);
703             dy11             = _mm_sub_ps(iy1,jy1);
704             dz11             = _mm_sub_ps(iz1,jz1);
705             dx12             = _mm_sub_ps(ix1,jx2);
706             dy12             = _mm_sub_ps(iy1,jy2);
707             dz12             = _mm_sub_ps(iz1,jz2);
708             dx20             = _mm_sub_ps(ix2,jx0);
709             dy20             = _mm_sub_ps(iy2,jy0);
710             dz20             = _mm_sub_ps(iz2,jz0);
711             dx21             = _mm_sub_ps(ix2,jx1);
712             dy21             = _mm_sub_ps(iy2,jy1);
713             dz21             = _mm_sub_ps(iz2,jz1);
714             dx22             = _mm_sub_ps(ix2,jx2);
715             dy22             = _mm_sub_ps(iy2,jy2);
716             dz22             = _mm_sub_ps(iz2,jz2);
717
718             /* Calculate squared distance and things based on it */
719             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
720             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
721             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
722             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
723             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
724             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
725             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
726             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
727             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
728
729             rinv00           = gmx_mm_invsqrt_ps(rsq00);
730             rinv01           = gmx_mm_invsqrt_ps(rsq01);
731             rinv02           = gmx_mm_invsqrt_ps(rsq02);
732             rinv10           = gmx_mm_invsqrt_ps(rsq10);
733             rinv11           = gmx_mm_invsqrt_ps(rsq11);
734             rinv12           = gmx_mm_invsqrt_ps(rsq12);
735             rinv20           = gmx_mm_invsqrt_ps(rsq20);
736             rinv21           = gmx_mm_invsqrt_ps(rsq21);
737             rinv22           = gmx_mm_invsqrt_ps(rsq22);
738
739             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
740             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
741             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
742             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
743             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
744             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
745             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
746             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
747             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
748
749             fjx0             = _mm_setzero_ps();
750             fjy0             = _mm_setzero_ps();
751             fjz0             = _mm_setzero_ps();
752             fjx1             = _mm_setzero_ps();
753             fjy1             = _mm_setzero_ps();
754             fjz1             = _mm_setzero_ps();
755             fjx2             = _mm_setzero_ps();
756             fjy2             = _mm_setzero_ps();
757             fjz2             = _mm_setzero_ps();
758
759             /**************************
760              * CALCULATE INTERACTIONS *
761              **************************/
762
763             r00              = _mm_mul_ps(rsq00,rinv00);
764             r00              = _mm_andnot_ps(dummy_mask,r00);
765
766             /* EWALD ELECTROSTATICS */
767
768             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
769             ewrt             = _mm_mul_ps(r00,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(qq00,_mm_sub_ps(rinv00,velec));
781             felec            = _mm_mul_ps(_mm_mul_ps(qq00,rinv00),_mm_sub_ps(rinvsq00,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,dx00);
793             ty               = _mm_mul_ps(fscal,dy00);
794             tz               = _mm_mul_ps(fscal,dz00);
795
796             /* Update vectorial force */
797             fix0             = _mm_add_ps(fix0,tx);
798             fiy0             = _mm_add_ps(fiy0,ty);
799             fiz0             = _mm_add_ps(fiz0,tz);
800
801             fjx0             = _mm_add_ps(fjx0,tx);
802             fjy0             = _mm_add_ps(fjy0,ty);
803             fjz0             = _mm_add_ps(fjz0,tz);
804
805             /**************************
806              * CALCULATE INTERACTIONS *
807              **************************/
808
809             r01              = _mm_mul_ps(rsq01,rinv01);
810             r01              = _mm_andnot_ps(dummy_mask,r01);
811
812             /* EWALD ELECTROSTATICS */
813
814             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
815             ewrt             = _mm_mul_ps(r01,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(qq01,_mm_sub_ps(rinv01,velec));
827             felec            = _mm_mul_ps(_mm_mul_ps(qq01,rinv01),_mm_sub_ps(rinvsq01,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,dx01);
839             ty               = _mm_mul_ps(fscal,dy01);
840             tz               = _mm_mul_ps(fscal,dz01);
841
842             /* Update vectorial force */
843             fix0             = _mm_add_ps(fix0,tx);
844             fiy0             = _mm_add_ps(fiy0,ty);
845             fiz0             = _mm_add_ps(fiz0,tz);
846
847             fjx1             = _mm_add_ps(fjx1,tx);
848             fjy1             = _mm_add_ps(fjy1,ty);
849             fjz1             = _mm_add_ps(fjz1,tz);
850
851             /**************************
852              * CALCULATE INTERACTIONS *
853              **************************/
854
855             r02              = _mm_mul_ps(rsq02,rinv02);
856             r02              = _mm_andnot_ps(dummy_mask,r02);
857
858             /* EWALD ELECTROSTATICS */
859
860             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
861             ewrt             = _mm_mul_ps(r02,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(qq02,_mm_sub_ps(rinv02,velec));
873             felec            = _mm_mul_ps(_mm_mul_ps(qq02,rinv02),_mm_sub_ps(rinvsq02,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,dx02);
885             ty               = _mm_mul_ps(fscal,dy02);
886             tz               = _mm_mul_ps(fscal,dz02);
887
888             /* Update vectorial force */
889             fix0             = _mm_add_ps(fix0,tx);
890             fiy0             = _mm_add_ps(fiy0,ty);
891             fiz0             = _mm_add_ps(fiz0,tz);
892
893             fjx2             = _mm_add_ps(fjx2,tx);
894             fjy2             = _mm_add_ps(fjy2,ty);
895             fjz2             = _mm_add_ps(fjz2,tz);
896
897             /**************************
898              * CALCULATE INTERACTIONS *
899              **************************/
900
901             r10              = _mm_mul_ps(rsq10,rinv10);
902             r10              = _mm_andnot_ps(dummy_mask,r10);
903
904             /* EWALD ELECTROSTATICS */
905
906             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
907             ewrt             = _mm_mul_ps(r10,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(qq10,_mm_sub_ps(rinv10,velec));
919             felec            = _mm_mul_ps(_mm_mul_ps(qq10,rinv10),_mm_sub_ps(rinvsq10,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,dx10);
931             ty               = _mm_mul_ps(fscal,dy10);
932             tz               = _mm_mul_ps(fscal,dz10);
933
934             /* Update vectorial force */
935             fix1             = _mm_add_ps(fix1,tx);
936             fiy1             = _mm_add_ps(fiy1,ty);
937             fiz1             = _mm_add_ps(fiz1,tz);
938
939             fjx0             = _mm_add_ps(fjx0,tx);
940             fjy0             = _mm_add_ps(fjy0,ty);
941             fjz0             = _mm_add_ps(fjz0,tz);
942
943             /**************************
944              * CALCULATE INTERACTIONS *
945              **************************/
946
947             r11              = _mm_mul_ps(rsq11,rinv11);
948             r11              = _mm_andnot_ps(dummy_mask,r11);
949
950             /* EWALD ELECTROSTATICS */
951
952             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
953             ewrt             = _mm_mul_ps(r11,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(qq11,_mm_sub_ps(rinv11,velec));
965             felec            = _mm_mul_ps(_mm_mul_ps(qq11,rinv11),_mm_sub_ps(rinvsq11,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,dx11);
977             ty               = _mm_mul_ps(fscal,dy11);
978             tz               = _mm_mul_ps(fscal,dz11);
979
980             /* Update vectorial force */
981             fix1             = _mm_add_ps(fix1,tx);
982             fiy1             = _mm_add_ps(fiy1,ty);
983             fiz1             = _mm_add_ps(fiz1,tz);
984
985             fjx1             = _mm_add_ps(fjx1,tx);
986             fjy1             = _mm_add_ps(fjy1,ty);
987             fjz1             = _mm_add_ps(fjz1,tz);
988
989             /**************************
990              * CALCULATE INTERACTIONS *
991              **************************/
992
993             r12              = _mm_mul_ps(rsq12,rinv12);
994             r12              = _mm_andnot_ps(dummy_mask,r12);
995
996             /* EWALD ELECTROSTATICS */
997
998             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
999             ewrt             = _mm_mul_ps(r12,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(qq12,_mm_sub_ps(rinv12,velec));
1011             felec            = _mm_mul_ps(_mm_mul_ps(qq12,rinv12),_mm_sub_ps(rinvsq12,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,dx12);
1023             ty               = _mm_mul_ps(fscal,dy12);
1024             tz               = _mm_mul_ps(fscal,dz12);
1025
1026             /* Update vectorial force */
1027             fix1             = _mm_add_ps(fix1,tx);
1028             fiy1             = _mm_add_ps(fiy1,ty);
1029             fiz1             = _mm_add_ps(fiz1,tz);
1030
1031             fjx2             = _mm_add_ps(fjx2,tx);
1032             fjy2             = _mm_add_ps(fjy2,ty);
1033             fjz2             = _mm_add_ps(fjz2,tz);
1034
1035             /**************************
1036              * CALCULATE INTERACTIONS *
1037              **************************/
1038
1039             r20              = _mm_mul_ps(rsq20,rinv20);
1040             r20              = _mm_andnot_ps(dummy_mask,r20);
1041
1042             /* EWALD ELECTROSTATICS */
1043
1044             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1045             ewrt             = _mm_mul_ps(r20,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(qq20,_mm_sub_ps(rinv20,velec));
1057             felec            = _mm_mul_ps(_mm_mul_ps(qq20,rinv20),_mm_sub_ps(rinvsq20,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,dx20);
1069             ty               = _mm_mul_ps(fscal,dy20);
1070             tz               = _mm_mul_ps(fscal,dz20);
1071
1072             /* Update vectorial force */
1073             fix2             = _mm_add_ps(fix2,tx);
1074             fiy2             = _mm_add_ps(fiy2,ty);
1075             fiz2             = _mm_add_ps(fiz2,tz);
1076
1077             fjx0             = _mm_add_ps(fjx0,tx);
1078             fjy0             = _mm_add_ps(fjy0,ty);
1079             fjz0             = _mm_add_ps(fjz0,tz);
1080
1081             /**************************
1082              * CALCULATE INTERACTIONS *
1083              **************************/
1084
1085             r21              = _mm_mul_ps(rsq21,rinv21);
1086             r21              = _mm_andnot_ps(dummy_mask,r21);
1087
1088             /* EWALD ELECTROSTATICS */
1089
1090             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1091             ewrt             = _mm_mul_ps(r21,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(qq21,_mm_sub_ps(rinv21,velec));
1103             felec            = _mm_mul_ps(_mm_mul_ps(qq21,rinv21),_mm_sub_ps(rinvsq21,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,dx21);
1115             ty               = _mm_mul_ps(fscal,dy21);
1116             tz               = _mm_mul_ps(fscal,dz21);
1117
1118             /* Update vectorial force */
1119             fix2             = _mm_add_ps(fix2,tx);
1120             fiy2             = _mm_add_ps(fiy2,ty);
1121             fiz2             = _mm_add_ps(fiz2,tz);
1122
1123             fjx1             = _mm_add_ps(fjx1,tx);
1124             fjy1             = _mm_add_ps(fjy1,ty);
1125             fjz1             = _mm_add_ps(fjz1,tz);
1126
1127             /**************************
1128              * CALCULATE INTERACTIONS *
1129              **************************/
1130
1131             r22              = _mm_mul_ps(rsq22,rinv22);
1132             r22              = _mm_andnot_ps(dummy_mask,r22);
1133
1134             /* EWALD ELECTROSTATICS */
1135
1136             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1137             ewrt             = _mm_mul_ps(r22,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(qq22,_mm_sub_ps(rinv22,velec));
1149             felec            = _mm_mul_ps(_mm_mul_ps(qq22,rinv22),_mm_sub_ps(rinvsq22,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,dx22);
1161             ty               = _mm_mul_ps(fscal,dy22);
1162             tz               = _mm_mul_ps(fscal,dz22);
1163
1164             /* Update vectorial force */
1165             fix2             = _mm_add_ps(fix2,tx);
1166             fiy2             = _mm_add_ps(fiy2,ty);
1167             fiz2             = _mm_add_ps(fiz2,tz);
1168
1169             fjx2             = _mm_add_ps(fjx2,tx);
1170             fjy2             = _mm_add_ps(fjy2,ty);
1171             fjz2             = _mm_add_ps(fjz2,tz);
1172
1173             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(f+j_coord_offsetA,f+j_coord_offsetB,
1174                                                    f+j_coord_offsetC,f+j_coord_offsetD,
1175                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1176
1177             /* Inner loop uses 378 flops */
1178         }
1179
1180         /* End of innermost loop */
1181
1182         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1183                                               f+i_coord_offset,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_W3W3_VF,outeriter*28 + inneriter*378);
1201 }
1202 /*
1203  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwNone_GeomW3W3_F_sse2_single
1204  * Electrostatics interaction: Ewald
1205  * VdW interaction:            None
1206  * Geometry:                   Water3-Water3
1207  * Calculate force/pot:        Force
1208  */
1209 void
1210 nb_kernel_ElecEw_VdwNone_GeomW3W3_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              vdwioffset0;
1233     __m128           ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1234     int              vdwioffset1;
1235     __m128           ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1236     int              vdwioffset2;
1237     __m128           ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1238     int              vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
1239     __m128           jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1240     int              vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
1241     __m128           jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1242     int              vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
1243     __m128           jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1244     __m128           dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1245     __m128           dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
1246     __m128           dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
1247     __m128           dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
1248     __m128           dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1249     __m128           dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1250     __m128           dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
1251     __m128           dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1252     __m128           dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
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     iq0              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+0]));
1284     iq1              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
1285     iq2              = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
1286
1287     jq0              = _mm_set1_ps(charge[inr+0]);
1288     jq1              = _mm_set1_ps(charge[inr+1]);
1289     jq2              = _mm_set1_ps(charge[inr+2]);
1290     qq00             = _mm_mul_ps(iq0,jq0);
1291     qq01             = _mm_mul_ps(iq0,jq1);
1292     qq02             = _mm_mul_ps(iq0,jq2);
1293     qq10             = _mm_mul_ps(iq1,jq0);
1294     qq11             = _mm_mul_ps(iq1,jq1);
1295     qq12             = _mm_mul_ps(iq1,jq2);
1296     qq20             = _mm_mul_ps(iq2,jq0);
1297     qq21             = _mm_mul_ps(iq2,jq1);
1298     qq22             = _mm_mul_ps(iq2,jq2);
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         ix0              = _mm_set1_ps(shX + x[i_coord_offset+DIM*0+XX]);
1329         iy0              = _mm_set1_ps(shY + x[i_coord_offset+DIM*0+YY]);
1330         iz0              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*0+ZZ]);
1331         ix1              = _mm_set1_ps(shX + x[i_coord_offset+DIM*1+XX]);
1332         iy1              = _mm_set1_ps(shY + x[i_coord_offset+DIM*1+YY]);
1333         iz1              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*1+ZZ]);
1334         ix2              = _mm_set1_ps(shX + x[i_coord_offset+DIM*2+XX]);
1335         iy2              = _mm_set1_ps(shY + x[i_coord_offset+DIM*2+YY]);
1336         iz2              = _mm_set1_ps(shZ + x[i_coord_offset+DIM*2+ZZ]);
1337
1338         fix0             = _mm_setzero_ps();
1339         fiy0             = _mm_setzero_ps();
1340         fiz0             = _mm_setzero_ps();
1341         fix1             = _mm_setzero_ps();
1342         fiy1             = _mm_setzero_ps();
1343         fiz1             = _mm_setzero_ps();
1344         fix2             = _mm_setzero_ps();
1345         fiy2             = _mm_setzero_ps();
1346         fiz2             = _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,x+j_coord_offsetB,
1365                                               x+j_coord_offsetC,x+j_coord_offsetD,
1366                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1367
1368             /* Calculate displacement vector */
1369             dx00             = _mm_sub_ps(ix0,jx0);
1370             dy00             = _mm_sub_ps(iy0,jy0);
1371             dz00             = _mm_sub_ps(iz0,jz0);
1372             dx01             = _mm_sub_ps(ix0,jx1);
1373             dy01             = _mm_sub_ps(iy0,jy1);
1374             dz01             = _mm_sub_ps(iz0,jz1);
1375             dx02             = _mm_sub_ps(ix0,jx2);
1376             dy02             = _mm_sub_ps(iy0,jy2);
1377             dz02             = _mm_sub_ps(iz0,jz2);
1378             dx10             = _mm_sub_ps(ix1,jx0);
1379             dy10             = _mm_sub_ps(iy1,jy0);
1380             dz10             = _mm_sub_ps(iz1,jz0);
1381             dx11             = _mm_sub_ps(ix1,jx1);
1382             dy11             = _mm_sub_ps(iy1,jy1);
1383             dz11             = _mm_sub_ps(iz1,jz1);
1384             dx12             = _mm_sub_ps(ix1,jx2);
1385             dy12             = _mm_sub_ps(iy1,jy2);
1386             dz12             = _mm_sub_ps(iz1,jz2);
1387             dx20             = _mm_sub_ps(ix2,jx0);
1388             dy20             = _mm_sub_ps(iy2,jy0);
1389             dz20             = _mm_sub_ps(iz2,jz0);
1390             dx21             = _mm_sub_ps(ix2,jx1);
1391             dy21             = _mm_sub_ps(iy2,jy1);
1392             dz21             = _mm_sub_ps(iz2,jz1);
1393             dx22             = _mm_sub_ps(ix2,jx2);
1394             dy22             = _mm_sub_ps(iy2,jy2);
1395             dz22             = _mm_sub_ps(iz2,jz2);
1396
1397             /* Calculate squared distance and things based on it */
1398             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1399             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
1400             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
1401             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
1402             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1403             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1404             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
1405             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1406             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1407
1408             rinv00           = gmx_mm_invsqrt_ps(rsq00);
1409             rinv01           = gmx_mm_invsqrt_ps(rsq01);
1410             rinv02           = gmx_mm_invsqrt_ps(rsq02);
1411             rinv10           = gmx_mm_invsqrt_ps(rsq10);
1412             rinv11           = gmx_mm_invsqrt_ps(rsq11);
1413             rinv12           = gmx_mm_invsqrt_ps(rsq12);
1414             rinv20           = gmx_mm_invsqrt_ps(rsq20);
1415             rinv21           = gmx_mm_invsqrt_ps(rsq21);
1416             rinv22           = gmx_mm_invsqrt_ps(rsq22);
1417
1418             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
1419             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
1420             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
1421             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
1422             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
1423             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
1424             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
1425             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
1426             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
1427
1428             fjx0             = _mm_setzero_ps();
1429             fjy0             = _mm_setzero_ps();
1430             fjz0             = _mm_setzero_ps();
1431             fjx1             = _mm_setzero_ps();
1432             fjy1             = _mm_setzero_ps();
1433             fjz1             = _mm_setzero_ps();
1434             fjx2             = _mm_setzero_ps();
1435             fjy2             = _mm_setzero_ps();
1436             fjz2             = _mm_setzero_ps();
1437
1438             /**************************
1439              * CALCULATE INTERACTIONS *
1440              **************************/
1441
1442             r00              = _mm_mul_ps(rsq00,rinv00);
1443
1444             /* EWALD ELECTROSTATICS */
1445
1446             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1447             ewrt             = _mm_mul_ps(r00,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(qq00,rinv00),_mm_sub_ps(rinvsq00,felec));
1455
1456             fscal            = felec;
1457
1458             /* Calculate temporary vectorial force */
1459             tx               = _mm_mul_ps(fscal,dx00);
1460             ty               = _mm_mul_ps(fscal,dy00);
1461             tz               = _mm_mul_ps(fscal,dz00);
1462
1463             /* Update vectorial force */
1464             fix0             = _mm_add_ps(fix0,tx);
1465             fiy0             = _mm_add_ps(fiy0,ty);
1466             fiz0             = _mm_add_ps(fiz0,tz);
1467
1468             fjx0             = _mm_add_ps(fjx0,tx);
1469             fjy0             = _mm_add_ps(fjy0,ty);
1470             fjz0             = _mm_add_ps(fjz0,tz);
1471
1472             /**************************
1473              * CALCULATE INTERACTIONS *
1474              **************************/
1475
1476             r01              = _mm_mul_ps(rsq01,rinv01);
1477
1478             /* EWALD ELECTROSTATICS */
1479
1480             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1481             ewrt             = _mm_mul_ps(r01,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(qq01,rinv01),_mm_sub_ps(rinvsq01,felec));
1489
1490             fscal            = felec;
1491
1492             /* Calculate temporary vectorial force */
1493             tx               = _mm_mul_ps(fscal,dx01);
1494             ty               = _mm_mul_ps(fscal,dy01);
1495             tz               = _mm_mul_ps(fscal,dz01);
1496
1497             /* Update vectorial force */
1498             fix0             = _mm_add_ps(fix0,tx);
1499             fiy0             = _mm_add_ps(fiy0,ty);
1500             fiz0             = _mm_add_ps(fiz0,tz);
1501
1502             fjx1             = _mm_add_ps(fjx1,tx);
1503             fjy1             = _mm_add_ps(fjy1,ty);
1504             fjz1             = _mm_add_ps(fjz1,tz);
1505
1506             /**************************
1507              * CALCULATE INTERACTIONS *
1508              **************************/
1509
1510             r02              = _mm_mul_ps(rsq02,rinv02);
1511
1512             /* EWALD ELECTROSTATICS */
1513
1514             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1515             ewrt             = _mm_mul_ps(r02,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(qq02,rinv02),_mm_sub_ps(rinvsq02,felec));
1523
1524             fscal            = felec;
1525
1526             /* Calculate temporary vectorial force */
1527             tx               = _mm_mul_ps(fscal,dx02);
1528             ty               = _mm_mul_ps(fscal,dy02);
1529             tz               = _mm_mul_ps(fscal,dz02);
1530
1531             /* Update vectorial force */
1532             fix0             = _mm_add_ps(fix0,tx);
1533             fiy0             = _mm_add_ps(fiy0,ty);
1534             fiz0             = _mm_add_ps(fiz0,tz);
1535
1536             fjx2             = _mm_add_ps(fjx2,tx);
1537             fjy2             = _mm_add_ps(fjy2,ty);
1538             fjz2             = _mm_add_ps(fjz2,tz);
1539
1540             /**************************
1541              * CALCULATE INTERACTIONS *
1542              **************************/
1543
1544             r10              = _mm_mul_ps(rsq10,rinv10);
1545
1546             /* EWALD ELECTROSTATICS */
1547
1548             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1549             ewrt             = _mm_mul_ps(r10,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(qq10,rinv10),_mm_sub_ps(rinvsq10,felec));
1557
1558             fscal            = felec;
1559
1560             /* Calculate temporary vectorial force */
1561             tx               = _mm_mul_ps(fscal,dx10);
1562             ty               = _mm_mul_ps(fscal,dy10);
1563             tz               = _mm_mul_ps(fscal,dz10);
1564
1565             /* Update vectorial force */
1566             fix1             = _mm_add_ps(fix1,tx);
1567             fiy1             = _mm_add_ps(fiy1,ty);
1568             fiz1             = _mm_add_ps(fiz1,tz);
1569
1570             fjx0             = _mm_add_ps(fjx0,tx);
1571             fjy0             = _mm_add_ps(fjy0,ty);
1572             fjz0             = _mm_add_ps(fjz0,tz);
1573
1574             /**************************
1575              * CALCULATE INTERACTIONS *
1576              **************************/
1577
1578             r11              = _mm_mul_ps(rsq11,rinv11);
1579
1580             /* EWALD ELECTROSTATICS */
1581
1582             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1583             ewrt             = _mm_mul_ps(r11,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(qq11,rinv11),_mm_sub_ps(rinvsq11,felec));
1591
1592             fscal            = felec;
1593
1594             /* Calculate temporary vectorial force */
1595             tx               = _mm_mul_ps(fscal,dx11);
1596             ty               = _mm_mul_ps(fscal,dy11);
1597             tz               = _mm_mul_ps(fscal,dz11);
1598
1599             /* Update vectorial force */
1600             fix1             = _mm_add_ps(fix1,tx);
1601             fiy1             = _mm_add_ps(fiy1,ty);
1602             fiz1             = _mm_add_ps(fiz1,tz);
1603
1604             fjx1             = _mm_add_ps(fjx1,tx);
1605             fjy1             = _mm_add_ps(fjy1,ty);
1606             fjz1             = _mm_add_ps(fjz1,tz);
1607
1608             /**************************
1609              * CALCULATE INTERACTIONS *
1610              **************************/
1611
1612             r12              = _mm_mul_ps(rsq12,rinv12);
1613
1614             /* EWALD ELECTROSTATICS */
1615
1616             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1617             ewrt             = _mm_mul_ps(r12,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(qq12,rinv12),_mm_sub_ps(rinvsq12,felec));
1625
1626             fscal            = felec;
1627
1628             /* Calculate temporary vectorial force */
1629             tx               = _mm_mul_ps(fscal,dx12);
1630             ty               = _mm_mul_ps(fscal,dy12);
1631             tz               = _mm_mul_ps(fscal,dz12);
1632
1633             /* Update vectorial force */
1634             fix1             = _mm_add_ps(fix1,tx);
1635             fiy1             = _mm_add_ps(fiy1,ty);
1636             fiz1             = _mm_add_ps(fiz1,tz);
1637
1638             fjx2             = _mm_add_ps(fjx2,tx);
1639             fjy2             = _mm_add_ps(fjy2,ty);
1640             fjz2             = _mm_add_ps(fjz2,tz);
1641
1642             /**************************
1643              * CALCULATE INTERACTIONS *
1644              **************************/
1645
1646             r20              = _mm_mul_ps(rsq20,rinv20);
1647
1648             /* EWALD ELECTROSTATICS */
1649
1650             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1651             ewrt             = _mm_mul_ps(r20,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(qq20,rinv20),_mm_sub_ps(rinvsq20,felec));
1659
1660             fscal            = felec;
1661
1662             /* Calculate temporary vectorial force */
1663             tx               = _mm_mul_ps(fscal,dx20);
1664             ty               = _mm_mul_ps(fscal,dy20);
1665             tz               = _mm_mul_ps(fscal,dz20);
1666
1667             /* Update vectorial force */
1668             fix2             = _mm_add_ps(fix2,tx);
1669             fiy2             = _mm_add_ps(fiy2,ty);
1670             fiz2             = _mm_add_ps(fiz2,tz);
1671
1672             fjx0             = _mm_add_ps(fjx0,tx);
1673             fjy0             = _mm_add_ps(fjy0,ty);
1674             fjz0             = _mm_add_ps(fjz0,tz);
1675
1676             /**************************
1677              * CALCULATE INTERACTIONS *
1678              **************************/
1679
1680             r21              = _mm_mul_ps(rsq21,rinv21);
1681
1682             /* EWALD ELECTROSTATICS */
1683
1684             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1685             ewrt             = _mm_mul_ps(r21,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(qq21,rinv21),_mm_sub_ps(rinvsq21,felec));
1693
1694             fscal            = felec;
1695
1696             /* Calculate temporary vectorial force */
1697             tx               = _mm_mul_ps(fscal,dx21);
1698             ty               = _mm_mul_ps(fscal,dy21);
1699             tz               = _mm_mul_ps(fscal,dz21);
1700
1701             /* Update vectorial force */
1702             fix2             = _mm_add_ps(fix2,tx);
1703             fiy2             = _mm_add_ps(fiy2,ty);
1704             fiz2             = _mm_add_ps(fiz2,tz);
1705
1706             fjx1             = _mm_add_ps(fjx1,tx);
1707             fjy1             = _mm_add_ps(fjy1,ty);
1708             fjz1             = _mm_add_ps(fjz1,tz);
1709
1710             /**************************
1711              * CALCULATE INTERACTIONS *
1712              **************************/
1713
1714             r22              = _mm_mul_ps(rsq22,rinv22);
1715
1716             /* EWALD ELECTROSTATICS */
1717
1718             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1719             ewrt             = _mm_mul_ps(r22,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(qq22,rinv22),_mm_sub_ps(rinvsq22,felec));
1727
1728             fscal            = felec;
1729
1730             /* Calculate temporary vectorial force */
1731             tx               = _mm_mul_ps(fscal,dx22);
1732             ty               = _mm_mul_ps(fscal,dy22);
1733             tz               = _mm_mul_ps(fscal,dz22);
1734
1735             /* Update vectorial force */
1736             fix2             = _mm_add_ps(fix2,tx);
1737             fiy2             = _mm_add_ps(fiy2,ty);
1738             fiz2             = _mm_add_ps(fiz2,tz);
1739
1740             fjx2             = _mm_add_ps(fjx2,tx);
1741             fjy2             = _mm_add_ps(fjy2,ty);
1742             fjz2             = _mm_add_ps(fjz2,tz);
1743
1744             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(f+j_coord_offsetA,f+j_coord_offsetB,
1745                                                    f+j_coord_offsetC,f+j_coord_offsetD,
1746                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
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,x+j_coord_offsetB,
1777                                               x+j_coord_offsetC,x+j_coord_offsetD,
1778                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1779
1780             /* Calculate displacement vector */
1781             dx00             = _mm_sub_ps(ix0,jx0);
1782             dy00             = _mm_sub_ps(iy0,jy0);
1783             dz00             = _mm_sub_ps(iz0,jz0);
1784             dx01             = _mm_sub_ps(ix0,jx1);
1785             dy01             = _mm_sub_ps(iy0,jy1);
1786             dz01             = _mm_sub_ps(iz0,jz1);
1787             dx02             = _mm_sub_ps(ix0,jx2);
1788             dy02             = _mm_sub_ps(iy0,jy2);
1789             dz02             = _mm_sub_ps(iz0,jz2);
1790             dx10             = _mm_sub_ps(ix1,jx0);
1791             dy10             = _mm_sub_ps(iy1,jy0);
1792             dz10             = _mm_sub_ps(iz1,jz0);
1793             dx11             = _mm_sub_ps(ix1,jx1);
1794             dy11             = _mm_sub_ps(iy1,jy1);
1795             dz11             = _mm_sub_ps(iz1,jz1);
1796             dx12             = _mm_sub_ps(ix1,jx2);
1797             dy12             = _mm_sub_ps(iy1,jy2);
1798             dz12             = _mm_sub_ps(iz1,jz2);
1799             dx20             = _mm_sub_ps(ix2,jx0);
1800             dy20             = _mm_sub_ps(iy2,jy0);
1801             dz20             = _mm_sub_ps(iz2,jz0);
1802             dx21             = _mm_sub_ps(ix2,jx1);
1803             dy21             = _mm_sub_ps(iy2,jy1);
1804             dz21             = _mm_sub_ps(iz2,jz1);
1805             dx22             = _mm_sub_ps(ix2,jx2);
1806             dy22             = _mm_sub_ps(iy2,jy2);
1807             dz22             = _mm_sub_ps(iz2,jz2);
1808
1809             /* Calculate squared distance and things based on it */
1810             rsq00            = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1811             rsq01            = gmx_mm_calc_rsq_ps(dx01,dy01,dz01);
1812             rsq02            = gmx_mm_calc_rsq_ps(dx02,dy02,dz02);
1813             rsq10            = gmx_mm_calc_rsq_ps(dx10,dy10,dz10);
1814             rsq11            = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1815             rsq12            = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1816             rsq20            = gmx_mm_calc_rsq_ps(dx20,dy20,dz20);
1817             rsq21            = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1818             rsq22            = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1819
1820             rinv00           = gmx_mm_invsqrt_ps(rsq00);
1821             rinv01           = gmx_mm_invsqrt_ps(rsq01);
1822             rinv02           = gmx_mm_invsqrt_ps(rsq02);
1823             rinv10           = gmx_mm_invsqrt_ps(rsq10);
1824             rinv11           = gmx_mm_invsqrt_ps(rsq11);
1825             rinv12           = gmx_mm_invsqrt_ps(rsq12);
1826             rinv20           = gmx_mm_invsqrt_ps(rsq20);
1827             rinv21           = gmx_mm_invsqrt_ps(rsq21);
1828             rinv22           = gmx_mm_invsqrt_ps(rsq22);
1829
1830             rinvsq00         = _mm_mul_ps(rinv00,rinv00);
1831             rinvsq01         = _mm_mul_ps(rinv01,rinv01);
1832             rinvsq02         = _mm_mul_ps(rinv02,rinv02);
1833             rinvsq10         = _mm_mul_ps(rinv10,rinv10);
1834             rinvsq11         = _mm_mul_ps(rinv11,rinv11);
1835             rinvsq12         = _mm_mul_ps(rinv12,rinv12);
1836             rinvsq20         = _mm_mul_ps(rinv20,rinv20);
1837             rinvsq21         = _mm_mul_ps(rinv21,rinv21);
1838             rinvsq22         = _mm_mul_ps(rinv22,rinv22);
1839
1840             fjx0             = _mm_setzero_ps();
1841             fjy0             = _mm_setzero_ps();
1842             fjz0             = _mm_setzero_ps();
1843             fjx1             = _mm_setzero_ps();
1844             fjy1             = _mm_setzero_ps();
1845             fjz1             = _mm_setzero_ps();
1846             fjx2             = _mm_setzero_ps();
1847             fjy2             = _mm_setzero_ps();
1848             fjz2             = _mm_setzero_ps();
1849
1850             /**************************
1851              * CALCULATE INTERACTIONS *
1852              **************************/
1853
1854             r00              = _mm_mul_ps(rsq00,rinv00);
1855             r00              = _mm_andnot_ps(dummy_mask,r00);
1856
1857             /* EWALD ELECTROSTATICS */
1858
1859             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1860             ewrt             = _mm_mul_ps(r00,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(qq00,rinv00),_mm_sub_ps(rinvsq00,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,dx00);
1875             ty               = _mm_mul_ps(fscal,dy00);
1876             tz               = _mm_mul_ps(fscal,dz00);
1877
1878             /* Update vectorial force */
1879             fix0             = _mm_add_ps(fix0,tx);
1880             fiy0             = _mm_add_ps(fiy0,ty);
1881             fiz0             = _mm_add_ps(fiz0,tz);
1882
1883             fjx0             = _mm_add_ps(fjx0,tx);
1884             fjy0             = _mm_add_ps(fjy0,ty);
1885             fjz0             = _mm_add_ps(fjz0,tz);
1886
1887             /**************************
1888              * CALCULATE INTERACTIONS *
1889              **************************/
1890
1891             r01              = _mm_mul_ps(rsq01,rinv01);
1892             r01              = _mm_andnot_ps(dummy_mask,r01);
1893
1894             /* EWALD ELECTROSTATICS */
1895
1896             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1897             ewrt             = _mm_mul_ps(r01,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(qq01,rinv01),_mm_sub_ps(rinvsq01,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,dx01);
1912             ty               = _mm_mul_ps(fscal,dy01);
1913             tz               = _mm_mul_ps(fscal,dz01);
1914
1915             /* Update vectorial force */
1916             fix0             = _mm_add_ps(fix0,tx);
1917             fiy0             = _mm_add_ps(fiy0,ty);
1918             fiz0             = _mm_add_ps(fiz0,tz);
1919
1920             fjx1             = _mm_add_ps(fjx1,tx);
1921             fjy1             = _mm_add_ps(fjy1,ty);
1922             fjz1             = _mm_add_ps(fjz1,tz);
1923
1924             /**************************
1925              * CALCULATE INTERACTIONS *
1926              **************************/
1927
1928             r02              = _mm_mul_ps(rsq02,rinv02);
1929             r02              = _mm_andnot_ps(dummy_mask,r02);
1930
1931             /* EWALD ELECTROSTATICS */
1932
1933             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1934             ewrt             = _mm_mul_ps(r02,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(qq02,rinv02),_mm_sub_ps(rinvsq02,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,dx02);
1949             ty               = _mm_mul_ps(fscal,dy02);
1950             tz               = _mm_mul_ps(fscal,dz02);
1951
1952             /* Update vectorial force */
1953             fix0             = _mm_add_ps(fix0,tx);
1954             fiy0             = _mm_add_ps(fiy0,ty);
1955             fiz0             = _mm_add_ps(fiz0,tz);
1956
1957             fjx2             = _mm_add_ps(fjx2,tx);
1958             fjy2             = _mm_add_ps(fjy2,ty);
1959             fjz2             = _mm_add_ps(fjz2,tz);
1960
1961             /**************************
1962              * CALCULATE INTERACTIONS *
1963              **************************/
1964
1965             r10              = _mm_mul_ps(rsq10,rinv10);
1966             r10              = _mm_andnot_ps(dummy_mask,r10);
1967
1968             /* EWALD ELECTROSTATICS */
1969
1970             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
1971             ewrt             = _mm_mul_ps(r10,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(qq10,rinv10),_mm_sub_ps(rinvsq10,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,dx10);
1986             ty               = _mm_mul_ps(fscal,dy10);
1987             tz               = _mm_mul_ps(fscal,dz10);
1988
1989             /* Update vectorial force */
1990             fix1             = _mm_add_ps(fix1,tx);
1991             fiy1             = _mm_add_ps(fiy1,ty);
1992             fiz1             = _mm_add_ps(fiz1,tz);
1993
1994             fjx0             = _mm_add_ps(fjx0,tx);
1995             fjy0             = _mm_add_ps(fjy0,ty);
1996             fjz0             = _mm_add_ps(fjz0,tz);
1997
1998             /**************************
1999              * CALCULATE INTERACTIONS *
2000              **************************/
2001
2002             r11              = _mm_mul_ps(rsq11,rinv11);
2003             r11              = _mm_andnot_ps(dummy_mask,r11);
2004
2005             /* EWALD ELECTROSTATICS */
2006
2007             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2008             ewrt             = _mm_mul_ps(r11,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(qq11,rinv11),_mm_sub_ps(rinvsq11,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,dx11);
2023             ty               = _mm_mul_ps(fscal,dy11);
2024             tz               = _mm_mul_ps(fscal,dz11);
2025
2026             /* Update vectorial force */
2027             fix1             = _mm_add_ps(fix1,tx);
2028             fiy1             = _mm_add_ps(fiy1,ty);
2029             fiz1             = _mm_add_ps(fiz1,tz);
2030
2031             fjx1             = _mm_add_ps(fjx1,tx);
2032             fjy1             = _mm_add_ps(fjy1,ty);
2033             fjz1             = _mm_add_ps(fjz1,tz);
2034
2035             /**************************
2036              * CALCULATE INTERACTIONS *
2037              **************************/
2038
2039             r12              = _mm_mul_ps(rsq12,rinv12);
2040             r12              = _mm_andnot_ps(dummy_mask,r12);
2041
2042             /* EWALD ELECTROSTATICS */
2043
2044             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2045             ewrt             = _mm_mul_ps(r12,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(qq12,rinv12),_mm_sub_ps(rinvsq12,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,dx12);
2060             ty               = _mm_mul_ps(fscal,dy12);
2061             tz               = _mm_mul_ps(fscal,dz12);
2062
2063             /* Update vectorial force */
2064             fix1             = _mm_add_ps(fix1,tx);
2065             fiy1             = _mm_add_ps(fiy1,ty);
2066             fiz1             = _mm_add_ps(fiz1,tz);
2067
2068             fjx2             = _mm_add_ps(fjx2,tx);
2069             fjy2             = _mm_add_ps(fjy2,ty);
2070             fjz2             = _mm_add_ps(fjz2,tz);
2071
2072             /**************************
2073              * CALCULATE INTERACTIONS *
2074              **************************/
2075
2076             r20              = _mm_mul_ps(rsq20,rinv20);
2077             r20              = _mm_andnot_ps(dummy_mask,r20);
2078
2079             /* EWALD ELECTROSTATICS */
2080
2081             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2082             ewrt             = _mm_mul_ps(r20,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(qq20,rinv20),_mm_sub_ps(rinvsq20,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,dx20);
2097             ty               = _mm_mul_ps(fscal,dy20);
2098             tz               = _mm_mul_ps(fscal,dz20);
2099
2100             /* Update vectorial force */
2101             fix2             = _mm_add_ps(fix2,tx);
2102             fiy2             = _mm_add_ps(fiy2,ty);
2103             fiz2             = _mm_add_ps(fiz2,tz);
2104
2105             fjx0             = _mm_add_ps(fjx0,tx);
2106             fjy0             = _mm_add_ps(fjy0,ty);
2107             fjz0             = _mm_add_ps(fjz0,tz);
2108
2109             /**************************
2110              * CALCULATE INTERACTIONS *
2111              **************************/
2112
2113             r21              = _mm_mul_ps(rsq21,rinv21);
2114             r21              = _mm_andnot_ps(dummy_mask,r21);
2115
2116             /* EWALD ELECTROSTATICS */
2117
2118             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2119             ewrt             = _mm_mul_ps(r21,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(qq21,rinv21),_mm_sub_ps(rinvsq21,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,dx21);
2134             ty               = _mm_mul_ps(fscal,dy21);
2135             tz               = _mm_mul_ps(fscal,dz21);
2136
2137             /* Update vectorial force */
2138             fix2             = _mm_add_ps(fix2,tx);
2139             fiy2             = _mm_add_ps(fiy2,ty);
2140             fiz2             = _mm_add_ps(fiz2,tz);
2141
2142             fjx1             = _mm_add_ps(fjx1,tx);
2143             fjy1             = _mm_add_ps(fjy1,ty);
2144             fjz1             = _mm_add_ps(fjz1,tz);
2145
2146             /**************************
2147              * CALCULATE INTERACTIONS *
2148              **************************/
2149
2150             r22              = _mm_mul_ps(rsq22,rinv22);
2151             r22              = _mm_andnot_ps(dummy_mask,r22);
2152
2153             /* EWALD ELECTROSTATICS */
2154
2155             /* Calculate Ewald table index by multiplying r with scale and truncate to integer */
2156             ewrt             = _mm_mul_ps(r22,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(qq22,rinv22),_mm_sub_ps(rinvsq22,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,dx22);
2171             ty               = _mm_mul_ps(fscal,dy22);
2172             tz               = _mm_mul_ps(fscal,dz22);
2173
2174             /* Update vectorial force */
2175             fix2             = _mm_add_ps(fix2,tx);
2176             fiy2             = _mm_add_ps(fiy2,ty);
2177             fiz2             = _mm_add_ps(fiz2,tz);
2178
2179             fjx2             = _mm_add_ps(fjx2,tx);
2180             fjy2             = _mm_add_ps(fjy2,ty);
2181             fjz2             = _mm_add_ps(fjz2,tz);
2182
2183             gmx_mm_decrement_3rvec_4ptr_swizzle_ps(f+j_coord_offsetA,f+j_coord_offsetB,
2184                                                    f+j_coord_offsetC,f+j_coord_offsetD,
2185                                                    fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
2186
2187             /* Inner loop uses 333 flops */
2188         }
2189
2190         /* End of innermost loop */
2191
2192         gmx_mm_update_iforce_3atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
2193                                               f+i_coord_offset,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_W3W3_F,outeriter*27 + inneriter*333);
2207 }