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