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