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