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