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