763170a81f3f9d802587e2c577f633dc04efea87
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_sse4_1_double / nb_kernel_ElecEw_VdwLJ_GeomW3W3_sse4_1_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 sse4_1_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_sse4_1_double.h"
48 #include "kernelutil_x86_sse4_1_double.h"
49
50 /*
51  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwLJ_GeomW3W3_VF_sse4_1_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_sse4_1_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,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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
297             ewitab           = _mm_slli_epi32(ewitab,2);
298             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
299             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
300             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
301             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
302             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
303             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
304             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
305             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
306             velec            = _mm_mul_pd(qq00,_mm_sub_pd(rinv00,velec));
307             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
308
309             /* LENNARD-JONES DISPERSION/REPULSION */
310
311             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
312             vvdw6            = _mm_mul_pd(c6_00,rinvsix);
313             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
314             vvdw             = _mm_sub_pd( _mm_mul_pd(vvdw12,one_twelfth) , _mm_mul_pd(vvdw6,one_sixth) );
315             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,vvdw6),rinvsq00);
316
317             /* Update potential sum for this i atom from the interaction with this j atom. */
318             velecsum         = _mm_add_pd(velecsum,velec);
319             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
320
321             fscal            = _mm_add_pd(felec,fvdw);
322
323             /* Calculate temporary vectorial force */
324             tx               = _mm_mul_pd(fscal,dx00);
325             ty               = _mm_mul_pd(fscal,dy00);
326             tz               = _mm_mul_pd(fscal,dz00);
327
328             /* Update vectorial force */
329             fix0             = _mm_add_pd(fix0,tx);
330             fiy0             = _mm_add_pd(fiy0,ty);
331             fiz0             = _mm_add_pd(fiz0,tz);
332
333             fjx0             = _mm_add_pd(fjx0,tx);
334             fjy0             = _mm_add_pd(fjy0,ty);
335             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
349             ewitab           = _mm_slli_epi32(ewitab,2);
350             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
351             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
352             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
353             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
354             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
355             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
356             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
357             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
358             velec            = _mm_mul_pd(qq01,_mm_sub_pd(rinv01,velec));
359             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
360
361             /* Update potential sum for this i atom from the interaction with this j atom. */
362             velecsum         = _mm_add_pd(velecsum,velec);
363
364             fscal            = felec;
365
366             /* Calculate temporary vectorial force */
367             tx               = _mm_mul_pd(fscal,dx01);
368             ty               = _mm_mul_pd(fscal,dy01);
369             tz               = _mm_mul_pd(fscal,dz01);
370
371             /* Update vectorial force */
372             fix0             = _mm_add_pd(fix0,tx);
373             fiy0             = _mm_add_pd(fiy0,ty);
374             fiz0             = _mm_add_pd(fiz0,tz);
375
376             fjx1             = _mm_add_pd(fjx1,tx);
377             fjy1             = _mm_add_pd(fjy1,ty);
378             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
392             ewitab           = _mm_slli_epi32(ewitab,2);
393             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
394             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
395             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
396             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
397             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
398             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
399             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
400             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
401             velec            = _mm_mul_pd(qq02,_mm_sub_pd(rinv02,velec));
402             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
403
404             /* Update potential sum for this i atom from the interaction with this j atom. */
405             velecsum         = _mm_add_pd(velecsum,velec);
406
407             fscal            = felec;
408
409             /* Calculate temporary vectorial force */
410             tx               = _mm_mul_pd(fscal,dx02);
411             ty               = _mm_mul_pd(fscal,dy02);
412             tz               = _mm_mul_pd(fscal,dz02);
413
414             /* Update vectorial force */
415             fix0             = _mm_add_pd(fix0,tx);
416             fiy0             = _mm_add_pd(fiy0,ty);
417             fiz0             = _mm_add_pd(fiz0,tz);
418
419             fjx2             = _mm_add_pd(fjx2,tx);
420             fjy2             = _mm_add_pd(fjy2,ty);
421             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
435             ewitab           = _mm_slli_epi32(ewitab,2);
436             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
437             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
438             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
439             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
440             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
441             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
442             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
443             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
444             velec            = _mm_mul_pd(qq10,_mm_sub_pd(rinv10,velec));
445             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
446
447             /* Update potential sum for this i atom from the interaction with this j atom. */
448             velecsum         = _mm_add_pd(velecsum,velec);
449
450             fscal            = felec;
451
452             /* Calculate temporary vectorial force */
453             tx               = _mm_mul_pd(fscal,dx10);
454             ty               = _mm_mul_pd(fscal,dy10);
455             tz               = _mm_mul_pd(fscal,dz10);
456
457             /* Update vectorial force */
458             fix1             = _mm_add_pd(fix1,tx);
459             fiy1             = _mm_add_pd(fiy1,ty);
460             fiz1             = _mm_add_pd(fiz1,tz);
461
462             fjx0             = _mm_add_pd(fjx0,tx);
463             fjy0             = _mm_add_pd(fjy0,ty);
464             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
478             ewitab           = _mm_slli_epi32(ewitab,2);
479             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
480             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
481             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
482             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
483             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
484             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
485             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
486             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
487             velec            = _mm_mul_pd(qq11,_mm_sub_pd(rinv11,velec));
488             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
489
490             /* Update potential sum for this i atom from the interaction with this j atom. */
491             velecsum         = _mm_add_pd(velecsum,velec);
492
493             fscal            = felec;
494
495             /* Calculate temporary vectorial force */
496             tx               = _mm_mul_pd(fscal,dx11);
497             ty               = _mm_mul_pd(fscal,dy11);
498             tz               = _mm_mul_pd(fscal,dz11);
499
500             /* Update vectorial force */
501             fix1             = _mm_add_pd(fix1,tx);
502             fiy1             = _mm_add_pd(fiy1,ty);
503             fiz1             = _mm_add_pd(fiz1,tz);
504
505             fjx1             = _mm_add_pd(fjx1,tx);
506             fjy1             = _mm_add_pd(fjy1,ty);
507             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
521             ewitab           = _mm_slli_epi32(ewitab,2);
522             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
523             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
524             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
525             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
526             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
527             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
528             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
529             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
530             velec            = _mm_mul_pd(qq12,_mm_sub_pd(rinv12,velec));
531             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
532
533             /* Update potential sum for this i atom from the interaction with this j atom. */
534             velecsum         = _mm_add_pd(velecsum,velec);
535
536             fscal            = felec;
537
538             /* Calculate temporary vectorial force */
539             tx               = _mm_mul_pd(fscal,dx12);
540             ty               = _mm_mul_pd(fscal,dy12);
541             tz               = _mm_mul_pd(fscal,dz12);
542
543             /* Update vectorial force */
544             fix1             = _mm_add_pd(fix1,tx);
545             fiy1             = _mm_add_pd(fiy1,ty);
546             fiz1             = _mm_add_pd(fiz1,tz);
547
548             fjx2             = _mm_add_pd(fjx2,tx);
549             fjy2             = _mm_add_pd(fjy2,ty);
550             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
564             ewitab           = _mm_slli_epi32(ewitab,2);
565             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
566             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
567             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
568             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
569             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
570             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
571             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
572             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
573             velec            = _mm_mul_pd(qq20,_mm_sub_pd(rinv20,velec));
574             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
575
576             /* Update potential sum for this i atom from the interaction with this j atom. */
577             velecsum         = _mm_add_pd(velecsum,velec);
578
579             fscal            = felec;
580
581             /* Calculate temporary vectorial force */
582             tx               = _mm_mul_pd(fscal,dx20);
583             ty               = _mm_mul_pd(fscal,dy20);
584             tz               = _mm_mul_pd(fscal,dz20);
585
586             /* Update vectorial force */
587             fix2             = _mm_add_pd(fix2,tx);
588             fiy2             = _mm_add_pd(fiy2,ty);
589             fiz2             = _mm_add_pd(fiz2,tz);
590
591             fjx0             = _mm_add_pd(fjx0,tx);
592             fjy0             = _mm_add_pd(fjy0,ty);
593             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
607             ewitab           = _mm_slli_epi32(ewitab,2);
608             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
609             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
610             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
611             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
612             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
613             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
614             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
615             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
616             velec            = _mm_mul_pd(qq21,_mm_sub_pd(rinv21,velec));
617             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
618
619             /* Update potential sum for this i atom from the interaction with this j atom. */
620             velecsum         = _mm_add_pd(velecsum,velec);
621
622             fscal            = felec;
623
624             /* Calculate temporary vectorial force */
625             tx               = _mm_mul_pd(fscal,dx21);
626             ty               = _mm_mul_pd(fscal,dy21);
627             tz               = _mm_mul_pd(fscal,dz21);
628
629             /* Update vectorial force */
630             fix2             = _mm_add_pd(fix2,tx);
631             fiy2             = _mm_add_pd(fiy2,ty);
632             fiz2             = _mm_add_pd(fiz2,tz);
633
634             fjx1             = _mm_add_pd(fjx1,tx);
635             fjy1             = _mm_add_pd(fjy1,ty);
636             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
650             ewitab           = _mm_slli_epi32(ewitab,2);
651             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
652             ewtabD           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,1) );
653             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
654             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
655             ewtabFn          = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,1) +2);
656             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
657             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
658             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
659             velec            = _mm_mul_pd(qq22,_mm_sub_pd(rinv22,velec));
660             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
661
662             /* Update potential sum for this i atom from the interaction with this j atom. */
663             velecsum         = _mm_add_pd(velecsum,velec);
664
665             fscal            = felec;
666
667             /* Calculate temporary vectorial force */
668             tx               = _mm_mul_pd(fscal,dx22);
669             ty               = _mm_mul_pd(fscal,dy22);
670             tz               = _mm_mul_pd(fscal,dz22);
671
672             /* Update vectorial force */
673             fix2             = _mm_add_pd(fix2,tx);
674             fiy2             = _mm_add_pd(fiy2,ty);
675             fiz2             = _mm_add_pd(fiz2,tz);
676
677             fjx2             = _mm_add_pd(fjx2,tx);
678             fjy2             = _mm_add_pd(fjy2,ty);
679             fjz2             = _mm_add_pd(fjz2,tz);
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 381 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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
778             ewitab           = _mm_slli_epi32(ewitab,2);
779             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
780             ewtabD           = _mm_setzero_pd();
781             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
782             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
783             ewtabFn          = _mm_setzero_pd();
784             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
785             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
786             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
787             velec            = _mm_mul_pd(qq00,_mm_sub_pd(rinv00,velec));
788             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
789
790             /* LENNARD-JONES DISPERSION/REPULSION */
791
792             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
793             vvdw6            = _mm_mul_pd(c6_00,rinvsix);
794             vvdw12           = _mm_mul_pd(c12_00,_mm_mul_pd(rinvsix,rinvsix));
795             vvdw             = _mm_sub_pd( _mm_mul_pd(vvdw12,one_twelfth) , _mm_mul_pd(vvdw6,one_sixth) );
796             fvdw             = _mm_mul_pd(_mm_sub_pd(vvdw12,vvdw6),rinvsq00);
797
798             /* Update potential sum for this i atom from the interaction with this j atom. */
799             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
800             velecsum         = _mm_add_pd(velecsum,velec);
801             vvdw             = _mm_unpacklo_pd(vvdw,_mm_setzero_pd());
802             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
803
804             fscal            = _mm_add_pd(felec,fvdw);
805
806             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
807
808             /* Calculate temporary vectorial force */
809             tx               = _mm_mul_pd(fscal,dx00);
810             ty               = _mm_mul_pd(fscal,dy00);
811             tz               = _mm_mul_pd(fscal,dz00);
812
813             /* Update vectorial force */
814             fix0             = _mm_add_pd(fix0,tx);
815             fiy0             = _mm_add_pd(fiy0,ty);
816             fiz0             = _mm_add_pd(fiz0,tz);
817
818             fjx0             = _mm_add_pd(fjx0,tx);
819             fjy0             = _mm_add_pd(fjy0,ty);
820             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
834             ewitab           = _mm_slli_epi32(ewitab,2);
835             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
836             ewtabD           = _mm_setzero_pd();
837             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
838             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
839             ewtabFn          = _mm_setzero_pd();
840             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
841             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
842             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
843             velec            = _mm_mul_pd(qq01,_mm_sub_pd(rinv01,velec));
844             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
845
846             /* Update potential sum for this i atom from the interaction with this j atom. */
847             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
848             velecsum         = _mm_add_pd(velecsum,velec);
849
850             fscal            = felec;
851
852             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
853
854             /* Calculate temporary vectorial force */
855             tx               = _mm_mul_pd(fscal,dx01);
856             ty               = _mm_mul_pd(fscal,dy01);
857             tz               = _mm_mul_pd(fscal,dz01);
858
859             /* Update vectorial force */
860             fix0             = _mm_add_pd(fix0,tx);
861             fiy0             = _mm_add_pd(fiy0,ty);
862             fiz0             = _mm_add_pd(fiz0,tz);
863
864             fjx1             = _mm_add_pd(fjx1,tx);
865             fjy1             = _mm_add_pd(fjy1,ty);
866             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
880             ewitab           = _mm_slli_epi32(ewitab,2);
881             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
882             ewtabD           = _mm_setzero_pd();
883             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
884             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
885             ewtabFn          = _mm_setzero_pd();
886             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
887             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
888             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
889             velec            = _mm_mul_pd(qq02,_mm_sub_pd(rinv02,velec));
890             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
891
892             /* Update potential sum for this i atom from the interaction with this j atom. */
893             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
894             velecsum         = _mm_add_pd(velecsum,velec);
895
896             fscal            = felec;
897
898             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
899
900             /* Calculate temporary vectorial force */
901             tx               = _mm_mul_pd(fscal,dx02);
902             ty               = _mm_mul_pd(fscal,dy02);
903             tz               = _mm_mul_pd(fscal,dz02);
904
905             /* Update vectorial force */
906             fix0             = _mm_add_pd(fix0,tx);
907             fiy0             = _mm_add_pd(fiy0,ty);
908             fiz0             = _mm_add_pd(fiz0,tz);
909
910             fjx2             = _mm_add_pd(fjx2,tx);
911             fjy2             = _mm_add_pd(fjy2,ty);
912             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
926             ewitab           = _mm_slli_epi32(ewitab,2);
927             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
928             ewtabD           = _mm_setzero_pd();
929             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
930             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
931             ewtabFn          = _mm_setzero_pd();
932             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
933             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
934             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
935             velec            = _mm_mul_pd(qq10,_mm_sub_pd(rinv10,velec));
936             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
937
938             /* Update potential sum for this i atom from the interaction with this j atom. */
939             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
940             velecsum         = _mm_add_pd(velecsum,velec);
941
942             fscal            = felec;
943
944             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
945
946             /* Calculate temporary vectorial force */
947             tx               = _mm_mul_pd(fscal,dx10);
948             ty               = _mm_mul_pd(fscal,dy10);
949             tz               = _mm_mul_pd(fscal,dz10);
950
951             /* Update vectorial force */
952             fix1             = _mm_add_pd(fix1,tx);
953             fiy1             = _mm_add_pd(fiy1,ty);
954             fiz1             = _mm_add_pd(fiz1,tz);
955
956             fjx0             = _mm_add_pd(fjx0,tx);
957             fjy0             = _mm_add_pd(fjy0,ty);
958             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
972             ewitab           = _mm_slli_epi32(ewitab,2);
973             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
974             ewtabD           = _mm_setzero_pd();
975             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
976             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
977             ewtabFn          = _mm_setzero_pd();
978             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
979             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
980             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
981             velec            = _mm_mul_pd(qq11,_mm_sub_pd(rinv11,velec));
982             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
983
984             /* Update potential sum for this i atom from the interaction with this j atom. */
985             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
986             velecsum         = _mm_add_pd(velecsum,velec);
987
988             fscal            = felec;
989
990             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
991
992             /* Calculate temporary vectorial force */
993             tx               = _mm_mul_pd(fscal,dx11);
994             ty               = _mm_mul_pd(fscal,dy11);
995             tz               = _mm_mul_pd(fscal,dz11);
996
997             /* Update vectorial force */
998             fix1             = _mm_add_pd(fix1,tx);
999             fiy1             = _mm_add_pd(fiy1,ty);
1000             fiz1             = _mm_add_pd(fiz1,tz);
1001
1002             fjx1             = _mm_add_pd(fjx1,tx);
1003             fjy1             = _mm_add_pd(fjy1,ty);
1004             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1018             ewitab           = _mm_slli_epi32(ewitab,2);
1019             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1020             ewtabD           = _mm_setzero_pd();
1021             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1022             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1023             ewtabFn          = _mm_setzero_pd();
1024             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1025             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1026             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1027             velec            = _mm_mul_pd(qq12,_mm_sub_pd(rinv12,velec));
1028             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1029
1030             /* Update potential sum for this i atom from the interaction with this j atom. */
1031             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1032             velecsum         = _mm_add_pd(velecsum,velec);
1033
1034             fscal            = felec;
1035
1036             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1037
1038             /* Calculate temporary vectorial force */
1039             tx               = _mm_mul_pd(fscal,dx12);
1040             ty               = _mm_mul_pd(fscal,dy12);
1041             tz               = _mm_mul_pd(fscal,dz12);
1042
1043             /* Update vectorial force */
1044             fix1             = _mm_add_pd(fix1,tx);
1045             fiy1             = _mm_add_pd(fiy1,ty);
1046             fiz1             = _mm_add_pd(fiz1,tz);
1047
1048             fjx2             = _mm_add_pd(fjx2,tx);
1049             fjy2             = _mm_add_pd(fjy2,ty);
1050             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1064             ewitab           = _mm_slli_epi32(ewitab,2);
1065             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1066             ewtabD           = _mm_setzero_pd();
1067             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1068             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1069             ewtabFn          = _mm_setzero_pd();
1070             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1071             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1072             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1073             velec            = _mm_mul_pd(qq20,_mm_sub_pd(rinv20,velec));
1074             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
1075
1076             /* Update potential sum for this i atom from the interaction with this j atom. */
1077             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1078             velecsum         = _mm_add_pd(velecsum,velec);
1079
1080             fscal            = felec;
1081
1082             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1083
1084             /* Calculate temporary vectorial force */
1085             tx               = _mm_mul_pd(fscal,dx20);
1086             ty               = _mm_mul_pd(fscal,dy20);
1087             tz               = _mm_mul_pd(fscal,dz20);
1088
1089             /* Update vectorial force */
1090             fix2             = _mm_add_pd(fix2,tx);
1091             fiy2             = _mm_add_pd(fiy2,ty);
1092             fiz2             = _mm_add_pd(fiz2,tz);
1093
1094             fjx0             = _mm_add_pd(fjx0,tx);
1095             fjy0             = _mm_add_pd(fjy0,ty);
1096             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1110             ewitab           = _mm_slli_epi32(ewitab,2);
1111             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1112             ewtabD           = _mm_setzero_pd();
1113             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1114             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1115             ewtabFn          = _mm_setzero_pd();
1116             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1117             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1118             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1119             velec            = _mm_mul_pd(qq21,_mm_sub_pd(rinv21,velec));
1120             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
1121
1122             /* Update potential sum for this i atom from the interaction with this j atom. */
1123             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1124             velecsum         = _mm_add_pd(velecsum,velec);
1125
1126             fscal            = felec;
1127
1128             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1129
1130             /* Calculate temporary vectorial force */
1131             tx               = _mm_mul_pd(fscal,dx21);
1132             ty               = _mm_mul_pd(fscal,dy21);
1133             tz               = _mm_mul_pd(fscal,dz21);
1134
1135             /* Update vectorial force */
1136             fix2             = _mm_add_pd(fix2,tx);
1137             fiy2             = _mm_add_pd(fiy2,ty);
1138             fiz2             = _mm_add_pd(fiz2,tz);
1139
1140             fjx1             = _mm_add_pd(fjx1,tx);
1141             fjy1             = _mm_add_pd(fjy1,ty);
1142             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1156             ewitab           = _mm_slli_epi32(ewitab,2);
1157             ewtabF           = _mm_load_pd( ewtab + gmx_mm_extract_epi32(ewitab,0) );
1158             ewtabD           = _mm_setzero_pd();
1159             GMX_MM_TRANSPOSE2_PD(ewtabF,ewtabD);
1160             ewtabV           = _mm_load_sd( ewtab + gmx_mm_extract_epi32(ewitab,0) +2);
1161             ewtabFn          = _mm_setzero_pd();
1162             GMX_MM_TRANSPOSE2_PD(ewtabV,ewtabFn);
1163             felec            = _mm_add_pd(ewtabF,_mm_mul_pd(eweps,ewtabD));
1164             velec            = _mm_sub_pd(ewtabV,_mm_mul_pd(_mm_mul_pd(ewtabhalfspace,eweps),_mm_add_pd(ewtabF,felec)));
1165             velec            = _mm_mul_pd(qq22,_mm_sub_pd(rinv22,velec));
1166             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
1167
1168             /* Update potential sum for this i atom from the interaction with this j atom. */
1169             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
1170             velecsum         = _mm_add_pd(velecsum,velec);
1171
1172             fscal            = felec;
1173
1174             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1175
1176             /* Calculate temporary vectorial force */
1177             tx               = _mm_mul_pd(fscal,dx22);
1178             ty               = _mm_mul_pd(fscal,dy22);
1179             tz               = _mm_mul_pd(fscal,dz22);
1180
1181             /* Update vectorial force */
1182             fix2             = _mm_add_pd(fix2,tx);
1183             fiy2             = _mm_add_pd(fiy2,ty);
1184             fiz2             = _mm_add_pd(fiz2,tz);
1185
1186             fjx2             = _mm_add_pd(fjx2,tx);
1187             fjy2             = _mm_add_pd(fjy2,ty);
1188             fjz2             = _mm_add_pd(fjz2,tz);
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 381 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*381);
1217 }
1218 /*
1219  * Gromacs nonbonded kernel:   nb_kernel_ElecEw_VdwLJ_GeomW3W3_F_sse4_1_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_sse4_1_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,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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1461             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1462                                          &ewtabF,&ewtabFn);
1463             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1464             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
1465
1466             /* LENNARD-JONES DISPERSION/REPULSION */
1467
1468             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
1469             fvdw             = _mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),c6_00),_mm_mul_pd(rinvsix,rinvsq00));
1470
1471             fscal            = _mm_add_pd(felec,fvdw);
1472
1473             /* Calculate temporary vectorial force */
1474             tx               = _mm_mul_pd(fscal,dx00);
1475             ty               = _mm_mul_pd(fscal,dy00);
1476             tz               = _mm_mul_pd(fscal,dz00);
1477
1478             /* Update vectorial force */
1479             fix0             = _mm_add_pd(fix0,tx);
1480             fiy0             = _mm_add_pd(fiy0,ty);
1481             fiz0             = _mm_add_pd(fiz0,tz);
1482
1483             fjx0             = _mm_add_pd(fjx0,tx);
1484             fjy0             = _mm_add_pd(fjy0,ty);
1485             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1499             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1500                                          &ewtabF,&ewtabFn);
1501             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1502             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
1503
1504             fscal            = felec;
1505
1506             /* Calculate temporary vectorial force */
1507             tx               = _mm_mul_pd(fscal,dx01);
1508             ty               = _mm_mul_pd(fscal,dy01);
1509             tz               = _mm_mul_pd(fscal,dz01);
1510
1511             /* Update vectorial force */
1512             fix0             = _mm_add_pd(fix0,tx);
1513             fiy0             = _mm_add_pd(fiy0,ty);
1514             fiz0             = _mm_add_pd(fiz0,tz);
1515
1516             fjx1             = _mm_add_pd(fjx1,tx);
1517             fjy1             = _mm_add_pd(fjy1,ty);
1518             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1532             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1533                                          &ewtabF,&ewtabFn);
1534             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1535             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
1536
1537             fscal            = felec;
1538
1539             /* Calculate temporary vectorial force */
1540             tx               = _mm_mul_pd(fscal,dx02);
1541             ty               = _mm_mul_pd(fscal,dy02);
1542             tz               = _mm_mul_pd(fscal,dz02);
1543
1544             /* Update vectorial force */
1545             fix0             = _mm_add_pd(fix0,tx);
1546             fiy0             = _mm_add_pd(fiy0,ty);
1547             fiz0             = _mm_add_pd(fiz0,tz);
1548
1549             fjx2             = _mm_add_pd(fjx2,tx);
1550             fjy2             = _mm_add_pd(fjy2,ty);
1551             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1565             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1566                                          &ewtabF,&ewtabFn);
1567             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1568             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
1569
1570             fscal            = felec;
1571
1572             /* Calculate temporary vectorial force */
1573             tx               = _mm_mul_pd(fscal,dx10);
1574             ty               = _mm_mul_pd(fscal,dy10);
1575             tz               = _mm_mul_pd(fscal,dz10);
1576
1577             /* Update vectorial force */
1578             fix1             = _mm_add_pd(fix1,tx);
1579             fiy1             = _mm_add_pd(fiy1,ty);
1580             fiz1             = _mm_add_pd(fiz1,tz);
1581
1582             fjx0             = _mm_add_pd(fjx0,tx);
1583             fjy0             = _mm_add_pd(fjy0,ty);
1584             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1598             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1599                                          &ewtabF,&ewtabFn);
1600             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1601             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1602
1603             fscal            = felec;
1604
1605             /* Calculate temporary vectorial force */
1606             tx               = _mm_mul_pd(fscal,dx11);
1607             ty               = _mm_mul_pd(fscal,dy11);
1608             tz               = _mm_mul_pd(fscal,dz11);
1609
1610             /* Update vectorial force */
1611             fix1             = _mm_add_pd(fix1,tx);
1612             fiy1             = _mm_add_pd(fiy1,ty);
1613             fiz1             = _mm_add_pd(fiz1,tz);
1614
1615             fjx1             = _mm_add_pd(fjx1,tx);
1616             fjy1             = _mm_add_pd(fjy1,ty);
1617             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1631             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1632                                          &ewtabF,&ewtabFn);
1633             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1634             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
1635
1636             fscal            = felec;
1637
1638             /* Calculate temporary vectorial force */
1639             tx               = _mm_mul_pd(fscal,dx12);
1640             ty               = _mm_mul_pd(fscal,dy12);
1641             tz               = _mm_mul_pd(fscal,dz12);
1642
1643             /* Update vectorial force */
1644             fix1             = _mm_add_pd(fix1,tx);
1645             fiy1             = _mm_add_pd(fiy1,ty);
1646             fiz1             = _mm_add_pd(fiz1,tz);
1647
1648             fjx2             = _mm_add_pd(fjx2,tx);
1649             fjy2             = _mm_add_pd(fjy2,ty);
1650             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1664             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1665                                          &ewtabF,&ewtabFn);
1666             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1667             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
1668
1669             fscal            = felec;
1670
1671             /* Calculate temporary vectorial force */
1672             tx               = _mm_mul_pd(fscal,dx20);
1673             ty               = _mm_mul_pd(fscal,dy20);
1674             tz               = _mm_mul_pd(fscal,dz20);
1675
1676             /* Update vectorial force */
1677             fix2             = _mm_add_pd(fix2,tx);
1678             fiy2             = _mm_add_pd(fiy2,ty);
1679             fiz2             = _mm_add_pd(fiz2,tz);
1680
1681             fjx0             = _mm_add_pd(fjx0,tx);
1682             fjy0             = _mm_add_pd(fjy0,ty);
1683             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1697             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1698                                          &ewtabF,&ewtabFn);
1699             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1700             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
1701
1702             fscal            = felec;
1703
1704             /* Calculate temporary vectorial force */
1705             tx               = _mm_mul_pd(fscal,dx21);
1706             ty               = _mm_mul_pd(fscal,dy21);
1707             tz               = _mm_mul_pd(fscal,dz21);
1708
1709             /* Update vectorial force */
1710             fix2             = _mm_add_pd(fix2,tx);
1711             fiy2             = _mm_add_pd(fiy2,ty);
1712             fiz2             = _mm_add_pd(fiz2,tz);
1713
1714             fjx1             = _mm_add_pd(fjx1,tx);
1715             fjy1             = _mm_add_pd(fjy1,ty);
1716             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1730             gmx_mm_load_2pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),ewtab+gmx_mm_extract_epi32(ewitab,1),
1731                                          &ewtabF,&ewtabFn);
1732             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1733             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
1734
1735             fscal            = felec;
1736
1737             /* Calculate temporary vectorial force */
1738             tx               = _mm_mul_pd(fscal,dx22);
1739             ty               = _mm_mul_pd(fscal,dy22);
1740             tz               = _mm_mul_pd(fscal,dz22);
1741
1742             /* Update vectorial force */
1743             fix2             = _mm_add_pd(fix2,tx);
1744             fiy2             = _mm_add_pd(fiy2,ty);
1745             fiz2             = _mm_add_pd(fiz2,tz);
1746
1747             fjx2             = _mm_add_pd(fjx2,tx);
1748             fjy2             = _mm_add_pd(fjy2,ty);
1749             fjz2             = _mm_add_pd(fjz2,tz);
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 331 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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1848             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1849             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1850             felec            = _mm_mul_pd(_mm_mul_pd(qq00,rinv00),_mm_sub_pd(rinvsq00,felec));
1851
1852             /* LENNARD-JONES DISPERSION/REPULSION */
1853
1854             rinvsix          = _mm_mul_pd(_mm_mul_pd(rinvsq00,rinvsq00),rinvsq00);
1855             fvdw             = _mm_mul_pd(_mm_sub_pd(_mm_mul_pd(c12_00,rinvsix),c6_00),_mm_mul_pd(rinvsix,rinvsq00));
1856
1857             fscal            = _mm_add_pd(felec,fvdw);
1858
1859             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1860
1861             /* Calculate temporary vectorial force */
1862             tx               = _mm_mul_pd(fscal,dx00);
1863             ty               = _mm_mul_pd(fscal,dy00);
1864             tz               = _mm_mul_pd(fscal,dz00);
1865
1866             /* Update vectorial force */
1867             fix0             = _mm_add_pd(fix0,tx);
1868             fiy0             = _mm_add_pd(fiy0,ty);
1869             fiz0             = _mm_add_pd(fiz0,tz);
1870
1871             fjx0             = _mm_add_pd(fjx0,tx);
1872             fjy0             = _mm_add_pd(fjy0,ty);
1873             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1887             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1888             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1889             felec            = _mm_mul_pd(_mm_mul_pd(qq01,rinv01),_mm_sub_pd(rinvsq01,felec));
1890
1891             fscal            = felec;
1892
1893             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1894
1895             /* Calculate temporary vectorial force */
1896             tx               = _mm_mul_pd(fscal,dx01);
1897             ty               = _mm_mul_pd(fscal,dy01);
1898             tz               = _mm_mul_pd(fscal,dz01);
1899
1900             /* Update vectorial force */
1901             fix0             = _mm_add_pd(fix0,tx);
1902             fiy0             = _mm_add_pd(fiy0,ty);
1903             fiz0             = _mm_add_pd(fiz0,tz);
1904
1905             fjx1             = _mm_add_pd(fjx1,tx);
1906             fjy1             = _mm_add_pd(fjy1,ty);
1907             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1921             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1922             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1923             felec            = _mm_mul_pd(_mm_mul_pd(qq02,rinv02),_mm_sub_pd(rinvsq02,felec));
1924
1925             fscal            = felec;
1926
1927             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1928
1929             /* Calculate temporary vectorial force */
1930             tx               = _mm_mul_pd(fscal,dx02);
1931             ty               = _mm_mul_pd(fscal,dy02);
1932             tz               = _mm_mul_pd(fscal,dz02);
1933
1934             /* Update vectorial force */
1935             fix0             = _mm_add_pd(fix0,tx);
1936             fiy0             = _mm_add_pd(fiy0,ty);
1937             fiz0             = _mm_add_pd(fiz0,tz);
1938
1939             fjx2             = _mm_add_pd(fjx2,tx);
1940             fjy2             = _mm_add_pd(fjy2,ty);
1941             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1955             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1956             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1957             felec            = _mm_mul_pd(_mm_mul_pd(qq10,rinv10),_mm_sub_pd(rinvsq10,felec));
1958
1959             fscal            = felec;
1960
1961             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1962
1963             /* Calculate temporary vectorial force */
1964             tx               = _mm_mul_pd(fscal,dx10);
1965             ty               = _mm_mul_pd(fscal,dy10);
1966             tz               = _mm_mul_pd(fscal,dz10);
1967
1968             /* Update vectorial force */
1969             fix1             = _mm_add_pd(fix1,tx);
1970             fiy1             = _mm_add_pd(fiy1,ty);
1971             fiz1             = _mm_add_pd(fiz1,tz);
1972
1973             fjx0             = _mm_add_pd(fjx0,tx);
1974             fjy0             = _mm_add_pd(fjy0,ty);
1975             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
1989             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
1990             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
1991             felec            = _mm_mul_pd(_mm_mul_pd(qq11,rinv11),_mm_sub_pd(rinvsq11,felec));
1992
1993             fscal            = felec;
1994
1995             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1996
1997             /* Calculate temporary vectorial force */
1998             tx               = _mm_mul_pd(fscal,dx11);
1999             ty               = _mm_mul_pd(fscal,dy11);
2000             tz               = _mm_mul_pd(fscal,dz11);
2001
2002             /* Update vectorial force */
2003             fix1             = _mm_add_pd(fix1,tx);
2004             fiy1             = _mm_add_pd(fiy1,ty);
2005             fiz1             = _mm_add_pd(fiz1,tz);
2006
2007             fjx1             = _mm_add_pd(fjx1,tx);
2008             fjy1             = _mm_add_pd(fjy1,ty);
2009             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2023             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2024             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2025             felec            = _mm_mul_pd(_mm_mul_pd(qq12,rinv12),_mm_sub_pd(rinvsq12,felec));
2026
2027             fscal            = felec;
2028
2029             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2030
2031             /* Calculate temporary vectorial force */
2032             tx               = _mm_mul_pd(fscal,dx12);
2033             ty               = _mm_mul_pd(fscal,dy12);
2034             tz               = _mm_mul_pd(fscal,dz12);
2035
2036             /* Update vectorial force */
2037             fix1             = _mm_add_pd(fix1,tx);
2038             fiy1             = _mm_add_pd(fiy1,ty);
2039             fiz1             = _mm_add_pd(fiz1,tz);
2040
2041             fjx2             = _mm_add_pd(fjx2,tx);
2042             fjy2             = _mm_add_pd(fjy2,ty);
2043             fjz2             = _mm_add_pd(fjz2,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2057             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2058             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2059             felec            = _mm_mul_pd(_mm_mul_pd(qq20,rinv20),_mm_sub_pd(rinvsq20,felec));
2060
2061             fscal            = felec;
2062
2063             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2064
2065             /* Calculate temporary vectorial force */
2066             tx               = _mm_mul_pd(fscal,dx20);
2067             ty               = _mm_mul_pd(fscal,dy20);
2068             tz               = _mm_mul_pd(fscal,dz20);
2069
2070             /* Update vectorial force */
2071             fix2             = _mm_add_pd(fix2,tx);
2072             fiy2             = _mm_add_pd(fiy2,ty);
2073             fiz2             = _mm_add_pd(fiz2,tz);
2074
2075             fjx0             = _mm_add_pd(fjx0,tx);
2076             fjy0             = _mm_add_pd(fjy0,ty);
2077             fjz0             = _mm_add_pd(fjz0,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2091             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2092             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2093             felec            = _mm_mul_pd(_mm_mul_pd(qq21,rinv21),_mm_sub_pd(rinvsq21,felec));
2094
2095             fscal            = felec;
2096
2097             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2098
2099             /* Calculate temporary vectorial force */
2100             tx               = _mm_mul_pd(fscal,dx21);
2101             ty               = _mm_mul_pd(fscal,dy21);
2102             tz               = _mm_mul_pd(fscal,dz21);
2103
2104             /* Update vectorial force */
2105             fix2             = _mm_add_pd(fix2,tx);
2106             fiy2             = _mm_add_pd(fiy2,ty);
2107             fiz2             = _mm_add_pd(fiz2,tz);
2108
2109             fjx1             = _mm_add_pd(fjx1,tx);
2110             fjy1             = _mm_add_pd(fjy1,ty);
2111             fjz1             = _mm_add_pd(fjz1,tz);
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             eweps            = _mm_sub_pd(ewrt,_mm_round_pd(ewrt, _MM_FROUND_FLOOR));
2125             gmx_mm_load_1pair_swizzle_pd(ewtab+gmx_mm_extract_epi32(ewitab,0),&ewtabF,&ewtabFn);
2126             felec            = _mm_add_pd(_mm_mul_pd( _mm_sub_pd(one,eweps),ewtabF),_mm_mul_pd(eweps,ewtabFn));
2127             felec            = _mm_mul_pd(_mm_mul_pd(qq22,rinv22),_mm_sub_pd(rinvsq22,felec));
2128
2129             fscal            = felec;
2130
2131             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
2132
2133             /* Calculate temporary vectorial force */
2134             tx               = _mm_mul_pd(fscal,dx22);
2135             ty               = _mm_mul_pd(fscal,dy22);
2136             tz               = _mm_mul_pd(fscal,dz22);
2137
2138             /* Update vectorial force */
2139             fix2             = _mm_add_pd(fix2,tx);
2140             fiy2             = _mm_add_pd(fiy2,ty);
2141             fiz2             = _mm_add_pd(fiz2,tz);
2142
2143             fjx2             = _mm_add_pd(fjx2,tx);
2144             fjy2             = _mm_add_pd(fjy2,ty);
2145             fjz2             = _mm_add_pd(fjz2,tz);
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 331 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*331);
2169 }