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