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