4e2de21ff4bde458c28a4ac90ec1045477bf9a1a
[alexxy/gromacs.git] / src / gromacs / gmxlib / nonbonded / nb_kernel_avx_128_fma_double / nb_kernel_ElecRF_VdwCSTab_GeomW3W3_avx_128_fma_double.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2012,2013,2014, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 /*
36  * Note: this file was generated by the GROMACS avx_128_fma_double kernel generator.
37  */
38 #include "config.h"
39
40 #include <math.h>
41
42 #include "../nb_kernel.h"
43 #include "types/simple.h"
44 #include "gromacs/math/vec.h"
45 #include "nrnb.h"
46
47 #include "gromacs/simd/math_x86_avx_128_fma_double.h"
48 #include "kernelutil_x86_avx_128_fma_double.h"
49
50 /*
51  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwCSTab_GeomW3W3_VF_avx_128_fma_double
52  * Electrostatics interaction: ReactionField
53  * VdW interaction:            CubicSplineTable
54  * Geometry:                   Water3-Water3
55  * Calculate force/pot:        PotentialAndForce
56  */
57 void
58 nb_kernel_ElecRF_VdwCSTab_GeomW3W3_VF_avx_128_fma_double
59                     (t_nblist                    * gmx_restrict       nlist,
60                      rvec                        * gmx_restrict          xx,
61                      rvec                        * gmx_restrict          ff,
62                      t_forcerec                  * gmx_restrict          fr,
63                      t_mdatoms                   * gmx_restrict     mdatoms,
64                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
65                      t_nrnb                      * gmx_restrict        nrnb)
66 {
67     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
68      * just 0 for non-waters.
69      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
70      * jnr indices corresponding to data put in the four positions in the SIMD register.
71      */
72     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
73     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
74     int              jnrA,jnrB;
75     int              j_coord_offsetA,j_coord_offsetB;
76     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
77     real             rcutoff_scalar;
78     real             *shiftvec,*fshift,*x,*f;
79     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
80     int              vdwioffset0;
81     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
82     int              vdwioffset1;
83     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
84     int              vdwioffset2;
85     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
86     int              vdwjidx0A,vdwjidx0B;
87     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
88     int              vdwjidx1A,vdwjidx1B;
89     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
90     int              vdwjidx2A,vdwjidx2B;
91     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
92     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
93     __m128d          dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
94     __m128d          dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
95     __m128d          dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
96     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
97     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
98     __m128d          dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
99     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
100     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
101     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
102     real             *charge;
103     int              nvdwtype;
104     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
105     int              *vdwtype;
106     real             *vdwparam;
107     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
108     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
109     __m128i          vfitab;
110     __m128i          ifour       = _mm_set1_epi32(4);
111     __m128d          rt,vfeps,vftabscale,Y,F,G,H,Heps,Fp,VV,FF,twovfeps;
112     real             *vftab;
113     __m128d          dummy_mask,cutoff_mask;
114     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
115     __m128d          one     = _mm_set1_pd(1.0);
116     __m128d          two     = _mm_set1_pd(2.0);
117     x                = xx[0];
118     f                = ff[0];
119
120     nri              = nlist->nri;
121     iinr             = nlist->iinr;
122     jindex           = nlist->jindex;
123     jjnr             = nlist->jjnr;
124     shiftidx         = nlist->shift;
125     gid              = nlist->gid;
126     shiftvec         = fr->shift_vec[0];
127     fshift           = fr->fshift[0];
128     facel            = _mm_set1_pd(fr->epsfac);
129     charge           = mdatoms->chargeA;
130     krf              = _mm_set1_pd(fr->ic->k_rf);
131     krf2             = _mm_set1_pd(fr->ic->k_rf*2.0);
132     crf              = _mm_set1_pd(fr->ic->c_rf);
133     nvdwtype         = fr->ntype;
134     vdwparam         = fr->nbfp;
135     vdwtype          = mdatoms->typeA;
136
137     vftab            = kernel_data->table_vdw->data;
138     vftabscale       = _mm_set1_pd(kernel_data->table_vdw->scale);
139
140     /* Setup water-specific parameters */
141     inr              = nlist->iinr[0];
142     iq0              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+0]));
143     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
144     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
145     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
146
147     jq0              = _mm_set1_pd(charge[inr+0]);
148     jq1              = _mm_set1_pd(charge[inr+1]);
149     jq2              = _mm_set1_pd(charge[inr+2]);
150     vdwjidx0A        = 2*vdwtype[inr+0];
151     qq00             = _mm_mul_pd(iq0,jq0);
152     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
153     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
154     qq01             = _mm_mul_pd(iq0,jq1);
155     qq02             = _mm_mul_pd(iq0,jq2);
156     qq10             = _mm_mul_pd(iq1,jq0);
157     qq11             = _mm_mul_pd(iq1,jq1);
158     qq12             = _mm_mul_pd(iq1,jq2);
159     qq20             = _mm_mul_pd(iq2,jq0);
160     qq21             = _mm_mul_pd(iq2,jq1);
161     qq22             = _mm_mul_pd(iq2,jq2);
162
163     /* Avoid stupid compiler warnings */
164     jnrA = jnrB = 0;
165     j_coord_offsetA = 0;
166     j_coord_offsetB = 0;
167
168     outeriter        = 0;
169     inneriter        = 0;
170
171     /* Start outer loop over neighborlists */
172     for(iidx=0; iidx<nri; iidx++)
173     {
174         /* Load shift vector for this list */
175         i_shift_offset   = DIM*shiftidx[iidx];
176
177         /* Load limits for loop over neighbors */
178         j_index_start    = jindex[iidx];
179         j_index_end      = jindex[iidx+1];
180
181         /* Get outer coordinate index */
182         inr              = iinr[iidx];
183         i_coord_offset   = DIM*inr;
184
185         /* Load i particle coords and add shift vector */
186         gmx_mm_load_shift_and_3rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
187                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
188
189         fix0             = _mm_setzero_pd();
190         fiy0             = _mm_setzero_pd();
191         fiz0             = _mm_setzero_pd();
192         fix1             = _mm_setzero_pd();
193         fiy1             = _mm_setzero_pd();
194         fiz1             = _mm_setzero_pd();
195         fix2             = _mm_setzero_pd();
196         fiy2             = _mm_setzero_pd();
197         fiz2             = _mm_setzero_pd();
198
199         /* Reset potential sums */
200         velecsum         = _mm_setzero_pd();
201         vvdwsum          = _mm_setzero_pd();
202
203         /* Start inner kernel loop */
204         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
205         {
206
207             /* Get j neighbor index, and coordinate index */
208             jnrA             = jjnr[jidx];
209             jnrB             = jjnr[jidx+1];
210             j_coord_offsetA  = DIM*jnrA;
211             j_coord_offsetB  = DIM*jnrB;
212
213             /* load j atom coordinates */
214             gmx_mm_load_3rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
215                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
216
217             /* Calculate displacement vector */
218             dx00             = _mm_sub_pd(ix0,jx0);
219             dy00             = _mm_sub_pd(iy0,jy0);
220             dz00             = _mm_sub_pd(iz0,jz0);
221             dx01             = _mm_sub_pd(ix0,jx1);
222             dy01             = _mm_sub_pd(iy0,jy1);
223             dz01             = _mm_sub_pd(iz0,jz1);
224             dx02             = _mm_sub_pd(ix0,jx2);
225             dy02             = _mm_sub_pd(iy0,jy2);
226             dz02             = _mm_sub_pd(iz0,jz2);
227             dx10             = _mm_sub_pd(ix1,jx0);
228             dy10             = _mm_sub_pd(iy1,jy0);
229             dz10             = _mm_sub_pd(iz1,jz0);
230             dx11             = _mm_sub_pd(ix1,jx1);
231             dy11             = _mm_sub_pd(iy1,jy1);
232             dz11             = _mm_sub_pd(iz1,jz1);
233             dx12             = _mm_sub_pd(ix1,jx2);
234             dy12             = _mm_sub_pd(iy1,jy2);
235             dz12             = _mm_sub_pd(iz1,jz2);
236             dx20             = _mm_sub_pd(ix2,jx0);
237             dy20             = _mm_sub_pd(iy2,jy0);
238             dz20             = _mm_sub_pd(iz2,jz0);
239             dx21             = _mm_sub_pd(ix2,jx1);
240             dy21             = _mm_sub_pd(iy2,jy1);
241             dz21             = _mm_sub_pd(iz2,jz1);
242             dx22             = _mm_sub_pd(ix2,jx2);
243             dy22             = _mm_sub_pd(iy2,jy2);
244             dz22             = _mm_sub_pd(iz2,jz2);
245
246             /* Calculate squared distance and things based on it */
247             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
248             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
249             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
250             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
251             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
252             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
253             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
254             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
255             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
256
257             rinv00           = gmx_mm_invsqrt_pd(rsq00);
258             rinv01           = gmx_mm_invsqrt_pd(rsq01);
259             rinv02           = gmx_mm_invsqrt_pd(rsq02);
260             rinv10           = gmx_mm_invsqrt_pd(rsq10);
261             rinv11           = gmx_mm_invsqrt_pd(rsq11);
262             rinv12           = gmx_mm_invsqrt_pd(rsq12);
263             rinv20           = gmx_mm_invsqrt_pd(rsq20);
264             rinv21           = gmx_mm_invsqrt_pd(rsq21);
265             rinv22           = gmx_mm_invsqrt_pd(rsq22);
266
267             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
268             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
269             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
270             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
271             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
272             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
273             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
274             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
275             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
276
277             fjx0             = _mm_setzero_pd();
278             fjy0             = _mm_setzero_pd();
279             fjz0             = _mm_setzero_pd();
280             fjx1             = _mm_setzero_pd();
281             fjy1             = _mm_setzero_pd();
282             fjz1             = _mm_setzero_pd();
283             fjx2             = _mm_setzero_pd();
284             fjy2             = _mm_setzero_pd();
285             fjz2             = _mm_setzero_pd();
286
287             /**************************
288              * CALCULATE INTERACTIONS *
289              **************************/
290
291             r00              = _mm_mul_pd(rsq00,rinv00);
292
293             /* Calculate table index by multiplying r with table scale and truncate to integer */
294             rt               = _mm_mul_pd(r00,vftabscale);
295             vfitab           = _mm_cvttpd_epi32(rt);
296 #ifdef __XOP__
297             vfeps            = _mm_frcz_pd(rt);
298 #else
299             vfeps            = _mm_sub_pd(rt,_mm_round_pd(rt, _MM_FROUND_FLOOR));
300 #endif
301             twovfeps         = _mm_add_pd(vfeps,vfeps);
302             vfitab           = _mm_slli_epi32(vfitab,3);
303
304             /* REACTION-FIELD ELECTROSTATICS */
305             velec            = _mm_mul_pd(qq00,_mm_sub_pd(_mm_macc_pd(krf,rsq00,rinv00),crf));
306             felec            = _mm_mul_pd(qq00,_mm_msub_pd(rinv00,rinvsq00,krf2));
307
308             /* CUBIC SPLINE TABLE DISPERSION */
309             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
310             F                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) );
311             GMX_MM_TRANSPOSE2_PD(Y,F);
312             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
313             H                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) +2);
314             GMX_MM_TRANSPOSE2_PD(G,H);
315             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
316             VV               = _mm_macc_pd(vfeps,Fp,Y);
317             vvdw6            = _mm_mul_pd(c6_00,VV);
318             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
319             fvdw6            = _mm_mul_pd(c6_00,FF);
320
321             /* CUBIC SPLINE TABLE REPULSION */
322             vfitab           = _mm_add_epi32(vfitab,ifour);
323             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
324             F                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) );
325             GMX_MM_TRANSPOSE2_PD(Y,F);
326             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
327             H                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) +2);
328             GMX_MM_TRANSPOSE2_PD(G,H);
329             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
330             VV               = _mm_macc_pd(vfeps,Fp,Y);
331             vvdw12           = _mm_mul_pd(c12_00,VV);
332             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
333             fvdw12           = _mm_mul_pd(c12_00,FF);
334             vvdw             = _mm_add_pd(vvdw12,vvdw6);
335             fvdw             = _mm_xor_pd(signbit,_mm_mul_pd(_mm_add_pd(fvdw6,fvdw12),_mm_mul_pd(vftabscale,rinv00)));
336
337             /* Update potential sum for this i atom from the interaction with this j atom. */
338             velecsum         = _mm_add_pd(velecsum,velec);
339             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
340
341             fscal            = _mm_add_pd(felec,fvdw);
342
343             /* Update vectorial force */
344             fix0             = _mm_macc_pd(dx00,fscal,fix0);
345             fiy0             = _mm_macc_pd(dy00,fscal,fiy0);
346             fiz0             = _mm_macc_pd(dz00,fscal,fiz0);
347             
348             fjx0             = _mm_macc_pd(dx00,fscal,fjx0);
349             fjy0             = _mm_macc_pd(dy00,fscal,fjy0);
350             fjz0             = _mm_macc_pd(dz00,fscal,fjz0);
351
352             /**************************
353              * CALCULATE INTERACTIONS *
354              **************************/
355
356             /* REACTION-FIELD ELECTROSTATICS */
357             velec            = _mm_mul_pd(qq01,_mm_sub_pd(_mm_macc_pd(krf,rsq01,rinv01),crf));
358             felec            = _mm_mul_pd(qq01,_mm_msub_pd(rinv01,rinvsq01,krf2));
359
360             /* Update potential sum for this i atom from the interaction with this j atom. */
361             velecsum         = _mm_add_pd(velecsum,velec);
362
363             fscal            = felec;
364
365             /* Update vectorial force */
366             fix0             = _mm_macc_pd(dx01,fscal,fix0);
367             fiy0             = _mm_macc_pd(dy01,fscal,fiy0);
368             fiz0             = _mm_macc_pd(dz01,fscal,fiz0);
369             
370             fjx1             = _mm_macc_pd(dx01,fscal,fjx1);
371             fjy1             = _mm_macc_pd(dy01,fscal,fjy1);
372             fjz1             = _mm_macc_pd(dz01,fscal,fjz1);
373
374             /**************************
375              * CALCULATE INTERACTIONS *
376              **************************/
377
378             /* REACTION-FIELD ELECTROSTATICS */
379             velec            = _mm_mul_pd(qq02,_mm_sub_pd(_mm_macc_pd(krf,rsq02,rinv02),crf));
380             felec            = _mm_mul_pd(qq02,_mm_msub_pd(rinv02,rinvsq02,krf2));
381
382             /* Update potential sum for this i atom from the interaction with this j atom. */
383             velecsum         = _mm_add_pd(velecsum,velec);
384
385             fscal            = felec;
386
387             /* Update vectorial force */
388             fix0             = _mm_macc_pd(dx02,fscal,fix0);
389             fiy0             = _mm_macc_pd(dy02,fscal,fiy0);
390             fiz0             = _mm_macc_pd(dz02,fscal,fiz0);
391             
392             fjx2             = _mm_macc_pd(dx02,fscal,fjx2);
393             fjy2             = _mm_macc_pd(dy02,fscal,fjy2);
394             fjz2             = _mm_macc_pd(dz02,fscal,fjz2);
395
396             /**************************
397              * CALCULATE INTERACTIONS *
398              **************************/
399
400             /* REACTION-FIELD ELECTROSTATICS */
401             velec            = _mm_mul_pd(qq10,_mm_sub_pd(_mm_macc_pd(krf,rsq10,rinv10),crf));
402             felec            = _mm_mul_pd(qq10,_mm_msub_pd(rinv10,rinvsq10,krf2));
403
404             /* Update potential sum for this i atom from the interaction with this j atom. */
405             velecsum         = _mm_add_pd(velecsum,velec);
406
407             fscal            = felec;
408
409             /* Update vectorial force */
410             fix1             = _mm_macc_pd(dx10,fscal,fix1);
411             fiy1             = _mm_macc_pd(dy10,fscal,fiy1);
412             fiz1             = _mm_macc_pd(dz10,fscal,fiz1);
413             
414             fjx0             = _mm_macc_pd(dx10,fscal,fjx0);
415             fjy0             = _mm_macc_pd(dy10,fscal,fjy0);
416             fjz0             = _mm_macc_pd(dz10,fscal,fjz0);
417
418             /**************************
419              * CALCULATE INTERACTIONS *
420              **************************/
421
422             /* REACTION-FIELD ELECTROSTATICS */
423             velec            = _mm_mul_pd(qq11,_mm_sub_pd(_mm_macc_pd(krf,rsq11,rinv11),crf));
424             felec            = _mm_mul_pd(qq11,_mm_msub_pd(rinv11,rinvsq11,krf2));
425
426             /* Update potential sum for this i atom from the interaction with this j atom. */
427             velecsum         = _mm_add_pd(velecsum,velec);
428
429             fscal            = felec;
430
431             /* Update vectorial force */
432             fix1             = _mm_macc_pd(dx11,fscal,fix1);
433             fiy1             = _mm_macc_pd(dy11,fscal,fiy1);
434             fiz1             = _mm_macc_pd(dz11,fscal,fiz1);
435             
436             fjx1             = _mm_macc_pd(dx11,fscal,fjx1);
437             fjy1             = _mm_macc_pd(dy11,fscal,fjy1);
438             fjz1             = _mm_macc_pd(dz11,fscal,fjz1);
439
440             /**************************
441              * CALCULATE INTERACTIONS *
442              **************************/
443
444             /* REACTION-FIELD ELECTROSTATICS */
445             velec            = _mm_mul_pd(qq12,_mm_sub_pd(_mm_macc_pd(krf,rsq12,rinv12),crf));
446             felec            = _mm_mul_pd(qq12,_mm_msub_pd(rinv12,rinvsq12,krf2));
447
448             /* Update potential sum for this i atom from the interaction with this j atom. */
449             velecsum         = _mm_add_pd(velecsum,velec);
450
451             fscal            = felec;
452
453             /* Update vectorial force */
454             fix1             = _mm_macc_pd(dx12,fscal,fix1);
455             fiy1             = _mm_macc_pd(dy12,fscal,fiy1);
456             fiz1             = _mm_macc_pd(dz12,fscal,fiz1);
457             
458             fjx2             = _mm_macc_pd(dx12,fscal,fjx2);
459             fjy2             = _mm_macc_pd(dy12,fscal,fjy2);
460             fjz2             = _mm_macc_pd(dz12,fscal,fjz2);
461
462             /**************************
463              * CALCULATE INTERACTIONS *
464              **************************/
465
466             /* REACTION-FIELD ELECTROSTATICS */
467             velec            = _mm_mul_pd(qq20,_mm_sub_pd(_mm_macc_pd(krf,rsq20,rinv20),crf));
468             felec            = _mm_mul_pd(qq20,_mm_msub_pd(rinv20,rinvsq20,krf2));
469
470             /* Update potential sum for this i atom from the interaction with this j atom. */
471             velecsum         = _mm_add_pd(velecsum,velec);
472
473             fscal            = felec;
474
475             /* Update vectorial force */
476             fix2             = _mm_macc_pd(dx20,fscal,fix2);
477             fiy2             = _mm_macc_pd(dy20,fscal,fiy2);
478             fiz2             = _mm_macc_pd(dz20,fscal,fiz2);
479             
480             fjx0             = _mm_macc_pd(dx20,fscal,fjx0);
481             fjy0             = _mm_macc_pd(dy20,fscal,fjy0);
482             fjz0             = _mm_macc_pd(dz20,fscal,fjz0);
483
484             /**************************
485              * CALCULATE INTERACTIONS *
486              **************************/
487
488             /* REACTION-FIELD ELECTROSTATICS */
489             velec            = _mm_mul_pd(qq21,_mm_sub_pd(_mm_macc_pd(krf,rsq21,rinv21),crf));
490             felec            = _mm_mul_pd(qq21,_mm_msub_pd(rinv21,rinvsq21,krf2));
491
492             /* Update potential sum for this i atom from the interaction with this j atom. */
493             velecsum         = _mm_add_pd(velecsum,velec);
494
495             fscal            = felec;
496
497             /* Update vectorial force */
498             fix2             = _mm_macc_pd(dx21,fscal,fix2);
499             fiy2             = _mm_macc_pd(dy21,fscal,fiy2);
500             fiz2             = _mm_macc_pd(dz21,fscal,fiz2);
501             
502             fjx1             = _mm_macc_pd(dx21,fscal,fjx1);
503             fjy1             = _mm_macc_pd(dy21,fscal,fjy1);
504             fjz1             = _mm_macc_pd(dz21,fscal,fjz1);
505
506             /**************************
507              * CALCULATE INTERACTIONS *
508              **************************/
509
510             /* REACTION-FIELD ELECTROSTATICS */
511             velec            = _mm_mul_pd(qq22,_mm_sub_pd(_mm_macc_pd(krf,rsq22,rinv22),crf));
512             felec            = _mm_mul_pd(qq22,_mm_msub_pd(rinv22,rinvsq22,krf2));
513
514             /* Update potential sum for this i atom from the interaction with this j atom. */
515             velecsum         = _mm_add_pd(velecsum,velec);
516
517             fscal            = felec;
518
519             /* Update vectorial force */
520             fix2             = _mm_macc_pd(dx22,fscal,fix2);
521             fiy2             = _mm_macc_pd(dy22,fscal,fiy2);
522             fiz2             = _mm_macc_pd(dz22,fscal,fiz2);
523             
524             fjx2             = _mm_macc_pd(dx22,fscal,fjx2);
525             fjy2             = _mm_macc_pd(dy22,fscal,fjy2);
526             fjz2             = _mm_macc_pd(dz22,fscal,fjz2);
527
528             gmx_mm_decrement_3rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
529
530             /* Inner loop uses 350 flops */
531         }
532
533         if(jidx<j_index_end)
534         {
535
536             jnrA             = jjnr[jidx];
537             j_coord_offsetA  = DIM*jnrA;
538
539             /* load j atom coordinates */
540             gmx_mm_load_3rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
541                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
542
543             /* Calculate displacement vector */
544             dx00             = _mm_sub_pd(ix0,jx0);
545             dy00             = _mm_sub_pd(iy0,jy0);
546             dz00             = _mm_sub_pd(iz0,jz0);
547             dx01             = _mm_sub_pd(ix0,jx1);
548             dy01             = _mm_sub_pd(iy0,jy1);
549             dz01             = _mm_sub_pd(iz0,jz1);
550             dx02             = _mm_sub_pd(ix0,jx2);
551             dy02             = _mm_sub_pd(iy0,jy2);
552             dz02             = _mm_sub_pd(iz0,jz2);
553             dx10             = _mm_sub_pd(ix1,jx0);
554             dy10             = _mm_sub_pd(iy1,jy0);
555             dz10             = _mm_sub_pd(iz1,jz0);
556             dx11             = _mm_sub_pd(ix1,jx1);
557             dy11             = _mm_sub_pd(iy1,jy1);
558             dz11             = _mm_sub_pd(iz1,jz1);
559             dx12             = _mm_sub_pd(ix1,jx2);
560             dy12             = _mm_sub_pd(iy1,jy2);
561             dz12             = _mm_sub_pd(iz1,jz2);
562             dx20             = _mm_sub_pd(ix2,jx0);
563             dy20             = _mm_sub_pd(iy2,jy0);
564             dz20             = _mm_sub_pd(iz2,jz0);
565             dx21             = _mm_sub_pd(ix2,jx1);
566             dy21             = _mm_sub_pd(iy2,jy1);
567             dz21             = _mm_sub_pd(iz2,jz1);
568             dx22             = _mm_sub_pd(ix2,jx2);
569             dy22             = _mm_sub_pd(iy2,jy2);
570             dz22             = _mm_sub_pd(iz2,jz2);
571
572             /* Calculate squared distance and things based on it */
573             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
574             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
575             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
576             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
577             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
578             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
579             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
580             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
581             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
582
583             rinv00           = gmx_mm_invsqrt_pd(rsq00);
584             rinv01           = gmx_mm_invsqrt_pd(rsq01);
585             rinv02           = gmx_mm_invsqrt_pd(rsq02);
586             rinv10           = gmx_mm_invsqrt_pd(rsq10);
587             rinv11           = gmx_mm_invsqrt_pd(rsq11);
588             rinv12           = gmx_mm_invsqrt_pd(rsq12);
589             rinv20           = gmx_mm_invsqrt_pd(rsq20);
590             rinv21           = gmx_mm_invsqrt_pd(rsq21);
591             rinv22           = gmx_mm_invsqrt_pd(rsq22);
592
593             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
594             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
595             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
596             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
597             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
598             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
599             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
600             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
601             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
602
603             fjx0             = _mm_setzero_pd();
604             fjy0             = _mm_setzero_pd();
605             fjz0             = _mm_setzero_pd();
606             fjx1             = _mm_setzero_pd();
607             fjy1             = _mm_setzero_pd();
608             fjz1             = _mm_setzero_pd();
609             fjx2             = _mm_setzero_pd();
610             fjy2             = _mm_setzero_pd();
611             fjz2             = _mm_setzero_pd();
612
613             /**************************
614              * CALCULATE INTERACTIONS *
615              **************************/
616
617             r00              = _mm_mul_pd(rsq00,rinv00);
618
619             /* Calculate table index by multiplying r with table scale and truncate to integer */
620             rt               = _mm_mul_pd(r00,vftabscale);
621             vfitab           = _mm_cvttpd_epi32(rt);
622 #ifdef __XOP__
623             vfeps            = _mm_frcz_pd(rt);
624 #else
625             vfeps            = _mm_sub_pd(rt,_mm_round_pd(rt, _MM_FROUND_FLOOR));
626 #endif
627             twovfeps         = _mm_add_pd(vfeps,vfeps);
628             vfitab           = _mm_slli_epi32(vfitab,3);
629
630             /* REACTION-FIELD ELECTROSTATICS */
631             velec            = _mm_mul_pd(qq00,_mm_sub_pd(_mm_macc_pd(krf,rsq00,rinv00),crf));
632             felec            = _mm_mul_pd(qq00,_mm_msub_pd(rinv00,rinvsq00,krf2));
633
634             /* CUBIC SPLINE TABLE DISPERSION */
635             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
636             F                = _mm_setzero_pd();
637             GMX_MM_TRANSPOSE2_PD(Y,F);
638             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
639             H                = _mm_setzero_pd();
640             GMX_MM_TRANSPOSE2_PD(G,H);
641             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
642             VV               = _mm_macc_pd(vfeps,Fp,Y);
643             vvdw6            = _mm_mul_pd(c6_00,VV);
644             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
645             fvdw6            = _mm_mul_pd(c6_00,FF);
646
647             /* CUBIC SPLINE TABLE REPULSION */
648             vfitab           = _mm_add_epi32(vfitab,ifour);
649             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
650             F                = _mm_setzero_pd();
651             GMX_MM_TRANSPOSE2_PD(Y,F);
652             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
653             H                = _mm_setzero_pd();
654             GMX_MM_TRANSPOSE2_PD(G,H);
655             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
656             VV               = _mm_macc_pd(vfeps,Fp,Y);
657             vvdw12           = _mm_mul_pd(c12_00,VV);
658             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
659             fvdw12           = _mm_mul_pd(c12_00,FF);
660             vvdw             = _mm_add_pd(vvdw12,vvdw6);
661             fvdw             = _mm_xor_pd(signbit,_mm_mul_pd(_mm_add_pd(fvdw6,fvdw12),_mm_mul_pd(vftabscale,rinv00)));
662
663             /* Update potential sum for this i atom from the interaction with this j atom. */
664             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
665             velecsum         = _mm_add_pd(velecsum,velec);
666             vvdw             = _mm_unpacklo_pd(vvdw,_mm_setzero_pd());
667             vvdwsum          = _mm_add_pd(vvdwsum,vvdw);
668
669             fscal            = _mm_add_pd(felec,fvdw);
670
671             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
672
673             /* Update vectorial force */
674             fix0             = _mm_macc_pd(dx00,fscal,fix0);
675             fiy0             = _mm_macc_pd(dy00,fscal,fiy0);
676             fiz0             = _mm_macc_pd(dz00,fscal,fiz0);
677             
678             fjx0             = _mm_macc_pd(dx00,fscal,fjx0);
679             fjy0             = _mm_macc_pd(dy00,fscal,fjy0);
680             fjz0             = _mm_macc_pd(dz00,fscal,fjz0);
681
682             /**************************
683              * CALCULATE INTERACTIONS *
684              **************************/
685
686             /* REACTION-FIELD ELECTROSTATICS */
687             velec            = _mm_mul_pd(qq01,_mm_sub_pd(_mm_macc_pd(krf,rsq01,rinv01),crf));
688             felec            = _mm_mul_pd(qq01,_mm_msub_pd(rinv01,rinvsq01,krf2));
689
690             /* Update potential sum for this i atom from the interaction with this j atom. */
691             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
692             velecsum         = _mm_add_pd(velecsum,velec);
693
694             fscal            = felec;
695
696             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
697
698             /* Update vectorial force */
699             fix0             = _mm_macc_pd(dx01,fscal,fix0);
700             fiy0             = _mm_macc_pd(dy01,fscal,fiy0);
701             fiz0             = _mm_macc_pd(dz01,fscal,fiz0);
702             
703             fjx1             = _mm_macc_pd(dx01,fscal,fjx1);
704             fjy1             = _mm_macc_pd(dy01,fscal,fjy1);
705             fjz1             = _mm_macc_pd(dz01,fscal,fjz1);
706
707             /**************************
708              * CALCULATE INTERACTIONS *
709              **************************/
710
711             /* REACTION-FIELD ELECTROSTATICS */
712             velec            = _mm_mul_pd(qq02,_mm_sub_pd(_mm_macc_pd(krf,rsq02,rinv02),crf));
713             felec            = _mm_mul_pd(qq02,_mm_msub_pd(rinv02,rinvsq02,krf2));
714
715             /* Update potential sum for this i atom from the interaction with this j atom. */
716             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
717             velecsum         = _mm_add_pd(velecsum,velec);
718
719             fscal            = felec;
720
721             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
722
723             /* Update vectorial force */
724             fix0             = _mm_macc_pd(dx02,fscal,fix0);
725             fiy0             = _mm_macc_pd(dy02,fscal,fiy0);
726             fiz0             = _mm_macc_pd(dz02,fscal,fiz0);
727             
728             fjx2             = _mm_macc_pd(dx02,fscal,fjx2);
729             fjy2             = _mm_macc_pd(dy02,fscal,fjy2);
730             fjz2             = _mm_macc_pd(dz02,fscal,fjz2);
731
732             /**************************
733              * CALCULATE INTERACTIONS *
734              **************************/
735
736             /* REACTION-FIELD ELECTROSTATICS */
737             velec            = _mm_mul_pd(qq10,_mm_sub_pd(_mm_macc_pd(krf,rsq10,rinv10),crf));
738             felec            = _mm_mul_pd(qq10,_mm_msub_pd(rinv10,rinvsq10,krf2));
739
740             /* Update potential sum for this i atom from the interaction with this j atom. */
741             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
742             velecsum         = _mm_add_pd(velecsum,velec);
743
744             fscal            = felec;
745
746             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
747
748             /* Update vectorial force */
749             fix1             = _mm_macc_pd(dx10,fscal,fix1);
750             fiy1             = _mm_macc_pd(dy10,fscal,fiy1);
751             fiz1             = _mm_macc_pd(dz10,fscal,fiz1);
752             
753             fjx0             = _mm_macc_pd(dx10,fscal,fjx0);
754             fjy0             = _mm_macc_pd(dy10,fscal,fjy0);
755             fjz0             = _mm_macc_pd(dz10,fscal,fjz0);
756
757             /**************************
758              * CALCULATE INTERACTIONS *
759              **************************/
760
761             /* REACTION-FIELD ELECTROSTATICS */
762             velec            = _mm_mul_pd(qq11,_mm_sub_pd(_mm_macc_pd(krf,rsq11,rinv11),crf));
763             felec            = _mm_mul_pd(qq11,_mm_msub_pd(rinv11,rinvsq11,krf2));
764
765             /* Update potential sum for this i atom from the interaction with this j atom. */
766             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
767             velecsum         = _mm_add_pd(velecsum,velec);
768
769             fscal            = felec;
770
771             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
772
773             /* Update vectorial force */
774             fix1             = _mm_macc_pd(dx11,fscal,fix1);
775             fiy1             = _mm_macc_pd(dy11,fscal,fiy1);
776             fiz1             = _mm_macc_pd(dz11,fscal,fiz1);
777             
778             fjx1             = _mm_macc_pd(dx11,fscal,fjx1);
779             fjy1             = _mm_macc_pd(dy11,fscal,fjy1);
780             fjz1             = _mm_macc_pd(dz11,fscal,fjz1);
781
782             /**************************
783              * CALCULATE INTERACTIONS *
784              **************************/
785
786             /* REACTION-FIELD ELECTROSTATICS */
787             velec            = _mm_mul_pd(qq12,_mm_sub_pd(_mm_macc_pd(krf,rsq12,rinv12),crf));
788             felec            = _mm_mul_pd(qq12,_mm_msub_pd(rinv12,rinvsq12,krf2));
789
790             /* Update potential sum for this i atom from the interaction with this j atom. */
791             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
792             velecsum         = _mm_add_pd(velecsum,velec);
793
794             fscal            = felec;
795
796             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
797
798             /* Update vectorial force */
799             fix1             = _mm_macc_pd(dx12,fscal,fix1);
800             fiy1             = _mm_macc_pd(dy12,fscal,fiy1);
801             fiz1             = _mm_macc_pd(dz12,fscal,fiz1);
802             
803             fjx2             = _mm_macc_pd(dx12,fscal,fjx2);
804             fjy2             = _mm_macc_pd(dy12,fscal,fjy2);
805             fjz2             = _mm_macc_pd(dz12,fscal,fjz2);
806
807             /**************************
808              * CALCULATE INTERACTIONS *
809              **************************/
810
811             /* REACTION-FIELD ELECTROSTATICS */
812             velec            = _mm_mul_pd(qq20,_mm_sub_pd(_mm_macc_pd(krf,rsq20,rinv20),crf));
813             felec            = _mm_mul_pd(qq20,_mm_msub_pd(rinv20,rinvsq20,krf2));
814
815             /* Update potential sum for this i atom from the interaction with this j atom. */
816             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
817             velecsum         = _mm_add_pd(velecsum,velec);
818
819             fscal            = felec;
820
821             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
822
823             /* Update vectorial force */
824             fix2             = _mm_macc_pd(dx20,fscal,fix2);
825             fiy2             = _mm_macc_pd(dy20,fscal,fiy2);
826             fiz2             = _mm_macc_pd(dz20,fscal,fiz2);
827             
828             fjx0             = _mm_macc_pd(dx20,fscal,fjx0);
829             fjy0             = _mm_macc_pd(dy20,fscal,fjy0);
830             fjz0             = _mm_macc_pd(dz20,fscal,fjz0);
831
832             /**************************
833              * CALCULATE INTERACTIONS *
834              **************************/
835
836             /* REACTION-FIELD ELECTROSTATICS */
837             velec            = _mm_mul_pd(qq21,_mm_sub_pd(_mm_macc_pd(krf,rsq21,rinv21),crf));
838             felec            = _mm_mul_pd(qq21,_mm_msub_pd(rinv21,rinvsq21,krf2));
839
840             /* Update potential sum for this i atom from the interaction with this j atom. */
841             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
842             velecsum         = _mm_add_pd(velecsum,velec);
843
844             fscal            = felec;
845
846             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
847
848             /* Update vectorial force */
849             fix2             = _mm_macc_pd(dx21,fscal,fix2);
850             fiy2             = _mm_macc_pd(dy21,fscal,fiy2);
851             fiz2             = _mm_macc_pd(dz21,fscal,fiz2);
852             
853             fjx1             = _mm_macc_pd(dx21,fscal,fjx1);
854             fjy1             = _mm_macc_pd(dy21,fscal,fjy1);
855             fjz1             = _mm_macc_pd(dz21,fscal,fjz1);
856
857             /**************************
858              * CALCULATE INTERACTIONS *
859              **************************/
860
861             /* REACTION-FIELD ELECTROSTATICS */
862             velec            = _mm_mul_pd(qq22,_mm_sub_pd(_mm_macc_pd(krf,rsq22,rinv22),crf));
863             felec            = _mm_mul_pd(qq22,_mm_msub_pd(rinv22,rinvsq22,krf2));
864
865             /* Update potential sum for this i atom from the interaction with this j atom. */
866             velec            = _mm_unpacklo_pd(velec,_mm_setzero_pd());
867             velecsum         = _mm_add_pd(velecsum,velec);
868
869             fscal            = felec;
870
871             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
872
873             /* Update vectorial force */
874             fix2             = _mm_macc_pd(dx22,fscal,fix2);
875             fiy2             = _mm_macc_pd(dy22,fscal,fiy2);
876             fiz2             = _mm_macc_pd(dz22,fscal,fiz2);
877             
878             fjx2             = _mm_macc_pd(dx22,fscal,fjx2);
879             fjy2             = _mm_macc_pd(dy22,fscal,fjy2);
880             fjz2             = _mm_macc_pd(dz22,fscal,fjz2);
881
882             gmx_mm_decrement_3rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
883
884             /* Inner loop uses 350 flops */
885         }
886
887         /* End of innermost loop */
888
889         gmx_mm_update_iforce_3atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
890                                               f+i_coord_offset,fshift+i_shift_offset);
891
892         ggid                        = gid[iidx];
893         /* Update potential energies */
894         gmx_mm_update_1pot_pd(velecsum,kernel_data->energygrp_elec+ggid);
895         gmx_mm_update_1pot_pd(vvdwsum,kernel_data->energygrp_vdw+ggid);
896
897         /* Increment number of inner iterations */
898         inneriter                  += j_index_end - j_index_start;
899
900         /* Outer loop uses 20 flops */
901     }
902
903     /* Increment number of outer iterations */
904     outeriter        += nri;
905
906     /* Update outer/inner flops */
907
908     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_VF,outeriter*20 + inneriter*350);
909 }
910 /*
911  * Gromacs nonbonded kernel:   nb_kernel_ElecRF_VdwCSTab_GeomW3W3_F_avx_128_fma_double
912  * Electrostatics interaction: ReactionField
913  * VdW interaction:            CubicSplineTable
914  * Geometry:                   Water3-Water3
915  * Calculate force/pot:        Force
916  */
917 void
918 nb_kernel_ElecRF_VdwCSTab_GeomW3W3_F_avx_128_fma_double
919                     (t_nblist                    * gmx_restrict       nlist,
920                      rvec                        * gmx_restrict          xx,
921                      rvec                        * gmx_restrict          ff,
922                      t_forcerec                  * gmx_restrict          fr,
923                      t_mdatoms                   * gmx_restrict     mdatoms,
924                      nb_kernel_data_t gmx_unused * gmx_restrict kernel_data,
925                      t_nrnb                      * gmx_restrict        nrnb)
926 {
927     /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
928      * just 0 for non-waters.
929      * Suffixes A,B refer to j loop unrolling done with SSE double precision, e.g. for the two different
930      * jnr indices corresponding to data put in the four positions in the SIMD register.
931      */
932     int              i_shift_offset,i_coord_offset,outeriter,inneriter;
933     int              j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
934     int              jnrA,jnrB;
935     int              j_coord_offsetA,j_coord_offsetB;
936     int              *iinr,*jindex,*jjnr,*shiftidx,*gid;
937     real             rcutoff_scalar;
938     real             *shiftvec,*fshift,*x,*f;
939     __m128d          tx,ty,tz,fscal,rcutoff,rcutoff2,jidxall;
940     int              vdwioffset0;
941     __m128d          ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
942     int              vdwioffset1;
943     __m128d          ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
944     int              vdwioffset2;
945     __m128d          ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
946     int              vdwjidx0A,vdwjidx0B;
947     __m128d          jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
948     int              vdwjidx1A,vdwjidx1B;
949     __m128d          jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
950     int              vdwjidx2A,vdwjidx2B;
951     __m128d          jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
952     __m128d          dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
953     __m128d          dx01,dy01,dz01,rsq01,rinv01,rinvsq01,r01,qq01,c6_01,c12_01;
954     __m128d          dx02,dy02,dz02,rsq02,rinv02,rinvsq02,r02,qq02,c6_02,c12_02;
955     __m128d          dx10,dy10,dz10,rsq10,rinv10,rinvsq10,r10,qq10,c6_10,c12_10;
956     __m128d          dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
957     __m128d          dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
958     __m128d          dx20,dy20,dz20,rsq20,rinv20,rinvsq20,r20,qq20,c6_20,c12_20;
959     __m128d          dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
960     __m128d          dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
961     __m128d          velec,felec,velecsum,facel,crf,krf,krf2;
962     real             *charge;
963     int              nvdwtype;
964     __m128d          rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
965     int              *vdwtype;
966     real             *vdwparam;
967     __m128d          one_sixth   = _mm_set1_pd(1.0/6.0);
968     __m128d          one_twelfth = _mm_set1_pd(1.0/12.0);
969     __m128i          vfitab;
970     __m128i          ifour       = _mm_set1_epi32(4);
971     __m128d          rt,vfeps,vftabscale,Y,F,G,H,Heps,Fp,VV,FF,twovfeps;
972     real             *vftab;
973     __m128d          dummy_mask,cutoff_mask;
974     __m128d          signbit   = gmx_mm_castsi128_pd( _mm_set_epi32(0x80000000,0x00000000,0x80000000,0x00000000) );
975     __m128d          one     = _mm_set1_pd(1.0);
976     __m128d          two     = _mm_set1_pd(2.0);
977     x                = xx[0];
978     f                = ff[0];
979
980     nri              = nlist->nri;
981     iinr             = nlist->iinr;
982     jindex           = nlist->jindex;
983     jjnr             = nlist->jjnr;
984     shiftidx         = nlist->shift;
985     gid              = nlist->gid;
986     shiftvec         = fr->shift_vec[0];
987     fshift           = fr->fshift[0];
988     facel            = _mm_set1_pd(fr->epsfac);
989     charge           = mdatoms->chargeA;
990     krf              = _mm_set1_pd(fr->ic->k_rf);
991     krf2             = _mm_set1_pd(fr->ic->k_rf*2.0);
992     crf              = _mm_set1_pd(fr->ic->c_rf);
993     nvdwtype         = fr->ntype;
994     vdwparam         = fr->nbfp;
995     vdwtype          = mdatoms->typeA;
996
997     vftab            = kernel_data->table_vdw->data;
998     vftabscale       = _mm_set1_pd(kernel_data->table_vdw->scale);
999
1000     /* Setup water-specific parameters */
1001     inr              = nlist->iinr[0];
1002     iq0              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+0]));
1003     iq1              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+1]));
1004     iq2              = _mm_mul_pd(facel,_mm_set1_pd(charge[inr+2]));
1005     vdwioffset0      = 2*nvdwtype*vdwtype[inr+0];
1006
1007     jq0              = _mm_set1_pd(charge[inr+0]);
1008     jq1              = _mm_set1_pd(charge[inr+1]);
1009     jq2              = _mm_set1_pd(charge[inr+2]);
1010     vdwjidx0A        = 2*vdwtype[inr+0];
1011     qq00             = _mm_mul_pd(iq0,jq0);
1012     c6_00            = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A]);
1013     c12_00           = _mm_set1_pd(vdwparam[vdwioffset0+vdwjidx0A+1]);
1014     qq01             = _mm_mul_pd(iq0,jq1);
1015     qq02             = _mm_mul_pd(iq0,jq2);
1016     qq10             = _mm_mul_pd(iq1,jq0);
1017     qq11             = _mm_mul_pd(iq1,jq1);
1018     qq12             = _mm_mul_pd(iq1,jq2);
1019     qq20             = _mm_mul_pd(iq2,jq0);
1020     qq21             = _mm_mul_pd(iq2,jq1);
1021     qq22             = _mm_mul_pd(iq2,jq2);
1022
1023     /* Avoid stupid compiler warnings */
1024     jnrA = jnrB = 0;
1025     j_coord_offsetA = 0;
1026     j_coord_offsetB = 0;
1027
1028     outeriter        = 0;
1029     inneriter        = 0;
1030
1031     /* Start outer loop over neighborlists */
1032     for(iidx=0; iidx<nri; iidx++)
1033     {
1034         /* Load shift vector for this list */
1035         i_shift_offset   = DIM*shiftidx[iidx];
1036
1037         /* Load limits for loop over neighbors */
1038         j_index_start    = jindex[iidx];
1039         j_index_end      = jindex[iidx+1];
1040
1041         /* Get outer coordinate index */
1042         inr              = iinr[iidx];
1043         i_coord_offset   = DIM*inr;
1044
1045         /* Load i particle coords and add shift vector */
1046         gmx_mm_load_shift_and_3rvec_broadcast_pd(shiftvec+i_shift_offset,x+i_coord_offset,
1047                                                  &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2);
1048
1049         fix0             = _mm_setzero_pd();
1050         fiy0             = _mm_setzero_pd();
1051         fiz0             = _mm_setzero_pd();
1052         fix1             = _mm_setzero_pd();
1053         fiy1             = _mm_setzero_pd();
1054         fiz1             = _mm_setzero_pd();
1055         fix2             = _mm_setzero_pd();
1056         fiy2             = _mm_setzero_pd();
1057         fiz2             = _mm_setzero_pd();
1058
1059         /* Start inner kernel loop */
1060         for(jidx=j_index_start; jidx<j_index_end-1; jidx+=2)
1061         {
1062
1063             /* Get j neighbor index, and coordinate index */
1064             jnrA             = jjnr[jidx];
1065             jnrB             = jjnr[jidx+1];
1066             j_coord_offsetA  = DIM*jnrA;
1067             j_coord_offsetB  = DIM*jnrB;
1068
1069             /* load j atom coordinates */
1070             gmx_mm_load_3rvec_2ptr_swizzle_pd(x+j_coord_offsetA,x+j_coord_offsetB,
1071                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1072
1073             /* Calculate displacement vector */
1074             dx00             = _mm_sub_pd(ix0,jx0);
1075             dy00             = _mm_sub_pd(iy0,jy0);
1076             dz00             = _mm_sub_pd(iz0,jz0);
1077             dx01             = _mm_sub_pd(ix0,jx1);
1078             dy01             = _mm_sub_pd(iy0,jy1);
1079             dz01             = _mm_sub_pd(iz0,jz1);
1080             dx02             = _mm_sub_pd(ix0,jx2);
1081             dy02             = _mm_sub_pd(iy0,jy2);
1082             dz02             = _mm_sub_pd(iz0,jz2);
1083             dx10             = _mm_sub_pd(ix1,jx0);
1084             dy10             = _mm_sub_pd(iy1,jy0);
1085             dz10             = _mm_sub_pd(iz1,jz0);
1086             dx11             = _mm_sub_pd(ix1,jx1);
1087             dy11             = _mm_sub_pd(iy1,jy1);
1088             dz11             = _mm_sub_pd(iz1,jz1);
1089             dx12             = _mm_sub_pd(ix1,jx2);
1090             dy12             = _mm_sub_pd(iy1,jy2);
1091             dz12             = _mm_sub_pd(iz1,jz2);
1092             dx20             = _mm_sub_pd(ix2,jx0);
1093             dy20             = _mm_sub_pd(iy2,jy0);
1094             dz20             = _mm_sub_pd(iz2,jz0);
1095             dx21             = _mm_sub_pd(ix2,jx1);
1096             dy21             = _mm_sub_pd(iy2,jy1);
1097             dz21             = _mm_sub_pd(iz2,jz1);
1098             dx22             = _mm_sub_pd(ix2,jx2);
1099             dy22             = _mm_sub_pd(iy2,jy2);
1100             dz22             = _mm_sub_pd(iz2,jz2);
1101
1102             /* Calculate squared distance and things based on it */
1103             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
1104             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
1105             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
1106             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
1107             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
1108             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
1109             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
1110             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
1111             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
1112
1113             rinv00           = gmx_mm_invsqrt_pd(rsq00);
1114             rinv01           = gmx_mm_invsqrt_pd(rsq01);
1115             rinv02           = gmx_mm_invsqrt_pd(rsq02);
1116             rinv10           = gmx_mm_invsqrt_pd(rsq10);
1117             rinv11           = gmx_mm_invsqrt_pd(rsq11);
1118             rinv12           = gmx_mm_invsqrt_pd(rsq12);
1119             rinv20           = gmx_mm_invsqrt_pd(rsq20);
1120             rinv21           = gmx_mm_invsqrt_pd(rsq21);
1121             rinv22           = gmx_mm_invsqrt_pd(rsq22);
1122
1123             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
1124             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
1125             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
1126             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
1127             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
1128             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
1129             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
1130             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
1131             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
1132
1133             fjx0             = _mm_setzero_pd();
1134             fjy0             = _mm_setzero_pd();
1135             fjz0             = _mm_setzero_pd();
1136             fjx1             = _mm_setzero_pd();
1137             fjy1             = _mm_setzero_pd();
1138             fjz1             = _mm_setzero_pd();
1139             fjx2             = _mm_setzero_pd();
1140             fjy2             = _mm_setzero_pd();
1141             fjz2             = _mm_setzero_pd();
1142
1143             /**************************
1144              * CALCULATE INTERACTIONS *
1145              **************************/
1146
1147             r00              = _mm_mul_pd(rsq00,rinv00);
1148
1149             /* Calculate table index by multiplying r with table scale and truncate to integer */
1150             rt               = _mm_mul_pd(r00,vftabscale);
1151             vfitab           = _mm_cvttpd_epi32(rt);
1152 #ifdef __XOP__
1153             vfeps            = _mm_frcz_pd(rt);
1154 #else
1155             vfeps            = _mm_sub_pd(rt,_mm_round_pd(rt, _MM_FROUND_FLOOR));
1156 #endif
1157             twovfeps         = _mm_add_pd(vfeps,vfeps);
1158             vfitab           = _mm_slli_epi32(vfitab,3);
1159
1160             /* REACTION-FIELD ELECTROSTATICS */
1161             felec            = _mm_mul_pd(qq00,_mm_msub_pd(rinv00,rinvsq00,krf2));
1162
1163             /* CUBIC SPLINE TABLE DISPERSION */
1164             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
1165             F                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) );
1166             GMX_MM_TRANSPOSE2_PD(Y,F);
1167             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
1168             H                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) +2);
1169             GMX_MM_TRANSPOSE2_PD(G,H);
1170             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
1171             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
1172             fvdw6            = _mm_mul_pd(c6_00,FF);
1173
1174             /* CUBIC SPLINE TABLE REPULSION */
1175             vfitab           = _mm_add_epi32(vfitab,ifour);
1176             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
1177             F                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) );
1178             GMX_MM_TRANSPOSE2_PD(Y,F);
1179             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
1180             H                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,1) +2);
1181             GMX_MM_TRANSPOSE2_PD(G,H);
1182             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
1183             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
1184             fvdw12           = _mm_mul_pd(c12_00,FF);
1185             fvdw             = _mm_xor_pd(signbit,_mm_mul_pd(_mm_add_pd(fvdw6,fvdw12),_mm_mul_pd(vftabscale,rinv00)));
1186
1187             fscal            = _mm_add_pd(felec,fvdw);
1188
1189             /* Update vectorial force */
1190             fix0             = _mm_macc_pd(dx00,fscal,fix0);
1191             fiy0             = _mm_macc_pd(dy00,fscal,fiy0);
1192             fiz0             = _mm_macc_pd(dz00,fscal,fiz0);
1193             
1194             fjx0             = _mm_macc_pd(dx00,fscal,fjx0);
1195             fjy0             = _mm_macc_pd(dy00,fscal,fjy0);
1196             fjz0             = _mm_macc_pd(dz00,fscal,fjz0);
1197
1198             /**************************
1199              * CALCULATE INTERACTIONS *
1200              **************************/
1201
1202             /* REACTION-FIELD ELECTROSTATICS */
1203             felec            = _mm_mul_pd(qq01,_mm_msub_pd(rinv01,rinvsq01,krf2));
1204
1205             fscal            = felec;
1206
1207             /* Update vectorial force */
1208             fix0             = _mm_macc_pd(dx01,fscal,fix0);
1209             fiy0             = _mm_macc_pd(dy01,fscal,fiy0);
1210             fiz0             = _mm_macc_pd(dz01,fscal,fiz0);
1211             
1212             fjx1             = _mm_macc_pd(dx01,fscal,fjx1);
1213             fjy1             = _mm_macc_pd(dy01,fscal,fjy1);
1214             fjz1             = _mm_macc_pd(dz01,fscal,fjz1);
1215
1216             /**************************
1217              * CALCULATE INTERACTIONS *
1218              **************************/
1219
1220             /* REACTION-FIELD ELECTROSTATICS */
1221             felec            = _mm_mul_pd(qq02,_mm_msub_pd(rinv02,rinvsq02,krf2));
1222
1223             fscal            = felec;
1224
1225             /* Update vectorial force */
1226             fix0             = _mm_macc_pd(dx02,fscal,fix0);
1227             fiy0             = _mm_macc_pd(dy02,fscal,fiy0);
1228             fiz0             = _mm_macc_pd(dz02,fscal,fiz0);
1229             
1230             fjx2             = _mm_macc_pd(dx02,fscal,fjx2);
1231             fjy2             = _mm_macc_pd(dy02,fscal,fjy2);
1232             fjz2             = _mm_macc_pd(dz02,fscal,fjz2);
1233
1234             /**************************
1235              * CALCULATE INTERACTIONS *
1236              **************************/
1237
1238             /* REACTION-FIELD ELECTROSTATICS */
1239             felec            = _mm_mul_pd(qq10,_mm_msub_pd(rinv10,rinvsq10,krf2));
1240
1241             fscal            = felec;
1242
1243             /* Update vectorial force */
1244             fix1             = _mm_macc_pd(dx10,fscal,fix1);
1245             fiy1             = _mm_macc_pd(dy10,fscal,fiy1);
1246             fiz1             = _mm_macc_pd(dz10,fscal,fiz1);
1247             
1248             fjx0             = _mm_macc_pd(dx10,fscal,fjx0);
1249             fjy0             = _mm_macc_pd(dy10,fscal,fjy0);
1250             fjz0             = _mm_macc_pd(dz10,fscal,fjz0);
1251
1252             /**************************
1253              * CALCULATE INTERACTIONS *
1254              **************************/
1255
1256             /* REACTION-FIELD ELECTROSTATICS */
1257             felec            = _mm_mul_pd(qq11,_mm_msub_pd(rinv11,rinvsq11,krf2));
1258
1259             fscal            = felec;
1260
1261             /* Update vectorial force */
1262             fix1             = _mm_macc_pd(dx11,fscal,fix1);
1263             fiy1             = _mm_macc_pd(dy11,fscal,fiy1);
1264             fiz1             = _mm_macc_pd(dz11,fscal,fiz1);
1265             
1266             fjx1             = _mm_macc_pd(dx11,fscal,fjx1);
1267             fjy1             = _mm_macc_pd(dy11,fscal,fjy1);
1268             fjz1             = _mm_macc_pd(dz11,fscal,fjz1);
1269
1270             /**************************
1271              * CALCULATE INTERACTIONS *
1272              **************************/
1273
1274             /* REACTION-FIELD ELECTROSTATICS */
1275             felec            = _mm_mul_pd(qq12,_mm_msub_pd(rinv12,rinvsq12,krf2));
1276
1277             fscal            = felec;
1278
1279             /* Update vectorial force */
1280             fix1             = _mm_macc_pd(dx12,fscal,fix1);
1281             fiy1             = _mm_macc_pd(dy12,fscal,fiy1);
1282             fiz1             = _mm_macc_pd(dz12,fscal,fiz1);
1283             
1284             fjx2             = _mm_macc_pd(dx12,fscal,fjx2);
1285             fjy2             = _mm_macc_pd(dy12,fscal,fjy2);
1286             fjz2             = _mm_macc_pd(dz12,fscal,fjz2);
1287
1288             /**************************
1289              * CALCULATE INTERACTIONS *
1290              **************************/
1291
1292             /* REACTION-FIELD ELECTROSTATICS */
1293             felec            = _mm_mul_pd(qq20,_mm_msub_pd(rinv20,rinvsq20,krf2));
1294
1295             fscal            = felec;
1296
1297             /* Update vectorial force */
1298             fix2             = _mm_macc_pd(dx20,fscal,fix2);
1299             fiy2             = _mm_macc_pd(dy20,fscal,fiy2);
1300             fiz2             = _mm_macc_pd(dz20,fscal,fiz2);
1301             
1302             fjx0             = _mm_macc_pd(dx20,fscal,fjx0);
1303             fjy0             = _mm_macc_pd(dy20,fscal,fjy0);
1304             fjz0             = _mm_macc_pd(dz20,fscal,fjz0);
1305
1306             /**************************
1307              * CALCULATE INTERACTIONS *
1308              **************************/
1309
1310             /* REACTION-FIELD ELECTROSTATICS */
1311             felec            = _mm_mul_pd(qq21,_mm_msub_pd(rinv21,rinvsq21,krf2));
1312
1313             fscal            = felec;
1314
1315             /* Update vectorial force */
1316             fix2             = _mm_macc_pd(dx21,fscal,fix2);
1317             fiy2             = _mm_macc_pd(dy21,fscal,fiy2);
1318             fiz2             = _mm_macc_pd(dz21,fscal,fiz2);
1319             
1320             fjx1             = _mm_macc_pd(dx21,fscal,fjx1);
1321             fjy1             = _mm_macc_pd(dy21,fscal,fjy1);
1322             fjz1             = _mm_macc_pd(dz21,fscal,fjz1);
1323
1324             /**************************
1325              * CALCULATE INTERACTIONS *
1326              **************************/
1327
1328             /* REACTION-FIELD ELECTROSTATICS */
1329             felec            = _mm_mul_pd(qq22,_mm_msub_pd(rinv22,rinvsq22,krf2));
1330
1331             fscal            = felec;
1332
1333             /* Update vectorial force */
1334             fix2             = _mm_macc_pd(dx22,fscal,fix2);
1335             fiy2             = _mm_macc_pd(dy22,fscal,fiy2);
1336             fiz2             = _mm_macc_pd(dz22,fscal,fiz2);
1337             
1338             fjx2             = _mm_macc_pd(dx22,fscal,fjx2);
1339             fjy2             = _mm_macc_pd(dy22,fscal,fjy2);
1340             fjz2             = _mm_macc_pd(dz22,fscal,fjz2);
1341
1342             gmx_mm_decrement_3rvec_2ptr_swizzle_pd(f+j_coord_offsetA,f+j_coord_offsetB,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1343
1344             /* Inner loop uses 297 flops */
1345         }
1346
1347         if(jidx<j_index_end)
1348         {
1349
1350             jnrA             = jjnr[jidx];
1351             j_coord_offsetA  = DIM*jnrA;
1352
1353             /* load j atom coordinates */
1354             gmx_mm_load_3rvec_1ptr_swizzle_pd(x+j_coord_offsetA,
1355                                               &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,&jy2,&jz2);
1356
1357             /* Calculate displacement vector */
1358             dx00             = _mm_sub_pd(ix0,jx0);
1359             dy00             = _mm_sub_pd(iy0,jy0);
1360             dz00             = _mm_sub_pd(iz0,jz0);
1361             dx01             = _mm_sub_pd(ix0,jx1);
1362             dy01             = _mm_sub_pd(iy0,jy1);
1363             dz01             = _mm_sub_pd(iz0,jz1);
1364             dx02             = _mm_sub_pd(ix0,jx2);
1365             dy02             = _mm_sub_pd(iy0,jy2);
1366             dz02             = _mm_sub_pd(iz0,jz2);
1367             dx10             = _mm_sub_pd(ix1,jx0);
1368             dy10             = _mm_sub_pd(iy1,jy0);
1369             dz10             = _mm_sub_pd(iz1,jz0);
1370             dx11             = _mm_sub_pd(ix1,jx1);
1371             dy11             = _mm_sub_pd(iy1,jy1);
1372             dz11             = _mm_sub_pd(iz1,jz1);
1373             dx12             = _mm_sub_pd(ix1,jx2);
1374             dy12             = _mm_sub_pd(iy1,jy2);
1375             dz12             = _mm_sub_pd(iz1,jz2);
1376             dx20             = _mm_sub_pd(ix2,jx0);
1377             dy20             = _mm_sub_pd(iy2,jy0);
1378             dz20             = _mm_sub_pd(iz2,jz0);
1379             dx21             = _mm_sub_pd(ix2,jx1);
1380             dy21             = _mm_sub_pd(iy2,jy1);
1381             dz21             = _mm_sub_pd(iz2,jz1);
1382             dx22             = _mm_sub_pd(ix2,jx2);
1383             dy22             = _mm_sub_pd(iy2,jy2);
1384             dz22             = _mm_sub_pd(iz2,jz2);
1385
1386             /* Calculate squared distance and things based on it */
1387             rsq00            = gmx_mm_calc_rsq_pd(dx00,dy00,dz00);
1388             rsq01            = gmx_mm_calc_rsq_pd(dx01,dy01,dz01);
1389             rsq02            = gmx_mm_calc_rsq_pd(dx02,dy02,dz02);
1390             rsq10            = gmx_mm_calc_rsq_pd(dx10,dy10,dz10);
1391             rsq11            = gmx_mm_calc_rsq_pd(dx11,dy11,dz11);
1392             rsq12            = gmx_mm_calc_rsq_pd(dx12,dy12,dz12);
1393             rsq20            = gmx_mm_calc_rsq_pd(dx20,dy20,dz20);
1394             rsq21            = gmx_mm_calc_rsq_pd(dx21,dy21,dz21);
1395             rsq22            = gmx_mm_calc_rsq_pd(dx22,dy22,dz22);
1396
1397             rinv00           = gmx_mm_invsqrt_pd(rsq00);
1398             rinv01           = gmx_mm_invsqrt_pd(rsq01);
1399             rinv02           = gmx_mm_invsqrt_pd(rsq02);
1400             rinv10           = gmx_mm_invsqrt_pd(rsq10);
1401             rinv11           = gmx_mm_invsqrt_pd(rsq11);
1402             rinv12           = gmx_mm_invsqrt_pd(rsq12);
1403             rinv20           = gmx_mm_invsqrt_pd(rsq20);
1404             rinv21           = gmx_mm_invsqrt_pd(rsq21);
1405             rinv22           = gmx_mm_invsqrt_pd(rsq22);
1406
1407             rinvsq00         = _mm_mul_pd(rinv00,rinv00);
1408             rinvsq01         = _mm_mul_pd(rinv01,rinv01);
1409             rinvsq02         = _mm_mul_pd(rinv02,rinv02);
1410             rinvsq10         = _mm_mul_pd(rinv10,rinv10);
1411             rinvsq11         = _mm_mul_pd(rinv11,rinv11);
1412             rinvsq12         = _mm_mul_pd(rinv12,rinv12);
1413             rinvsq20         = _mm_mul_pd(rinv20,rinv20);
1414             rinvsq21         = _mm_mul_pd(rinv21,rinv21);
1415             rinvsq22         = _mm_mul_pd(rinv22,rinv22);
1416
1417             fjx0             = _mm_setzero_pd();
1418             fjy0             = _mm_setzero_pd();
1419             fjz0             = _mm_setzero_pd();
1420             fjx1             = _mm_setzero_pd();
1421             fjy1             = _mm_setzero_pd();
1422             fjz1             = _mm_setzero_pd();
1423             fjx2             = _mm_setzero_pd();
1424             fjy2             = _mm_setzero_pd();
1425             fjz2             = _mm_setzero_pd();
1426
1427             /**************************
1428              * CALCULATE INTERACTIONS *
1429              **************************/
1430
1431             r00              = _mm_mul_pd(rsq00,rinv00);
1432
1433             /* Calculate table index by multiplying r with table scale and truncate to integer */
1434             rt               = _mm_mul_pd(r00,vftabscale);
1435             vfitab           = _mm_cvttpd_epi32(rt);
1436 #ifdef __XOP__
1437             vfeps            = _mm_frcz_pd(rt);
1438 #else
1439             vfeps            = _mm_sub_pd(rt,_mm_round_pd(rt, _MM_FROUND_FLOOR));
1440 #endif
1441             twovfeps         = _mm_add_pd(vfeps,vfeps);
1442             vfitab           = _mm_slli_epi32(vfitab,3);
1443
1444             /* REACTION-FIELD ELECTROSTATICS */
1445             felec            = _mm_mul_pd(qq00,_mm_msub_pd(rinv00,rinvsq00,krf2));
1446
1447             /* CUBIC SPLINE TABLE DISPERSION */
1448             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
1449             F                = _mm_setzero_pd();
1450             GMX_MM_TRANSPOSE2_PD(Y,F);
1451             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
1452             H                = _mm_setzero_pd();
1453             GMX_MM_TRANSPOSE2_PD(G,H);
1454             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
1455             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
1456             fvdw6            = _mm_mul_pd(c6_00,FF);
1457
1458             /* CUBIC SPLINE TABLE REPULSION */
1459             vfitab           = _mm_add_epi32(vfitab,ifour);
1460             Y                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) );
1461             F                = _mm_setzero_pd();
1462             GMX_MM_TRANSPOSE2_PD(Y,F);
1463             G                = _mm_load_pd( vftab + _mm_extract_epi32(vfitab,0) +2);
1464             H                = _mm_setzero_pd();
1465             GMX_MM_TRANSPOSE2_PD(G,H);
1466             Fp               = _mm_macc_pd(vfeps,_mm_macc_pd(H,vfeps,G),F);
1467             FF               = _mm_macc_pd(vfeps,_mm_macc_pd(twovfeps,H,G),Fp);
1468             fvdw12           = _mm_mul_pd(c12_00,FF);
1469             fvdw             = _mm_xor_pd(signbit,_mm_mul_pd(_mm_add_pd(fvdw6,fvdw12),_mm_mul_pd(vftabscale,rinv00)));
1470
1471             fscal            = _mm_add_pd(felec,fvdw);
1472
1473             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1474
1475             /* Update vectorial force */
1476             fix0             = _mm_macc_pd(dx00,fscal,fix0);
1477             fiy0             = _mm_macc_pd(dy00,fscal,fiy0);
1478             fiz0             = _mm_macc_pd(dz00,fscal,fiz0);
1479             
1480             fjx0             = _mm_macc_pd(dx00,fscal,fjx0);
1481             fjy0             = _mm_macc_pd(dy00,fscal,fjy0);
1482             fjz0             = _mm_macc_pd(dz00,fscal,fjz0);
1483
1484             /**************************
1485              * CALCULATE INTERACTIONS *
1486              **************************/
1487
1488             /* REACTION-FIELD ELECTROSTATICS */
1489             felec            = _mm_mul_pd(qq01,_mm_msub_pd(rinv01,rinvsq01,krf2));
1490
1491             fscal            = felec;
1492
1493             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1494
1495             /* Update vectorial force */
1496             fix0             = _mm_macc_pd(dx01,fscal,fix0);
1497             fiy0             = _mm_macc_pd(dy01,fscal,fiy0);
1498             fiz0             = _mm_macc_pd(dz01,fscal,fiz0);
1499             
1500             fjx1             = _mm_macc_pd(dx01,fscal,fjx1);
1501             fjy1             = _mm_macc_pd(dy01,fscal,fjy1);
1502             fjz1             = _mm_macc_pd(dz01,fscal,fjz1);
1503
1504             /**************************
1505              * CALCULATE INTERACTIONS *
1506              **************************/
1507
1508             /* REACTION-FIELD ELECTROSTATICS */
1509             felec            = _mm_mul_pd(qq02,_mm_msub_pd(rinv02,rinvsq02,krf2));
1510
1511             fscal            = felec;
1512
1513             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1514
1515             /* Update vectorial force */
1516             fix0             = _mm_macc_pd(dx02,fscal,fix0);
1517             fiy0             = _mm_macc_pd(dy02,fscal,fiy0);
1518             fiz0             = _mm_macc_pd(dz02,fscal,fiz0);
1519             
1520             fjx2             = _mm_macc_pd(dx02,fscal,fjx2);
1521             fjy2             = _mm_macc_pd(dy02,fscal,fjy2);
1522             fjz2             = _mm_macc_pd(dz02,fscal,fjz2);
1523
1524             /**************************
1525              * CALCULATE INTERACTIONS *
1526              **************************/
1527
1528             /* REACTION-FIELD ELECTROSTATICS */
1529             felec            = _mm_mul_pd(qq10,_mm_msub_pd(rinv10,rinvsq10,krf2));
1530
1531             fscal            = felec;
1532
1533             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1534
1535             /* Update vectorial force */
1536             fix1             = _mm_macc_pd(dx10,fscal,fix1);
1537             fiy1             = _mm_macc_pd(dy10,fscal,fiy1);
1538             fiz1             = _mm_macc_pd(dz10,fscal,fiz1);
1539             
1540             fjx0             = _mm_macc_pd(dx10,fscal,fjx0);
1541             fjy0             = _mm_macc_pd(dy10,fscal,fjy0);
1542             fjz0             = _mm_macc_pd(dz10,fscal,fjz0);
1543
1544             /**************************
1545              * CALCULATE INTERACTIONS *
1546              **************************/
1547
1548             /* REACTION-FIELD ELECTROSTATICS */
1549             felec            = _mm_mul_pd(qq11,_mm_msub_pd(rinv11,rinvsq11,krf2));
1550
1551             fscal            = felec;
1552
1553             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1554
1555             /* Update vectorial force */
1556             fix1             = _mm_macc_pd(dx11,fscal,fix1);
1557             fiy1             = _mm_macc_pd(dy11,fscal,fiy1);
1558             fiz1             = _mm_macc_pd(dz11,fscal,fiz1);
1559             
1560             fjx1             = _mm_macc_pd(dx11,fscal,fjx1);
1561             fjy1             = _mm_macc_pd(dy11,fscal,fjy1);
1562             fjz1             = _mm_macc_pd(dz11,fscal,fjz1);
1563
1564             /**************************
1565              * CALCULATE INTERACTIONS *
1566              **************************/
1567
1568             /* REACTION-FIELD ELECTROSTATICS */
1569             felec            = _mm_mul_pd(qq12,_mm_msub_pd(rinv12,rinvsq12,krf2));
1570
1571             fscal            = felec;
1572
1573             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1574
1575             /* Update vectorial force */
1576             fix1             = _mm_macc_pd(dx12,fscal,fix1);
1577             fiy1             = _mm_macc_pd(dy12,fscal,fiy1);
1578             fiz1             = _mm_macc_pd(dz12,fscal,fiz1);
1579             
1580             fjx2             = _mm_macc_pd(dx12,fscal,fjx2);
1581             fjy2             = _mm_macc_pd(dy12,fscal,fjy2);
1582             fjz2             = _mm_macc_pd(dz12,fscal,fjz2);
1583
1584             /**************************
1585              * CALCULATE INTERACTIONS *
1586              **************************/
1587
1588             /* REACTION-FIELD ELECTROSTATICS */
1589             felec            = _mm_mul_pd(qq20,_mm_msub_pd(rinv20,rinvsq20,krf2));
1590
1591             fscal            = felec;
1592
1593             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1594
1595             /* Update vectorial force */
1596             fix2             = _mm_macc_pd(dx20,fscal,fix2);
1597             fiy2             = _mm_macc_pd(dy20,fscal,fiy2);
1598             fiz2             = _mm_macc_pd(dz20,fscal,fiz2);
1599             
1600             fjx0             = _mm_macc_pd(dx20,fscal,fjx0);
1601             fjy0             = _mm_macc_pd(dy20,fscal,fjy0);
1602             fjz0             = _mm_macc_pd(dz20,fscal,fjz0);
1603
1604             /**************************
1605              * CALCULATE INTERACTIONS *
1606              **************************/
1607
1608             /* REACTION-FIELD ELECTROSTATICS */
1609             felec            = _mm_mul_pd(qq21,_mm_msub_pd(rinv21,rinvsq21,krf2));
1610
1611             fscal            = felec;
1612
1613             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1614
1615             /* Update vectorial force */
1616             fix2             = _mm_macc_pd(dx21,fscal,fix2);
1617             fiy2             = _mm_macc_pd(dy21,fscal,fiy2);
1618             fiz2             = _mm_macc_pd(dz21,fscal,fiz2);
1619             
1620             fjx1             = _mm_macc_pd(dx21,fscal,fjx1);
1621             fjy1             = _mm_macc_pd(dy21,fscal,fjy1);
1622             fjz1             = _mm_macc_pd(dz21,fscal,fjz1);
1623
1624             /**************************
1625              * CALCULATE INTERACTIONS *
1626              **************************/
1627
1628             /* REACTION-FIELD ELECTROSTATICS */
1629             felec            = _mm_mul_pd(qq22,_mm_msub_pd(rinv22,rinvsq22,krf2));
1630
1631             fscal            = felec;
1632
1633             fscal            = _mm_unpacklo_pd(fscal,_mm_setzero_pd());
1634
1635             /* Update vectorial force */
1636             fix2             = _mm_macc_pd(dx22,fscal,fix2);
1637             fiy2             = _mm_macc_pd(dy22,fscal,fiy2);
1638             fiz2             = _mm_macc_pd(dz22,fscal,fiz2);
1639             
1640             fjx2             = _mm_macc_pd(dx22,fscal,fjx2);
1641             fjy2             = _mm_macc_pd(dy22,fscal,fjy2);
1642             fjz2             = _mm_macc_pd(dz22,fscal,fjz2);
1643
1644             gmx_mm_decrement_3rvec_1ptr_swizzle_pd(f+j_coord_offsetA,fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,fjx2,fjy2,fjz2);
1645
1646             /* Inner loop uses 297 flops */
1647         }
1648
1649         /* End of innermost loop */
1650
1651         gmx_mm_update_iforce_3atom_swizzle_pd(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,
1652                                               f+i_coord_offset,fshift+i_shift_offset);
1653
1654         /* Increment number of inner iterations */
1655         inneriter                  += j_index_end - j_index_start;
1656
1657         /* Outer loop uses 18 flops */
1658     }
1659
1660     /* Increment number of outer iterations */
1661     outeriter        += nri;
1662
1663     /* Update outer/inner flops */
1664
1665     inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W3W3_F,outeriter*18 + inneriter*297);
1666 }