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