2 * Note: this file was generated by the Gromacs avx_128_fma_single kernel generator.
4 * This source code is part of
8 * Copyright (c) 2001-2012, The GROMACS Development Team
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
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
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.
28 #include "../nb_kernel.h"
29 #include "types/simple.h"
33 #include "gmx_math_x86_avx_128_fma_single.h"
34 #include "kernelutil_x86_avx_128_fma_single.h"
37 * Gromacs nonbonded kernel: nb_kernel_ElecEw_VdwLJ_GeomW4W4_VF_avx_128_fma_single
38 * Electrostatics interaction: Ewald
39 * VdW interaction: LennardJones
40 * Geometry: Water4-Water4
41 * Calculate force/pot: PotentialAndForce
44 nb_kernel_ElecEw_VdwLJ_GeomW4W4_VF_avx_128_fma_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)
53 /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
54 * just 0 for non-waters.
55 * Suffixes A,B,C,D refer to j loop unrolling done with AVX_128, e.g. for the four different
56 * jnr indices corresponding to data put in the four positions in the SIMD register.
58 int i_shift_offset,i_coord_offset,outeriter,inneriter;
59 int j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
60 int jnrA,jnrB,jnrC,jnrD;
61 int jnrlistA,jnrlistB,jnrlistC,jnrlistD;
62 int j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
63 int *iinr,*jindex,*jjnr,*shiftidx,*gid;
65 real *shiftvec,*fshift,*x,*f;
66 real *fjptrA,*fjptrB,*fjptrC,*fjptrD;
68 __m128 fscal,rcutoff,rcutoff2,jidxall;
70 __m128 ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
72 __m128 ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
74 __m128 ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
76 __m128 ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
77 int vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
78 __m128 jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
79 int vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
80 __m128 jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
81 int vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
82 __m128 jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
83 int vdwjidx3A,vdwjidx3B,vdwjidx3C,vdwjidx3D;
84 __m128 jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
85 __m128 dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
86 __m128 dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
87 __m128 dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
88 __m128 dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13;
89 __m128 dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
90 __m128 dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
91 __m128 dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23;
92 __m128 dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31;
93 __m128 dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32;
94 __m128 dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33;
95 __m128 velec,felec,velecsum,facel,crf,krf,krf2;
98 __m128 rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
101 __m128 one_sixth = _mm_set1_ps(1.0/6.0);
102 __m128 one_twelfth = _mm_set1_ps(1.0/12.0);
104 __m128 ewtabscale,eweps,twoeweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
105 __m128 beta,beta2,beta3,zeta2,pmecorrF,pmecorrV,rinv3;
107 __m128 dummy_mask,cutoff_mask;
108 __m128 signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
109 __m128 one = _mm_set1_ps(1.0);
110 __m128 two = _mm_set1_ps(2.0);
116 jindex = nlist->jindex;
118 shiftidx = nlist->shift;
120 shiftvec = fr->shift_vec[0];
121 fshift = fr->fshift[0];
122 facel = _mm_set1_ps(fr->epsfac);
123 charge = mdatoms->chargeA;
124 nvdwtype = fr->ntype;
126 vdwtype = mdatoms->typeA;
128 sh_ewald = _mm_set1_ps(fr->ic->sh_ewald);
129 beta = _mm_set1_ps(fr->ic->ewaldcoeff);
130 beta2 = _mm_mul_ps(beta,beta);
131 beta3 = _mm_mul_ps(beta,beta2);
132 ewtab = fr->ic->tabq_coul_FDV0;
133 ewtabscale = _mm_set1_ps(fr->ic->tabq_scale);
134 ewtabhalfspace = _mm_set1_ps(0.5/fr->ic->tabq_scale);
136 /* Setup water-specific parameters */
137 inr = nlist->iinr[0];
138 iq1 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
139 iq2 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
140 iq3 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+3]));
141 vdwioffset0 = 2*nvdwtype*vdwtype[inr+0];
143 jq1 = _mm_set1_ps(charge[inr+1]);
144 jq2 = _mm_set1_ps(charge[inr+2]);
145 jq3 = _mm_set1_ps(charge[inr+3]);
146 vdwjidx0A = 2*vdwtype[inr+0];
147 c6_00 = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
148 c12_00 = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
149 qq11 = _mm_mul_ps(iq1,jq1);
150 qq12 = _mm_mul_ps(iq1,jq2);
151 qq13 = _mm_mul_ps(iq1,jq3);
152 qq21 = _mm_mul_ps(iq2,jq1);
153 qq22 = _mm_mul_ps(iq2,jq2);
154 qq23 = _mm_mul_ps(iq2,jq3);
155 qq31 = _mm_mul_ps(iq3,jq1);
156 qq32 = _mm_mul_ps(iq3,jq2);
157 qq33 = _mm_mul_ps(iq3,jq3);
159 /* Avoid stupid compiler warnings */
160 jnrA = jnrB = jnrC = jnrD = 0;
169 for(iidx=0;iidx<4*DIM;iidx++)
174 /* Start outer loop over neighborlists */
175 for(iidx=0; iidx<nri; iidx++)
177 /* Load shift vector for this list */
178 i_shift_offset = DIM*shiftidx[iidx];
180 /* Load limits for loop over neighbors */
181 j_index_start = jindex[iidx];
182 j_index_end = jindex[iidx+1];
184 /* Get outer coordinate index */
186 i_coord_offset = DIM*inr;
188 /* Load i particle coords and add shift vector */
189 gmx_mm_load_shift_and_4rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
190 &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2,&ix3,&iy3,&iz3);
192 fix0 = _mm_setzero_ps();
193 fiy0 = _mm_setzero_ps();
194 fiz0 = _mm_setzero_ps();
195 fix1 = _mm_setzero_ps();
196 fiy1 = _mm_setzero_ps();
197 fiz1 = _mm_setzero_ps();
198 fix2 = _mm_setzero_ps();
199 fiy2 = _mm_setzero_ps();
200 fiz2 = _mm_setzero_ps();
201 fix3 = _mm_setzero_ps();
202 fiy3 = _mm_setzero_ps();
203 fiz3 = _mm_setzero_ps();
205 /* Reset potential sums */
206 velecsum = _mm_setzero_ps();
207 vvdwsum = _mm_setzero_ps();
209 /* Start inner kernel loop */
210 for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
213 /* Get j neighbor index, and coordinate index */
218 j_coord_offsetA = DIM*jnrA;
219 j_coord_offsetB = DIM*jnrB;
220 j_coord_offsetC = DIM*jnrC;
221 j_coord_offsetD = DIM*jnrD;
223 /* load j atom coordinates */
224 gmx_mm_load_4rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
225 x+j_coord_offsetC,x+j_coord_offsetD,
226 &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
227 &jy2,&jz2,&jx3,&jy3,&jz3);
229 /* Calculate displacement vector */
230 dx00 = _mm_sub_ps(ix0,jx0);
231 dy00 = _mm_sub_ps(iy0,jy0);
232 dz00 = _mm_sub_ps(iz0,jz0);
233 dx11 = _mm_sub_ps(ix1,jx1);
234 dy11 = _mm_sub_ps(iy1,jy1);
235 dz11 = _mm_sub_ps(iz1,jz1);
236 dx12 = _mm_sub_ps(ix1,jx2);
237 dy12 = _mm_sub_ps(iy1,jy2);
238 dz12 = _mm_sub_ps(iz1,jz2);
239 dx13 = _mm_sub_ps(ix1,jx3);
240 dy13 = _mm_sub_ps(iy1,jy3);
241 dz13 = _mm_sub_ps(iz1,jz3);
242 dx21 = _mm_sub_ps(ix2,jx1);
243 dy21 = _mm_sub_ps(iy2,jy1);
244 dz21 = _mm_sub_ps(iz2,jz1);
245 dx22 = _mm_sub_ps(ix2,jx2);
246 dy22 = _mm_sub_ps(iy2,jy2);
247 dz22 = _mm_sub_ps(iz2,jz2);
248 dx23 = _mm_sub_ps(ix2,jx3);
249 dy23 = _mm_sub_ps(iy2,jy3);
250 dz23 = _mm_sub_ps(iz2,jz3);
251 dx31 = _mm_sub_ps(ix3,jx1);
252 dy31 = _mm_sub_ps(iy3,jy1);
253 dz31 = _mm_sub_ps(iz3,jz1);
254 dx32 = _mm_sub_ps(ix3,jx2);
255 dy32 = _mm_sub_ps(iy3,jy2);
256 dz32 = _mm_sub_ps(iz3,jz2);
257 dx33 = _mm_sub_ps(ix3,jx3);
258 dy33 = _mm_sub_ps(iy3,jy3);
259 dz33 = _mm_sub_ps(iz3,jz3);
261 /* Calculate squared distance and things based on it */
262 rsq00 = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
263 rsq11 = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
264 rsq12 = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
265 rsq13 = gmx_mm_calc_rsq_ps(dx13,dy13,dz13);
266 rsq21 = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
267 rsq22 = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
268 rsq23 = gmx_mm_calc_rsq_ps(dx23,dy23,dz23);
269 rsq31 = gmx_mm_calc_rsq_ps(dx31,dy31,dz31);
270 rsq32 = gmx_mm_calc_rsq_ps(dx32,dy32,dz32);
271 rsq33 = gmx_mm_calc_rsq_ps(dx33,dy33,dz33);
273 rinv11 = gmx_mm_invsqrt_ps(rsq11);
274 rinv12 = gmx_mm_invsqrt_ps(rsq12);
275 rinv13 = gmx_mm_invsqrt_ps(rsq13);
276 rinv21 = gmx_mm_invsqrt_ps(rsq21);
277 rinv22 = gmx_mm_invsqrt_ps(rsq22);
278 rinv23 = gmx_mm_invsqrt_ps(rsq23);
279 rinv31 = gmx_mm_invsqrt_ps(rsq31);
280 rinv32 = gmx_mm_invsqrt_ps(rsq32);
281 rinv33 = gmx_mm_invsqrt_ps(rsq33);
283 rinvsq00 = gmx_mm_inv_ps(rsq00);
284 rinvsq11 = _mm_mul_ps(rinv11,rinv11);
285 rinvsq12 = _mm_mul_ps(rinv12,rinv12);
286 rinvsq13 = _mm_mul_ps(rinv13,rinv13);
287 rinvsq21 = _mm_mul_ps(rinv21,rinv21);
288 rinvsq22 = _mm_mul_ps(rinv22,rinv22);
289 rinvsq23 = _mm_mul_ps(rinv23,rinv23);
290 rinvsq31 = _mm_mul_ps(rinv31,rinv31);
291 rinvsq32 = _mm_mul_ps(rinv32,rinv32);
292 rinvsq33 = _mm_mul_ps(rinv33,rinv33);
294 fjx0 = _mm_setzero_ps();
295 fjy0 = _mm_setzero_ps();
296 fjz0 = _mm_setzero_ps();
297 fjx1 = _mm_setzero_ps();
298 fjy1 = _mm_setzero_ps();
299 fjz1 = _mm_setzero_ps();
300 fjx2 = _mm_setzero_ps();
301 fjy2 = _mm_setzero_ps();
302 fjz2 = _mm_setzero_ps();
303 fjx3 = _mm_setzero_ps();
304 fjy3 = _mm_setzero_ps();
305 fjz3 = _mm_setzero_ps();
307 /**************************
308 * CALCULATE INTERACTIONS *
309 **************************/
311 /* LENNARD-JONES DISPERSION/REPULSION */
313 rinvsix = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
314 vvdw6 = _mm_mul_ps(c6_00,rinvsix);
315 vvdw12 = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
316 vvdw = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
317 fvdw = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
319 /* Update potential sum for this i atom from the interaction with this j atom. */
320 vvdwsum = _mm_add_ps(vvdwsum,vvdw);
324 /* Update vectorial force */
325 fix0 = _mm_macc_ps(dx00,fscal,fix0);
326 fiy0 = _mm_macc_ps(dy00,fscal,fiy0);
327 fiz0 = _mm_macc_ps(dz00,fscal,fiz0);
329 fjx0 = _mm_macc_ps(dx00,fscal,fjx0);
330 fjy0 = _mm_macc_ps(dy00,fscal,fjy0);
331 fjz0 = _mm_macc_ps(dz00,fscal,fjz0);
333 /**************************
334 * CALCULATE INTERACTIONS *
335 **************************/
337 r11 = _mm_mul_ps(rsq11,rinv11);
339 /* EWALD ELECTROSTATICS */
341 /* Analytical PME correction */
342 zeta2 = _mm_mul_ps(beta2,rsq11);
343 rinv3 = _mm_mul_ps(rinvsq11,rinv11);
344 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
345 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
346 felec = _mm_mul_ps(qq11,felec);
347 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
348 velec = _mm_nmacc_ps(pmecorrV,beta,rinv11);
349 velec = _mm_mul_ps(qq11,velec);
351 /* Update potential sum for this i atom from the interaction with this j atom. */
352 velecsum = _mm_add_ps(velecsum,velec);
356 /* Update vectorial force */
357 fix1 = _mm_macc_ps(dx11,fscal,fix1);
358 fiy1 = _mm_macc_ps(dy11,fscal,fiy1);
359 fiz1 = _mm_macc_ps(dz11,fscal,fiz1);
361 fjx1 = _mm_macc_ps(dx11,fscal,fjx1);
362 fjy1 = _mm_macc_ps(dy11,fscal,fjy1);
363 fjz1 = _mm_macc_ps(dz11,fscal,fjz1);
365 /**************************
366 * CALCULATE INTERACTIONS *
367 **************************/
369 r12 = _mm_mul_ps(rsq12,rinv12);
371 /* EWALD ELECTROSTATICS */
373 /* Analytical PME correction */
374 zeta2 = _mm_mul_ps(beta2,rsq12);
375 rinv3 = _mm_mul_ps(rinvsq12,rinv12);
376 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
377 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
378 felec = _mm_mul_ps(qq12,felec);
379 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
380 velec = _mm_nmacc_ps(pmecorrV,beta,rinv12);
381 velec = _mm_mul_ps(qq12,velec);
383 /* Update potential sum for this i atom from the interaction with this j atom. */
384 velecsum = _mm_add_ps(velecsum,velec);
388 /* Update vectorial force */
389 fix1 = _mm_macc_ps(dx12,fscal,fix1);
390 fiy1 = _mm_macc_ps(dy12,fscal,fiy1);
391 fiz1 = _mm_macc_ps(dz12,fscal,fiz1);
393 fjx2 = _mm_macc_ps(dx12,fscal,fjx2);
394 fjy2 = _mm_macc_ps(dy12,fscal,fjy2);
395 fjz2 = _mm_macc_ps(dz12,fscal,fjz2);
397 /**************************
398 * CALCULATE INTERACTIONS *
399 **************************/
401 r13 = _mm_mul_ps(rsq13,rinv13);
403 /* EWALD ELECTROSTATICS */
405 /* Analytical PME correction */
406 zeta2 = _mm_mul_ps(beta2,rsq13);
407 rinv3 = _mm_mul_ps(rinvsq13,rinv13);
408 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
409 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
410 felec = _mm_mul_ps(qq13,felec);
411 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
412 velec = _mm_nmacc_ps(pmecorrV,beta,rinv13);
413 velec = _mm_mul_ps(qq13,velec);
415 /* Update potential sum for this i atom from the interaction with this j atom. */
416 velecsum = _mm_add_ps(velecsum,velec);
420 /* Update vectorial force */
421 fix1 = _mm_macc_ps(dx13,fscal,fix1);
422 fiy1 = _mm_macc_ps(dy13,fscal,fiy1);
423 fiz1 = _mm_macc_ps(dz13,fscal,fiz1);
425 fjx3 = _mm_macc_ps(dx13,fscal,fjx3);
426 fjy3 = _mm_macc_ps(dy13,fscal,fjy3);
427 fjz3 = _mm_macc_ps(dz13,fscal,fjz3);
429 /**************************
430 * CALCULATE INTERACTIONS *
431 **************************/
433 r21 = _mm_mul_ps(rsq21,rinv21);
435 /* EWALD ELECTROSTATICS */
437 /* Analytical PME correction */
438 zeta2 = _mm_mul_ps(beta2,rsq21);
439 rinv3 = _mm_mul_ps(rinvsq21,rinv21);
440 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
441 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
442 felec = _mm_mul_ps(qq21,felec);
443 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
444 velec = _mm_nmacc_ps(pmecorrV,beta,rinv21);
445 velec = _mm_mul_ps(qq21,velec);
447 /* Update potential sum for this i atom from the interaction with this j atom. */
448 velecsum = _mm_add_ps(velecsum,velec);
452 /* Update vectorial force */
453 fix2 = _mm_macc_ps(dx21,fscal,fix2);
454 fiy2 = _mm_macc_ps(dy21,fscal,fiy2);
455 fiz2 = _mm_macc_ps(dz21,fscal,fiz2);
457 fjx1 = _mm_macc_ps(dx21,fscal,fjx1);
458 fjy1 = _mm_macc_ps(dy21,fscal,fjy1);
459 fjz1 = _mm_macc_ps(dz21,fscal,fjz1);
461 /**************************
462 * CALCULATE INTERACTIONS *
463 **************************/
465 r22 = _mm_mul_ps(rsq22,rinv22);
467 /* EWALD ELECTROSTATICS */
469 /* Analytical PME correction */
470 zeta2 = _mm_mul_ps(beta2,rsq22);
471 rinv3 = _mm_mul_ps(rinvsq22,rinv22);
472 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
473 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
474 felec = _mm_mul_ps(qq22,felec);
475 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
476 velec = _mm_nmacc_ps(pmecorrV,beta,rinv22);
477 velec = _mm_mul_ps(qq22,velec);
479 /* Update potential sum for this i atom from the interaction with this j atom. */
480 velecsum = _mm_add_ps(velecsum,velec);
484 /* Update vectorial force */
485 fix2 = _mm_macc_ps(dx22,fscal,fix2);
486 fiy2 = _mm_macc_ps(dy22,fscal,fiy2);
487 fiz2 = _mm_macc_ps(dz22,fscal,fiz2);
489 fjx2 = _mm_macc_ps(dx22,fscal,fjx2);
490 fjy2 = _mm_macc_ps(dy22,fscal,fjy2);
491 fjz2 = _mm_macc_ps(dz22,fscal,fjz2);
493 /**************************
494 * CALCULATE INTERACTIONS *
495 **************************/
497 r23 = _mm_mul_ps(rsq23,rinv23);
499 /* EWALD ELECTROSTATICS */
501 /* Analytical PME correction */
502 zeta2 = _mm_mul_ps(beta2,rsq23);
503 rinv3 = _mm_mul_ps(rinvsq23,rinv23);
504 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
505 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
506 felec = _mm_mul_ps(qq23,felec);
507 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
508 velec = _mm_nmacc_ps(pmecorrV,beta,rinv23);
509 velec = _mm_mul_ps(qq23,velec);
511 /* Update potential sum for this i atom from the interaction with this j atom. */
512 velecsum = _mm_add_ps(velecsum,velec);
516 /* Update vectorial force */
517 fix2 = _mm_macc_ps(dx23,fscal,fix2);
518 fiy2 = _mm_macc_ps(dy23,fscal,fiy2);
519 fiz2 = _mm_macc_ps(dz23,fscal,fiz2);
521 fjx3 = _mm_macc_ps(dx23,fscal,fjx3);
522 fjy3 = _mm_macc_ps(dy23,fscal,fjy3);
523 fjz3 = _mm_macc_ps(dz23,fscal,fjz3);
525 /**************************
526 * CALCULATE INTERACTIONS *
527 **************************/
529 r31 = _mm_mul_ps(rsq31,rinv31);
531 /* EWALD ELECTROSTATICS */
533 /* Analytical PME correction */
534 zeta2 = _mm_mul_ps(beta2,rsq31);
535 rinv3 = _mm_mul_ps(rinvsq31,rinv31);
536 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
537 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
538 felec = _mm_mul_ps(qq31,felec);
539 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
540 velec = _mm_nmacc_ps(pmecorrV,beta,rinv31);
541 velec = _mm_mul_ps(qq31,velec);
543 /* Update potential sum for this i atom from the interaction with this j atom. */
544 velecsum = _mm_add_ps(velecsum,velec);
548 /* Update vectorial force */
549 fix3 = _mm_macc_ps(dx31,fscal,fix3);
550 fiy3 = _mm_macc_ps(dy31,fscal,fiy3);
551 fiz3 = _mm_macc_ps(dz31,fscal,fiz3);
553 fjx1 = _mm_macc_ps(dx31,fscal,fjx1);
554 fjy1 = _mm_macc_ps(dy31,fscal,fjy1);
555 fjz1 = _mm_macc_ps(dz31,fscal,fjz1);
557 /**************************
558 * CALCULATE INTERACTIONS *
559 **************************/
561 r32 = _mm_mul_ps(rsq32,rinv32);
563 /* EWALD ELECTROSTATICS */
565 /* Analytical PME correction */
566 zeta2 = _mm_mul_ps(beta2,rsq32);
567 rinv3 = _mm_mul_ps(rinvsq32,rinv32);
568 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
569 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
570 felec = _mm_mul_ps(qq32,felec);
571 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
572 velec = _mm_nmacc_ps(pmecorrV,beta,rinv32);
573 velec = _mm_mul_ps(qq32,velec);
575 /* Update potential sum for this i atom from the interaction with this j atom. */
576 velecsum = _mm_add_ps(velecsum,velec);
580 /* Update vectorial force */
581 fix3 = _mm_macc_ps(dx32,fscal,fix3);
582 fiy3 = _mm_macc_ps(dy32,fscal,fiy3);
583 fiz3 = _mm_macc_ps(dz32,fscal,fiz3);
585 fjx2 = _mm_macc_ps(dx32,fscal,fjx2);
586 fjy2 = _mm_macc_ps(dy32,fscal,fjy2);
587 fjz2 = _mm_macc_ps(dz32,fscal,fjz2);
589 /**************************
590 * CALCULATE INTERACTIONS *
591 **************************/
593 r33 = _mm_mul_ps(rsq33,rinv33);
595 /* EWALD ELECTROSTATICS */
597 /* Analytical PME correction */
598 zeta2 = _mm_mul_ps(beta2,rsq33);
599 rinv3 = _mm_mul_ps(rinvsq33,rinv33);
600 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
601 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
602 felec = _mm_mul_ps(qq33,felec);
603 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
604 velec = _mm_nmacc_ps(pmecorrV,beta,rinv33);
605 velec = _mm_mul_ps(qq33,velec);
607 /* Update potential sum for this i atom from the interaction with this j atom. */
608 velecsum = _mm_add_ps(velecsum,velec);
612 /* Update vectorial force */
613 fix3 = _mm_macc_ps(dx33,fscal,fix3);
614 fiy3 = _mm_macc_ps(dy33,fscal,fiy3);
615 fiz3 = _mm_macc_ps(dz33,fscal,fiz3);
617 fjx3 = _mm_macc_ps(dx33,fscal,fjx3);
618 fjy3 = _mm_macc_ps(dy33,fscal,fjy3);
619 fjz3 = _mm_macc_ps(dz33,fscal,fjz3);
621 fjptrA = f+j_coord_offsetA;
622 fjptrB = f+j_coord_offsetB;
623 fjptrC = f+j_coord_offsetC;
624 fjptrD = f+j_coord_offsetD;
626 gmx_mm_decrement_4rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
627 fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,
628 fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
630 /* Inner loop uses 299 flops */
636 /* Get j neighbor index, and coordinate index */
637 jnrlistA = jjnr[jidx];
638 jnrlistB = jjnr[jidx+1];
639 jnrlistC = jjnr[jidx+2];
640 jnrlistD = jjnr[jidx+3];
641 /* Sign of each element will be negative for non-real atoms.
642 * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
643 * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
645 dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
646 jnrA = (jnrlistA>=0) ? jnrlistA : 0;
647 jnrB = (jnrlistB>=0) ? jnrlistB : 0;
648 jnrC = (jnrlistC>=0) ? jnrlistC : 0;
649 jnrD = (jnrlistD>=0) ? jnrlistD : 0;
650 j_coord_offsetA = DIM*jnrA;
651 j_coord_offsetB = DIM*jnrB;
652 j_coord_offsetC = DIM*jnrC;
653 j_coord_offsetD = DIM*jnrD;
655 /* load j atom coordinates */
656 gmx_mm_load_4rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
657 x+j_coord_offsetC,x+j_coord_offsetD,
658 &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
659 &jy2,&jz2,&jx3,&jy3,&jz3);
661 /* Calculate displacement vector */
662 dx00 = _mm_sub_ps(ix0,jx0);
663 dy00 = _mm_sub_ps(iy0,jy0);
664 dz00 = _mm_sub_ps(iz0,jz0);
665 dx11 = _mm_sub_ps(ix1,jx1);
666 dy11 = _mm_sub_ps(iy1,jy1);
667 dz11 = _mm_sub_ps(iz1,jz1);
668 dx12 = _mm_sub_ps(ix1,jx2);
669 dy12 = _mm_sub_ps(iy1,jy2);
670 dz12 = _mm_sub_ps(iz1,jz2);
671 dx13 = _mm_sub_ps(ix1,jx3);
672 dy13 = _mm_sub_ps(iy1,jy3);
673 dz13 = _mm_sub_ps(iz1,jz3);
674 dx21 = _mm_sub_ps(ix2,jx1);
675 dy21 = _mm_sub_ps(iy2,jy1);
676 dz21 = _mm_sub_ps(iz2,jz1);
677 dx22 = _mm_sub_ps(ix2,jx2);
678 dy22 = _mm_sub_ps(iy2,jy2);
679 dz22 = _mm_sub_ps(iz2,jz2);
680 dx23 = _mm_sub_ps(ix2,jx3);
681 dy23 = _mm_sub_ps(iy2,jy3);
682 dz23 = _mm_sub_ps(iz2,jz3);
683 dx31 = _mm_sub_ps(ix3,jx1);
684 dy31 = _mm_sub_ps(iy3,jy1);
685 dz31 = _mm_sub_ps(iz3,jz1);
686 dx32 = _mm_sub_ps(ix3,jx2);
687 dy32 = _mm_sub_ps(iy3,jy2);
688 dz32 = _mm_sub_ps(iz3,jz2);
689 dx33 = _mm_sub_ps(ix3,jx3);
690 dy33 = _mm_sub_ps(iy3,jy3);
691 dz33 = _mm_sub_ps(iz3,jz3);
693 /* Calculate squared distance and things based on it */
694 rsq00 = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
695 rsq11 = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
696 rsq12 = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
697 rsq13 = gmx_mm_calc_rsq_ps(dx13,dy13,dz13);
698 rsq21 = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
699 rsq22 = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
700 rsq23 = gmx_mm_calc_rsq_ps(dx23,dy23,dz23);
701 rsq31 = gmx_mm_calc_rsq_ps(dx31,dy31,dz31);
702 rsq32 = gmx_mm_calc_rsq_ps(dx32,dy32,dz32);
703 rsq33 = gmx_mm_calc_rsq_ps(dx33,dy33,dz33);
705 rinv11 = gmx_mm_invsqrt_ps(rsq11);
706 rinv12 = gmx_mm_invsqrt_ps(rsq12);
707 rinv13 = gmx_mm_invsqrt_ps(rsq13);
708 rinv21 = gmx_mm_invsqrt_ps(rsq21);
709 rinv22 = gmx_mm_invsqrt_ps(rsq22);
710 rinv23 = gmx_mm_invsqrt_ps(rsq23);
711 rinv31 = gmx_mm_invsqrt_ps(rsq31);
712 rinv32 = gmx_mm_invsqrt_ps(rsq32);
713 rinv33 = gmx_mm_invsqrt_ps(rsq33);
715 rinvsq00 = gmx_mm_inv_ps(rsq00);
716 rinvsq11 = _mm_mul_ps(rinv11,rinv11);
717 rinvsq12 = _mm_mul_ps(rinv12,rinv12);
718 rinvsq13 = _mm_mul_ps(rinv13,rinv13);
719 rinvsq21 = _mm_mul_ps(rinv21,rinv21);
720 rinvsq22 = _mm_mul_ps(rinv22,rinv22);
721 rinvsq23 = _mm_mul_ps(rinv23,rinv23);
722 rinvsq31 = _mm_mul_ps(rinv31,rinv31);
723 rinvsq32 = _mm_mul_ps(rinv32,rinv32);
724 rinvsq33 = _mm_mul_ps(rinv33,rinv33);
726 fjx0 = _mm_setzero_ps();
727 fjy0 = _mm_setzero_ps();
728 fjz0 = _mm_setzero_ps();
729 fjx1 = _mm_setzero_ps();
730 fjy1 = _mm_setzero_ps();
731 fjz1 = _mm_setzero_ps();
732 fjx2 = _mm_setzero_ps();
733 fjy2 = _mm_setzero_ps();
734 fjz2 = _mm_setzero_ps();
735 fjx3 = _mm_setzero_ps();
736 fjy3 = _mm_setzero_ps();
737 fjz3 = _mm_setzero_ps();
739 /**************************
740 * CALCULATE INTERACTIONS *
741 **************************/
743 /* LENNARD-JONES DISPERSION/REPULSION */
745 rinvsix = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
746 vvdw6 = _mm_mul_ps(c6_00,rinvsix);
747 vvdw12 = _mm_mul_ps(c12_00,_mm_mul_ps(rinvsix,rinvsix));
748 vvdw = _mm_msub_ps(vvdw12,one_twelfth,_mm_mul_ps(vvdw6,one_sixth));
749 fvdw = _mm_mul_ps(_mm_sub_ps(vvdw12,vvdw6),rinvsq00);
751 /* Update potential sum for this i atom from the interaction with this j atom. */
752 vvdw = _mm_andnot_ps(dummy_mask,vvdw);
753 vvdwsum = _mm_add_ps(vvdwsum,vvdw);
757 fscal = _mm_andnot_ps(dummy_mask,fscal);
759 /* Update vectorial force */
760 fix0 = _mm_macc_ps(dx00,fscal,fix0);
761 fiy0 = _mm_macc_ps(dy00,fscal,fiy0);
762 fiz0 = _mm_macc_ps(dz00,fscal,fiz0);
764 fjx0 = _mm_macc_ps(dx00,fscal,fjx0);
765 fjy0 = _mm_macc_ps(dy00,fscal,fjy0);
766 fjz0 = _mm_macc_ps(dz00,fscal,fjz0);
768 /**************************
769 * CALCULATE INTERACTIONS *
770 **************************/
772 r11 = _mm_mul_ps(rsq11,rinv11);
773 r11 = _mm_andnot_ps(dummy_mask,r11);
775 /* EWALD ELECTROSTATICS */
777 /* Analytical PME correction */
778 zeta2 = _mm_mul_ps(beta2,rsq11);
779 rinv3 = _mm_mul_ps(rinvsq11,rinv11);
780 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
781 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
782 felec = _mm_mul_ps(qq11,felec);
783 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
784 velec = _mm_nmacc_ps(pmecorrV,beta,rinv11);
785 velec = _mm_mul_ps(qq11,velec);
787 /* Update potential sum for this i atom from the interaction with this j atom. */
788 velec = _mm_andnot_ps(dummy_mask,velec);
789 velecsum = _mm_add_ps(velecsum,velec);
793 fscal = _mm_andnot_ps(dummy_mask,fscal);
795 /* Update vectorial force */
796 fix1 = _mm_macc_ps(dx11,fscal,fix1);
797 fiy1 = _mm_macc_ps(dy11,fscal,fiy1);
798 fiz1 = _mm_macc_ps(dz11,fscal,fiz1);
800 fjx1 = _mm_macc_ps(dx11,fscal,fjx1);
801 fjy1 = _mm_macc_ps(dy11,fscal,fjy1);
802 fjz1 = _mm_macc_ps(dz11,fscal,fjz1);
804 /**************************
805 * CALCULATE INTERACTIONS *
806 **************************/
808 r12 = _mm_mul_ps(rsq12,rinv12);
809 r12 = _mm_andnot_ps(dummy_mask,r12);
811 /* EWALD ELECTROSTATICS */
813 /* Analytical PME correction */
814 zeta2 = _mm_mul_ps(beta2,rsq12);
815 rinv3 = _mm_mul_ps(rinvsq12,rinv12);
816 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
817 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
818 felec = _mm_mul_ps(qq12,felec);
819 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
820 velec = _mm_nmacc_ps(pmecorrV,beta,rinv12);
821 velec = _mm_mul_ps(qq12,velec);
823 /* Update potential sum for this i atom from the interaction with this j atom. */
824 velec = _mm_andnot_ps(dummy_mask,velec);
825 velecsum = _mm_add_ps(velecsum,velec);
829 fscal = _mm_andnot_ps(dummy_mask,fscal);
831 /* Update vectorial force */
832 fix1 = _mm_macc_ps(dx12,fscal,fix1);
833 fiy1 = _mm_macc_ps(dy12,fscal,fiy1);
834 fiz1 = _mm_macc_ps(dz12,fscal,fiz1);
836 fjx2 = _mm_macc_ps(dx12,fscal,fjx2);
837 fjy2 = _mm_macc_ps(dy12,fscal,fjy2);
838 fjz2 = _mm_macc_ps(dz12,fscal,fjz2);
840 /**************************
841 * CALCULATE INTERACTIONS *
842 **************************/
844 r13 = _mm_mul_ps(rsq13,rinv13);
845 r13 = _mm_andnot_ps(dummy_mask,r13);
847 /* EWALD ELECTROSTATICS */
849 /* Analytical PME correction */
850 zeta2 = _mm_mul_ps(beta2,rsq13);
851 rinv3 = _mm_mul_ps(rinvsq13,rinv13);
852 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
853 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
854 felec = _mm_mul_ps(qq13,felec);
855 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
856 velec = _mm_nmacc_ps(pmecorrV,beta,rinv13);
857 velec = _mm_mul_ps(qq13,velec);
859 /* Update potential sum for this i atom from the interaction with this j atom. */
860 velec = _mm_andnot_ps(dummy_mask,velec);
861 velecsum = _mm_add_ps(velecsum,velec);
865 fscal = _mm_andnot_ps(dummy_mask,fscal);
867 /* Update vectorial force */
868 fix1 = _mm_macc_ps(dx13,fscal,fix1);
869 fiy1 = _mm_macc_ps(dy13,fscal,fiy1);
870 fiz1 = _mm_macc_ps(dz13,fscal,fiz1);
872 fjx3 = _mm_macc_ps(dx13,fscal,fjx3);
873 fjy3 = _mm_macc_ps(dy13,fscal,fjy3);
874 fjz3 = _mm_macc_ps(dz13,fscal,fjz3);
876 /**************************
877 * CALCULATE INTERACTIONS *
878 **************************/
880 r21 = _mm_mul_ps(rsq21,rinv21);
881 r21 = _mm_andnot_ps(dummy_mask,r21);
883 /* EWALD ELECTROSTATICS */
885 /* Analytical PME correction */
886 zeta2 = _mm_mul_ps(beta2,rsq21);
887 rinv3 = _mm_mul_ps(rinvsq21,rinv21);
888 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
889 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
890 felec = _mm_mul_ps(qq21,felec);
891 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
892 velec = _mm_nmacc_ps(pmecorrV,beta,rinv21);
893 velec = _mm_mul_ps(qq21,velec);
895 /* Update potential sum for this i atom from the interaction with this j atom. */
896 velec = _mm_andnot_ps(dummy_mask,velec);
897 velecsum = _mm_add_ps(velecsum,velec);
901 fscal = _mm_andnot_ps(dummy_mask,fscal);
903 /* Update vectorial force */
904 fix2 = _mm_macc_ps(dx21,fscal,fix2);
905 fiy2 = _mm_macc_ps(dy21,fscal,fiy2);
906 fiz2 = _mm_macc_ps(dz21,fscal,fiz2);
908 fjx1 = _mm_macc_ps(dx21,fscal,fjx1);
909 fjy1 = _mm_macc_ps(dy21,fscal,fjy1);
910 fjz1 = _mm_macc_ps(dz21,fscal,fjz1);
912 /**************************
913 * CALCULATE INTERACTIONS *
914 **************************/
916 r22 = _mm_mul_ps(rsq22,rinv22);
917 r22 = _mm_andnot_ps(dummy_mask,r22);
919 /* EWALD ELECTROSTATICS */
921 /* Analytical PME correction */
922 zeta2 = _mm_mul_ps(beta2,rsq22);
923 rinv3 = _mm_mul_ps(rinvsq22,rinv22);
924 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
925 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
926 felec = _mm_mul_ps(qq22,felec);
927 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
928 velec = _mm_nmacc_ps(pmecorrV,beta,rinv22);
929 velec = _mm_mul_ps(qq22,velec);
931 /* Update potential sum for this i atom from the interaction with this j atom. */
932 velec = _mm_andnot_ps(dummy_mask,velec);
933 velecsum = _mm_add_ps(velecsum,velec);
937 fscal = _mm_andnot_ps(dummy_mask,fscal);
939 /* Update vectorial force */
940 fix2 = _mm_macc_ps(dx22,fscal,fix2);
941 fiy2 = _mm_macc_ps(dy22,fscal,fiy2);
942 fiz2 = _mm_macc_ps(dz22,fscal,fiz2);
944 fjx2 = _mm_macc_ps(dx22,fscal,fjx2);
945 fjy2 = _mm_macc_ps(dy22,fscal,fjy2);
946 fjz2 = _mm_macc_ps(dz22,fscal,fjz2);
948 /**************************
949 * CALCULATE INTERACTIONS *
950 **************************/
952 r23 = _mm_mul_ps(rsq23,rinv23);
953 r23 = _mm_andnot_ps(dummy_mask,r23);
955 /* EWALD ELECTROSTATICS */
957 /* Analytical PME correction */
958 zeta2 = _mm_mul_ps(beta2,rsq23);
959 rinv3 = _mm_mul_ps(rinvsq23,rinv23);
960 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
961 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
962 felec = _mm_mul_ps(qq23,felec);
963 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
964 velec = _mm_nmacc_ps(pmecorrV,beta,rinv23);
965 velec = _mm_mul_ps(qq23,velec);
967 /* Update potential sum for this i atom from the interaction with this j atom. */
968 velec = _mm_andnot_ps(dummy_mask,velec);
969 velecsum = _mm_add_ps(velecsum,velec);
973 fscal = _mm_andnot_ps(dummy_mask,fscal);
975 /* Update vectorial force */
976 fix2 = _mm_macc_ps(dx23,fscal,fix2);
977 fiy2 = _mm_macc_ps(dy23,fscal,fiy2);
978 fiz2 = _mm_macc_ps(dz23,fscal,fiz2);
980 fjx3 = _mm_macc_ps(dx23,fscal,fjx3);
981 fjy3 = _mm_macc_ps(dy23,fscal,fjy3);
982 fjz3 = _mm_macc_ps(dz23,fscal,fjz3);
984 /**************************
985 * CALCULATE INTERACTIONS *
986 **************************/
988 r31 = _mm_mul_ps(rsq31,rinv31);
989 r31 = _mm_andnot_ps(dummy_mask,r31);
991 /* EWALD ELECTROSTATICS */
993 /* Analytical PME correction */
994 zeta2 = _mm_mul_ps(beta2,rsq31);
995 rinv3 = _mm_mul_ps(rinvsq31,rinv31);
996 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
997 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
998 felec = _mm_mul_ps(qq31,felec);
999 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
1000 velec = _mm_nmacc_ps(pmecorrV,beta,rinv31);
1001 velec = _mm_mul_ps(qq31,velec);
1003 /* Update potential sum for this i atom from the interaction with this j atom. */
1004 velec = _mm_andnot_ps(dummy_mask,velec);
1005 velecsum = _mm_add_ps(velecsum,velec);
1009 fscal = _mm_andnot_ps(dummy_mask,fscal);
1011 /* Update vectorial force */
1012 fix3 = _mm_macc_ps(dx31,fscal,fix3);
1013 fiy3 = _mm_macc_ps(dy31,fscal,fiy3);
1014 fiz3 = _mm_macc_ps(dz31,fscal,fiz3);
1016 fjx1 = _mm_macc_ps(dx31,fscal,fjx1);
1017 fjy1 = _mm_macc_ps(dy31,fscal,fjy1);
1018 fjz1 = _mm_macc_ps(dz31,fscal,fjz1);
1020 /**************************
1021 * CALCULATE INTERACTIONS *
1022 **************************/
1024 r32 = _mm_mul_ps(rsq32,rinv32);
1025 r32 = _mm_andnot_ps(dummy_mask,r32);
1027 /* EWALD ELECTROSTATICS */
1029 /* Analytical PME correction */
1030 zeta2 = _mm_mul_ps(beta2,rsq32);
1031 rinv3 = _mm_mul_ps(rinvsq32,rinv32);
1032 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1033 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1034 felec = _mm_mul_ps(qq32,felec);
1035 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
1036 velec = _mm_nmacc_ps(pmecorrV,beta,rinv32);
1037 velec = _mm_mul_ps(qq32,velec);
1039 /* Update potential sum for this i atom from the interaction with this j atom. */
1040 velec = _mm_andnot_ps(dummy_mask,velec);
1041 velecsum = _mm_add_ps(velecsum,velec);
1045 fscal = _mm_andnot_ps(dummy_mask,fscal);
1047 /* Update vectorial force */
1048 fix3 = _mm_macc_ps(dx32,fscal,fix3);
1049 fiy3 = _mm_macc_ps(dy32,fscal,fiy3);
1050 fiz3 = _mm_macc_ps(dz32,fscal,fiz3);
1052 fjx2 = _mm_macc_ps(dx32,fscal,fjx2);
1053 fjy2 = _mm_macc_ps(dy32,fscal,fjy2);
1054 fjz2 = _mm_macc_ps(dz32,fscal,fjz2);
1056 /**************************
1057 * CALCULATE INTERACTIONS *
1058 **************************/
1060 r33 = _mm_mul_ps(rsq33,rinv33);
1061 r33 = _mm_andnot_ps(dummy_mask,r33);
1063 /* EWALD ELECTROSTATICS */
1065 /* Analytical PME correction */
1066 zeta2 = _mm_mul_ps(beta2,rsq33);
1067 rinv3 = _mm_mul_ps(rinvsq33,rinv33);
1068 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1069 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1070 felec = _mm_mul_ps(qq33,felec);
1071 pmecorrV = gmx_mm_pmecorrV_ps(zeta2);
1072 velec = _mm_nmacc_ps(pmecorrV,beta,rinv33);
1073 velec = _mm_mul_ps(qq33,velec);
1075 /* Update potential sum for this i atom from the interaction with this j atom. */
1076 velec = _mm_andnot_ps(dummy_mask,velec);
1077 velecsum = _mm_add_ps(velecsum,velec);
1081 fscal = _mm_andnot_ps(dummy_mask,fscal);
1083 /* Update vectorial force */
1084 fix3 = _mm_macc_ps(dx33,fscal,fix3);
1085 fiy3 = _mm_macc_ps(dy33,fscal,fiy3);
1086 fiz3 = _mm_macc_ps(dz33,fscal,fiz3);
1088 fjx3 = _mm_macc_ps(dx33,fscal,fjx3);
1089 fjy3 = _mm_macc_ps(dy33,fscal,fjy3);
1090 fjz3 = _mm_macc_ps(dz33,fscal,fjz3);
1092 fjptrA = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
1093 fjptrB = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
1094 fjptrC = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
1095 fjptrD = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
1097 gmx_mm_decrement_4rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1098 fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,
1099 fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
1101 /* Inner loop uses 308 flops */
1104 /* End of innermost loop */
1106 gmx_mm_update_iforce_4atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,fix3,fiy3,fiz3,
1107 f+i_coord_offset,fshift+i_shift_offset);
1110 /* Update potential energies */
1111 gmx_mm_update_1pot_ps(velecsum,kernel_data->energygrp_elec+ggid);
1112 gmx_mm_update_1pot_ps(vvdwsum,kernel_data->energygrp_vdw+ggid);
1114 /* Increment number of inner iterations */
1115 inneriter += j_index_end - j_index_start;
1117 /* Outer loop uses 26 flops */
1120 /* Increment number of outer iterations */
1123 /* Update outer/inner flops */
1125 inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_VF,outeriter*26 + inneriter*308);
1128 * Gromacs nonbonded kernel: nb_kernel_ElecEw_VdwLJ_GeomW4W4_F_avx_128_fma_single
1129 * Electrostatics interaction: Ewald
1130 * VdW interaction: LennardJones
1131 * Geometry: Water4-Water4
1132 * Calculate force/pot: Force
1135 nb_kernel_ElecEw_VdwLJ_GeomW4W4_F_avx_128_fma_single
1136 (t_nblist * gmx_restrict nlist,
1137 rvec * gmx_restrict xx,
1138 rvec * gmx_restrict ff,
1139 t_forcerec * gmx_restrict fr,
1140 t_mdatoms * gmx_restrict mdatoms,
1141 nb_kernel_data_t * gmx_restrict kernel_data,
1142 t_nrnb * gmx_restrict nrnb)
1144 /* Suffixes 0,1,2,3 refer to particle indices for waters in the inner or outer loop, or
1145 * just 0 for non-waters.
1146 * Suffixes A,B,C,D refer to j loop unrolling done with AVX_128, e.g. for the four different
1147 * jnr indices corresponding to data put in the four positions in the SIMD register.
1149 int i_shift_offset,i_coord_offset,outeriter,inneriter;
1150 int j_index_start,j_index_end,jidx,nri,inr,ggid,iidx;
1151 int jnrA,jnrB,jnrC,jnrD;
1152 int jnrlistA,jnrlistB,jnrlistC,jnrlistD;
1153 int j_coord_offsetA,j_coord_offsetB,j_coord_offsetC,j_coord_offsetD;
1154 int *iinr,*jindex,*jjnr,*shiftidx,*gid;
1155 real rcutoff_scalar;
1156 real *shiftvec,*fshift,*x,*f;
1157 real *fjptrA,*fjptrB,*fjptrC,*fjptrD;
1158 real scratch[4*DIM];
1159 __m128 fscal,rcutoff,rcutoff2,jidxall;
1161 __m128 ix0,iy0,iz0,fix0,fiy0,fiz0,iq0,isai0;
1163 __m128 ix1,iy1,iz1,fix1,fiy1,fiz1,iq1,isai1;
1165 __m128 ix2,iy2,iz2,fix2,fiy2,fiz2,iq2,isai2;
1167 __m128 ix3,iy3,iz3,fix3,fiy3,fiz3,iq3,isai3;
1168 int vdwjidx0A,vdwjidx0B,vdwjidx0C,vdwjidx0D;
1169 __m128 jx0,jy0,jz0,fjx0,fjy0,fjz0,jq0,isaj0;
1170 int vdwjidx1A,vdwjidx1B,vdwjidx1C,vdwjidx1D;
1171 __m128 jx1,jy1,jz1,fjx1,fjy1,fjz1,jq1,isaj1;
1172 int vdwjidx2A,vdwjidx2B,vdwjidx2C,vdwjidx2D;
1173 __m128 jx2,jy2,jz2,fjx2,fjy2,fjz2,jq2,isaj2;
1174 int vdwjidx3A,vdwjidx3B,vdwjidx3C,vdwjidx3D;
1175 __m128 jx3,jy3,jz3,fjx3,fjy3,fjz3,jq3,isaj3;
1176 __m128 dx00,dy00,dz00,rsq00,rinv00,rinvsq00,r00,qq00,c6_00,c12_00;
1177 __m128 dx11,dy11,dz11,rsq11,rinv11,rinvsq11,r11,qq11,c6_11,c12_11;
1178 __m128 dx12,dy12,dz12,rsq12,rinv12,rinvsq12,r12,qq12,c6_12,c12_12;
1179 __m128 dx13,dy13,dz13,rsq13,rinv13,rinvsq13,r13,qq13,c6_13,c12_13;
1180 __m128 dx21,dy21,dz21,rsq21,rinv21,rinvsq21,r21,qq21,c6_21,c12_21;
1181 __m128 dx22,dy22,dz22,rsq22,rinv22,rinvsq22,r22,qq22,c6_22,c12_22;
1182 __m128 dx23,dy23,dz23,rsq23,rinv23,rinvsq23,r23,qq23,c6_23,c12_23;
1183 __m128 dx31,dy31,dz31,rsq31,rinv31,rinvsq31,r31,qq31,c6_31,c12_31;
1184 __m128 dx32,dy32,dz32,rsq32,rinv32,rinvsq32,r32,qq32,c6_32,c12_32;
1185 __m128 dx33,dy33,dz33,rsq33,rinv33,rinvsq33,r33,qq33,c6_33,c12_33;
1186 __m128 velec,felec,velecsum,facel,crf,krf,krf2;
1189 __m128 rinvsix,rvdw,vvdw,vvdw6,vvdw12,fvdw,fvdw6,fvdw12,vvdwsum,sh_vdw_invrcut6;
1192 __m128 one_sixth = _mm_set1_ps(1.0/6.0);
1193 __m128 one_twelfth = _mm_set1_ps(1.0/12.0);
1195 __m128 ewtabscale,eweps,twoeweps,sh_ewald,ewrt,ewtabhalfspace,ewtabF,ewtabFn,ewtabD,ewtabV;
1196 __m128 beta,beta2,beta3,zeta2,pmecorrF,pmecorrV,rinv3;
1198 __m128 dummy_mask,cutoff_mask;
1199 __m128 signbit = _mm_castsi128_ps( _mm_set1_epi32(0x80000000) );
1200 __m128 one = _mm_set1_ps(1.0);
1201 __m128 two = _mm_set1_ps(2.0);
1207 jindex = nlist->jindex;
1209 shiftidx = nlist->shift;
1211 shiftvec = fr->shift_vec[0];
1212 fshift = fr->fshift[0];
1213 facel = _mm_set1_ps(fr->epsfac);
1214 charge = mdatoms->chargeA;
1215 nvdwtype = fr->ntype;
1216 vdwparam = fr->nbfp;
1217 vdwtype = mdatoms->typeA;
1219 sh_ewald = _mm_set1_ps(fr->ic->sh_ewald);
1220 beta = _mm_set1_ps(fr->ic->ewaldcoeff);
1221 beta2 = _mm_mul_ps(beta,beta);
1222 beta3 = _mm_mul_ps(beta,beta2);
1223 ewtab = fr->ic->tabq_coul_F;
1224 ewtabscale = _mm_set1_ps(fr->ic->tabq_scale);
1225 ewtabhalfspace = _mm_set1_ps(0.5/fr->ic->tabq_scale);
1227 /* Setup water-specific parameters */
1228 inr = nlist->iinr[0];
1229 iq1 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+1]));
1230 iq2 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+2]));
1231 iq3 = _mm_mul_ps(facel,_mm_set1_ps(charge[inr+3]));
1232 vdwioffset0 = 2*nvdwtype*vdwtype[inr+0];
1234 jq1 = _mm_set1_ps(charge[inr+1]);
1235 jq2 = _mm_set1_ps(charge[inr+2]);
1236 jq3 = _mm_set1_ps(charge[inr+3]);
1237 vdwjidx0A = 2*vdwtype[inr+0];
1238 c6_00 = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A]);
1239 c12_00 = _mm_set1_ps(vdwparam[vdwioffset0+vdwjidx0A+1]);
1240 qq11 = _mm_mul_ps(iq1,jq1);
1241 qq12 = _mm_mul_ps(iq1,jq2);
1242 qq13 = _mm_mul_ps(iq1,jq3);
1243 qq21 = _mm_mul_ps(iq2,jq1);
1244 qq22 = _mm_mul_ps(iq2,jq2);
1245 qq23 = _mm_mul_ps(iq2,jq3);
1246 qq31 = _mm_mul_ps(iq3,jq1);
1247 qq32 = _mm_mul_ps(iq3,jq2);
1248 qq33 = _mm_mul_ps(iq3,jq3);
1250 /* Avoid stupid compiler warnings */
1251 jnrA = jnrB = jnrC = jnrD = 0;
1252 j_coord_offsetA = 0;
1253 j_coord_offsetB = 0;
1254 j_coord_offsetC = 0;
1255 j_coord_offsetD = 0;
1260 for(iidx=0;iidx<4*DIM;iidx++)
1262 scratch[iidx] = 0.0;
1265 /* Start outer loop over neighborlists */
1266 for(iidx=0; iidx<nri; iidx++)
1268 /* Load shift vector for this list */
1269 i_shift_offset = DIM*shiftidx[iidx];
1271 /* Load limits for loop over neighbors */
1272 j_index_start = jindex[iidx];
1273 j_index_end = jindex[iidx+1];
1275 /* Get outer coordinate index */
1277 i_coord_offset = DIM*inr;
1279 /* Load i particle coords and add shift vector */
1280 gmx_mm_load_shift_and_4rvec_broadcast_ps(shiftvec+i_shift_offset,x+i_coord_offset,
1281 &ix0,&iy0,&iz0,&ix1,&iy1,&iz1,&ix2,&iy2,&iz2,&ix3,&iy3,&iz3);
1283 fix0 = _mm_setzero_ps();
1284 fiy0 = _mm_setzero_ps();
1285 fiz0 = _mm_setzero_ps();
1286 fix1 = _mm_setzero_ps();
1287 fiy1 = _mm_setzero_ps();
1288 fiz1 = _mm_setzero_ps();
1289 fix2 = _mm_setzero_ps();
1290 fiy2 = _mm_setzero_ps();
1291 fiz2 = _mm_setzero_ps();
1292 fix3 = _mm_setzero_ps();
1293 fiy3 = _mm_setzero_ps();
1294 fiz3 = _mm_setzero_ps();
1296 /* Start inner kernel loop */
1297 for(jidx=j_index_start; jidx<j_index_end && jjnr[jidx+3]>=0; jidx+=4)
1300 /* Get j neighbor index, and coordinate index */
1302 jnrB = jjnr[jidx+1];
1303 jnrC = jjnr[jidx+2];
1304 jnrD = jjnr[jidx+3];
1305 j_coord_offsetA = DIM*jnrA;
1306 j_coord_offsetB = DIM*jnrB;
1307 j_coord_offsetC = DIM*jnrC;
1308 j_coord_offsetD = DIM*jnrD;
1310 /* load j atom coordinates */
1311 gmx_mm_load_4rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1312 x+j_coord_offsetC,x+j_coord_offsetD,
1313 &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
1314 &jy2,&jz2,&jx3,&jy3,&jz3);
1316 /* Calculate displacement vector */
1317 dx00 = _mm_sub_ps(ix0,jx0);
1318 dy00 = _mm_sub_ps(iy0,jy0);
1319 dz00 = _mm_sub_ps(iz0,jz0);
1320 dx11 = _mm_sub_ps(ix1,jx1);
1321 dy11 = _mm_sub_ps(iy1,jy1);
1322 dz11 = _mm_sub_ps(iz1,jz1);
1323 dx12 = _mm_sub_ps(ix1,jx2);
1324 dy12 = _mm_sub_ps(iy1,jy2);
1325 dz12 = _mm_sub_ps(iz1,jz2);
1326 dx13 = _mm_sub_ps(ix1,jx3);
1327 dy13 = _mm_sub_ps(iy1,jy3);
1328 dz13 = _mm_sub_ps(iz1,jz3);
1329 dx21 = _mm_sub_ps(ix2,jx1);
1330 dy21 = _mm_sub_ps(iy2,jy1);
1331 dz21 = _mm_sub_ps(iz2,jz1);
1332 dx22 = _mm_sub_ps(ix2,jx2);
1333 dy22 = _mm_sub_ps(iy2,jy2);
1334 dz22 = _mm_sub_ps(iz2,jz2);
1335 dx23 = _mm_sub_ps(ix2,jx3);
1336 dy23 = _mm_sub_ps(iy2,jy3);
1337 dz23 = _mm_sub_ps(iz2,jz3);
1338 dx31 = _mm_sub_ps(ix3,jx1);
1339 dy31 = _mm_sub_ps(iy3,jy1);
1340 dz31 = _mm_sub_ps(iz3,jz1);
1341 dx32 = _mm_sub_ps(ix3,jx2);
1342 dy32 = _mm_sub_ps(iy3,jy2);
1343 dz32 = _mm_sub_ps(iz3,jz2);
1344 dx33 = _mm_sub_ps(ix3,jx3);
1345 dy33 = _mm_sub_ps(iy3,jy3);
1346 dz33 = _mm_sub_ps(iz3,jz3);
1348 /* Calculate squared distance and things based on it */
1349 rsq00 = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1350 rsq11 = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1351 rsq12 = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1352 rsq13 = gmx_mm_calc_rsq_ps(dx13,dy13,dz13);
1353 rsq21 = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1354 rsq22 = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1355 rsq23 = gmx_mm_calc_rsq_ps(dx23,dy23,dz23);
1356 rsq31 = gmx_mm_calc_rsq_ps(dx31,dy31,dz31);
1357 rsq32 = gmx_mm_calc_rsq_ps(dx32,dy32,dz32);
1358 rsq33 = gmx_mm_calc_rsq_ps(dx33,dy33,dz33);
1360 rinv11 = gmx_mm_invsqrt_ps(rsq11);
1361 rinv12 = gmx_mm_invsqrt_ps(rsq12);
1362 rinv13 = gmx_mm_invsqrt_ps(rsq13);
1363 rinv21 = gmx_mm_invsqrt_ps(rsq21);
1364 rinv22 = gmx_mm_invsqrt_ps(rsq22);
1365 rinv23 = gmx_mm_invsqrt_ps(rsq23);
1366 rinv31 = gmx_mm_invsqrt_ps(rsq31);
1367 rinv32 = gmx_mm_invsqrt_ps(rsq32);
1368 rinv33 = gmx_mm_invsqrt_ps(rsq33);
1370 rinvsq00 = gmx_mm_inv_ps(rsq00);
1371 rinvsq11 = _mm_mul_ps(rinv11,rinv11);
1372 rinvsq12 = _mm_mul_ps(rinv12,rinv12);
1373 rinvsq13 = _mm_mul_ps(rinv13,rinv13);
1374 rinvsq21 = _mm_mul_ps(rinv21,rinv21);
1375 rinvsq22 = _mm_mul_ps(rinv22,rinv22);
1376 rinvsq23 = _mm_mul_ps(rinv23,rinv23);
1377 rinvsq31 = _mm_mul_ps(rinv31,rinv31);
1378 rinvsq32 = _mm_mul_ps(rinv32,rinv32);
1379 rinvsq33 = _mm_mul_ps(rinv33,rinv33);
1381 fjx0 = _mm_setzero_ps();
1382 fjy0 = _mm_setzero_ps();
1383 fjz0 = _mm_setzero_ps();
1384 fjx1 = _mm_setzero_ps();
1385 fjy1 = _mm_setzero_ps();
1386 fjz1 = _mm_setzero_ps();
1387 fjx2 = _mm_setzero_ps();
1388 fjy2 = _mm_setzero_ps();
1389 fjz2 = _mm_setzero_ps();
1390 fjx3 = _mm_setzero_ps();
1391 fjy3 = _mm_setzero_ps();
1392 fjz3 = _mm_setzero_ps();
1394 /**************************
1395 * CALCULATE INTERACTIONS *
1396 **************************/
1398 /* LENNARD-JONES DISPERSION/REPULSION */
1400 rinvsix = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
1401 fvdw = _mm_mul_ps(_mm_msub_ps(c12_00,rinvsix,c6_00),_mm_mul_ps(rinvsix,rinvsq00));
1405 /* Update vectorial force */
1406 fix0 = _mm_macc_ps(dx00,fscal,fix0);
1407 fiy0 = _mm_macc_ps(dy00,fscal,fiy0);
1408 fiz0 = _mm_macc_ps(dz00,fscal,fiz0);
1410 fjx0 = _mm_macc_ps(dx00,fscal,fjx0);
1411 fjy0 = _mm_macc_ps(dy00,fscal,fjy0);
1412 fjz0 = _mm_macc_ps(dz00,fscal,fjz0);
1414 /**************************
1415 * CALCULATE INTERACTIONS *
1416 **************************/
1418 r11 = _mm_mul_ps(rsq11,rinv11);
1420 /* EWALD ELECTROSTATICS */
1422 /* Analytical PME correction */
1423 zeta2 = _mm_mul_ps(beta2,rsq11);
1424 rinv3 = _mm_mul_ps(rinvsq11,rinv11);
1425 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1426 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1427 felec = _mm_mul_ps(qq11,felec);
1431 /* Update vectorial force */
1432 fix1 = _mm_macc_ps(dx11,fscal,fix1);
1433 fiy1 = _mm_macc_ps(dy11,fscal,fiy1);
1434 fiz1 = _mm_macc_ps(dz11,fscal,fiz1);
1436 fjx1 = _mm_macc_ps(dx11,fscal,fjx1);
1437 fjy1 = _mm_macc_ps(dy11,fscal,fjy1);
1438 fjz1 = _mm_macc_ps(dz11,fscal,fjz1);
1440 /**************************
1441 * CALCULATE INTERACTIONS *
1442 **************************/
1444 r12 = _mm_mul_ps(rsq12,rinv12);
1446 /* EWALD ELECTROSTATICS */
1448 /* Analytical PME correction */
1449 zeta2 = _mm_mul_ps(beta2,rsq12);
1450 rinv3 = _mm_mul_ps(rinvsq12,rinv12);
1451 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1452 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1453 felec = _mm_mul_ps(qq12,felec);
1457 /* Update vectorial force */
1458 fix1 = _mm_macc_ps(dx12,fscal,fix1);
1459 fiy1 = _mm_macc_ps(dy12,fscal,fiy1);
1460 fiz1 = _mm_macc_ps(dz12,fscal,fiz1);
1462 fjx2 = _mm_macc_ps(dx12,fscal,fjx2);
1463 fjy2 = _mm_macc_ps(dy12,fscal,fjy2);
1464 fjz2 = _mm_macc_ps(dz12,fscal,fjz2);
1466 /**************************
1467 * CALCULATE INTERACTIONS *
1468 **************************/
1470 r13 = _mm_mul_ps(rsq13,rinv13);
1472 /* EWALD ELECTROSTATICS */
1474 /* Analytical PME correction */
1475 zeta2 = _mm_mul_ps(beta2,rsq13);
1476 rinv3 = _mm_mul_ps(rinvsq13,rinv13);
1477 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1478 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1479 felec = _mm_mul_ps(qq13,felec);
1483 /* Update vectorial force */
1484 fix1 = _mm_macc_ps(dx13,fscal,fix1);
1485 fiy1 = _mm_macc_ps(dy13,fscal,fiy1);
1486 fiz1 = _mm_macc_ps(dz13,fscal,fiz1);
1488 fjx3 = _mm_macc_ps(dx13,fscal,fjx3);
1489 fjy3 = _mm_macc_ps(dy13,fscal,fjy3);
1490 fjz3 = _mm_macc_ps(dz13,fscal,fjz3);
1492 /**************************
1493 * CALCULATE INTERACTIONS *
1494 **************************/
1496 r21 = _mm_mul_ps(rsq21,rinv21);
1498 /* EWALD ELECTROSTATICS */
1500 /* Analytical PME correction */
1501 zeta2 = _mm_mul_ps(beta2,rsq21);
1502 rinv3 = _mm_mul_ps(rinvsq21,rinv21);
1503 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1504 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1505 felec = _mm_mul_ps(qq21,felec);
1509 /* Update vectorial force */
1510 fix2 = _mm_macc_ps(dx21,fscal,fix2);
1511 fiy2 = _mm_macc_ps(dy21,fscal,fiy2);
1512 fiz2 = _mm_macc_ps(dz21,fscal,fiz2);
1514 fjx1 = _mm_macc_ps(dx21,fscal,fjx1);
1515 fjy1 = _mm_macc_ps(dy21,fscal,fjy1);
1516 fjz1 = _mm_macc_ps(dz21,fscal,fjz1);
1518 /**************************
1519 * CALCULATE INTERACTIONS *
1520 **************************/
1522 r22 = _mm_mul_ps(rsq22,rinv22);
1524 /* EWALD ELECTROSTATICS */
1526 /* Analytical PME correction */
1527 zeta2 = _mm_mul_ps(beta2,rsq22);
1528 rinv3 = _mm_mul_ps(rinvsq22,rinv22);
1529 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1530 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1531 felec = _mm_mul_ps(qq22,felec);
1535 /* Update vectorial force */
1536 fix2 = _mm_macc_ps(dx22,fscal,fix2);
1537 fiy2 = _mm_macc_ps(dy22,fscal,fiy2);
1538 fiz2 = _mm_macc_ps(dz22,fscal,fiz2);
1540 fjx2 = _mm_macc_ps(dx22,fscal,fjx2);
1541 fjy2 = _mm_macc_ps(dy22,fscal,fjy2);
1542 fjz2 = _mm_macc_ps(dz22,fscal,fjz2);
1544 /**************************
1545 * CALCULATE INTERACTIONS *
1546 **************************/
1548 r23 = _mm_mul_ps(rsq23,rinv23);
1550 /* EWALD ELECTROSTATICS */
1552 /* Analytical PME correction */
1553 zeta2 = _mm_mul_ps(beta2,rsq23);
1554 rinv3 = _mm_mul_ps(rinvsq23,rinv23);
1555 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1556 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1557 felec = _mm_mul_ps(qq23,felec);
1561 /* Update vectorial force */
1562 fix2 = _mm_macc_ps(dx23,fscal,fix2);
1563 fiy2 = _mm_macc_ps(dy23,fscal,fiy2);
1564 fiz2 = _mm_macc_ps(dz23,fscal,fiz2);
1566 fjx3 = _mm_macc_ps(dx23,fscal,fjx3);
1567 fjy3 = _mm_macc_ps(dy23,fscal,fjy3);
1568 fjz3 = _mm_macc_ps(dz23,fscal,fjz3);
1570 /**************************
1571 * CALCULATE INTERACTIONS *
1572 **************************/
1574 r31 = _mm_mul_ps(rsq31,rinv31);
1576 /* EWALD ELECTROSTATICS */
1578 /* Analytical PME correction */
1579 zeta2 = _mm_mul_ps(beta2,rsq31);
1580 rinv3 = _mm_mul_ps(rinvsq31,rinv31);
1581 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1582 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1583 felec = _mm_mul_ps(qq31,felec);
1587 /* Update vectorial force */
1588 fix3 = _mm_macc_ps(dx31,fscal,fix3);
1589 fiy3 = _mm_macc_ps(dy31,fscal,fiy3);
1590 fiz3 = _mm_macc_ps(dz31,fscal,fiz3);
1592 fjx1 = _mm_macc_ps(dx31,fscal,fjx1);
1593 fjy1 = _mm_macc_ps(dy31,fscal,fjy1);
1594 fjz1 = _mm_macc_ps(dz31,fscal,fjz1);
1596 /**************************
1597 * CALCULATE INTERACTIONS *
1598 **************************/
1600 r32 = _mm_mul_ps(rsq32,rinv32);
1602 /* EWALD ELECTROSTATICS */
1604 /* Analytical PME correction */
1605 zeta2 = _mm_mul_ps(beta2,rsq32);
1606 rinv3 = _mm_mul_ps(rinvsq32,rinv32);
1607 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1608 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1609 felec = _mm_mul_ps(qq32,felec);
1613 /* Update vectorial force */
1614 fix3 = _mm_macc_ps(dx32,fscal,fix3);
1615 fiy3 = _mm_macc_ps(dy32,fscal,fiy3);
1616 fiz3 = _mm_macc_ps(dz32,fscal,fiz3);
1618 fjx2 = _mm_macc_ps(dx32,fscal,fjx2);
1619 fjy2 = _mm_macc_ps(dy32,fscal,fjy2);
1620 fjz2 = _mm_macc_ps(dz32,fscal,fjz2);
1622 /**************************
1623 * CALCULATE INTERACTIONS *
1624 **************************/
1626 r33 = _mm_mul_ps(rsq33,rinv33);
1628 /* EWALD ELECTROSTATICS */
1630 /* Analytical PME correction */
1631 zeta2 = _mm_mul_ps(beta2,rsq33);
1632 rinv3 = _mm_mul_ps(rinvsq33,rinv33);
1633 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1634 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1635 felec = _mm_mul_ps(qq33,felec);
1639 /* Update vectorial force */
1640 fix3 = _mm_macc_ps(dx33,fscal,fix3);
1641 fiy3 = _mm_macc_ps(dy33,fscal,fiy3);
1642 fiz3 = _mm_macc_ps(dz33,fscal,fiz3);
1644 fjx3 = _mm_macc_ps(dx33,fscal,fjx3);
1645 fjy3 = _mm_macc_ps(dy33,fscal,fjy3);
1646 fjz3 = _mm_macc_ps(dz33,fscal,fjz3);
1648 fjptrA = f+j_coord_offsetA;
1649 fjptrB = f+j_coord_offsetB;
1650 fjptrC = f+j_coord_offsetC;
1651 fjptrD = f+j_coord_offsetD;
1653 gmx_mm_decrement_4rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
1654 fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,
1655 fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
1657 /* Inner loop uses 285 flops */
1660 if(jidx<j_index_end)
1663 /* Get j neighbor index, and coordinate index */
1664 jnrlistA = jjnr[jidx];
1665 jnrlistB = jjnr[jidx+1];
1666 jnrlistC = jjnr[jidx+2];
1667 jnrlistD = jjnr[jidx+3];
1668 /* Sign of each element will be negative for non-real atoms.
1669 * This mask will be 0xFFFFFFFF for dummy entries and 0x0 for real ones,
1670 * so use it as val = _mm_andnot_ps(mask,val) to clear dummy entries.
1672 dummy_mask = gmx_mm_castsi128_ps(_mm_cmplt_epi32(_mm_loadu_si128((const __m128i *)(jjnr+jidx)),_mm_setzero_si128()));
1673 jnrA = (jnrlistA>=0) ? jnrlistA : 0;
1674 jnrB = (jnrlistB>=0) ? jnrlistB : 0;
1675 jnrC = (jnrlistC>=0) ? jnrlistC : 0;
1676 jnrD = (jnrlistD>=0) ? jnrlistD : 0;
1677 j_coord_offsetA = DIM*jnrA;
1678 j_coord_offsetB = DIM*jnrB;
1679 j_coord_offsetC = DIM*jnrC;
1680 j_coord_offsetD = DIM*jnrD;
1682 /* load j atom coordinates */
1683 gmx_mm_load_4rvec_4ptr_swizzle_ps(x+j_coord_offsetA,x+j_coord_offsetB,
1684 x+j_coord_offsetC,x+j_coord_offsetD,
1685 &jx0,&jy0,&jz0,&jx1,&jy1,&jz1,&jx2,
1686 &jy2,&jz2,&jx3,&jy3,&jz3);
1688 /* Calculate displacement vector */
1689 dx00 = _mm_sub_ps(ix0,jx0);
1690 dy00 = _mm_sub_ps(iy0,jy0);
1691 dz00 = _mm_sub_ps(iz0,jz0);
1692 dx11 = _mm_sub_ps(ix1,jx1);
1693 dy11 = _mm_sub_ps(iy1,jy1);
1694 dz11 = _mm_sub_ps(iz1,jz1);
1695 dx12 = _mm_sub_ps(ix1,jx2);
1696 dy12 = _mm_sub_ps(iy1,jy2);
1697 dz12 = _mm_sub_ps(iz1,jz2);
1698 dx13 = _mm_sub_ps(ix1,jx3);
1699 dy13 = _mm_sub_ps(iy1,jy3);
1700 dz13 = _mm_sub_ps(iz1,jz3);
1701 dx21 = _mm_sub_ps(ix2,jx1);
1702 dy21 = _mm_sub_ps(iy2,jy1);
1703 dz21 = _mm_sub_ps(iz2,jz1);
1704 dx22 = _mm_sub_ps(ix2,jx2);
1705 dy22 = _mm_sub_ps(iy2,jy2);
1706 dz22 = _mm_sub_ps(iz2,jz2);
1707 dx23 = _mm_sub_ps(ix2,jx3);
1708 dy23 = _mm_sub_ps(iy2,jy3);
1709 dz23 = _mm_sub_ps(iz2,jz3);
1710 dx31 = _mm_sub_ps(ix3,jx1);
1711 dy31 = _mm_sub_ps(iy3,jy1);
1712 dz31 = _mm_sub_ps(iz3,jz1);
1713 dx32 = _mm_sub_ps(ix3,jx2);
1714 dy32 = _mm_sub_ps(iy3,jy2);
1715 dz32 = _mm_sub_ps(iz3,jz2);
1716 dx33 = _mm_sub_ps(ix3,jx3);
1717 dy33 = _mm_sub_ps(iy3,jy3);
1718 dz33 = _mm_sub_ps(iz3,jz3);
1720 /* Calculate squared distance and things based on it */
1721 rsq00 = gmx_mm_calc_rsq_ps(dx00,dy00,dz00);
1722 rsq11 = gmx_mm_calc_rsq_ps(dx11,dy11,dz11);
1723 rsq12 = gmx_mm_calc_rsq_ps(dx12,dy12,dz12);
1724 rsq13 = gmx_mm_calc_rsq_ps(dx13,dy13,dz13);
1725 rsq21 = gmx_mm_calc_rsq_ps(dx21,dy21,dz21);
1726 rsq22 = gmx_mm_calc_rsq_ps(dx22,dy22,dz22);
1727 rsq23 = gmx_mm_calc_rsq_ps(dx23,dy23,dz23);
1728 rsq31 = gmx_mm_calc_rsq_ps(dx31,dy31,dz31);
1729 rsq32 = gmx_mm_calc_rsq_ps(dx32,dy32,dz32);
1730 rsq33 = gmx_mm_calc_rsq_ps(dx33,dy33,dz33);
1732 rinv11 = gmx_mm_invsqrt_ps(rsq11);
1733 rinv12 = gmx_mm_invsqrt_ps(rsq12);
1734 rinv13 = gmx_mm_invsqrt_ps(rsq13);
1735 rinv21 = gmx_mm_invsqrt_ps(rsq21);
1736 rinv22 = gmx_mm_invsqrt_ps(rsq22);
1737 rinv23 = gmx_mm_invsqrt_ps(rsq23);
1738 rinv31 = gmx_mm_invsqrt_ps(rsq31);
1739 rinv32 = gmx_mm_invsqrt_ps(rsq32);
1740 rinv33 = gmx_mm_invsqrt_ps(rsq33);
1742 rinvsq00 = gmx_mm_inv_ps(rsq00);
1743 rinvsq11 = _mm_mul_ps(rinv11,rinv11);
1744 rinvsq12 = _mm_mul_ps(rinv12,rinv12);
1745 rinvsq13 = _mm_mul_ps(rinv13,rinv13);
1746 rinvsq21 = _mm_mul_ps(rinv21,rinv21);
1747 rinvsq22 = _mm_mul_ps(rinv22,rinv22);
1748 rinvsq23 = _mm_mul_ps(rinv23,rinv23);
1749 rinvsq31 = _mm_mul_ps(rinv31,rinv31);
1750 rinvsq32 = _mm_mul_ps(rinv32,rinv32);
1751 rinvsq33 = _mm_mul_ps(rinv33,rinv33);
1753 fjx0 = _mm_setzero_ps();
1754 fjy0 = _mm_setzero_ps();
1755 fjz0 = _mm_setzero_ps();
1756 fjx1 = _mm_setzero_ps();
1757 fjy1 = _mm_setzero_ps();
1758 fjz1 = _mm_setzero_ps();
1759 fjx2 = _mm_setzero_ps();
1760 fjy2 = _mm_setzero_ps();
1761 fjz2 = _mm_setzero_ps();
1762 fjx3 = _mm_setzero_ps();
1763 fjy3 = _mm_setzero_ps();
1764 fjz3 = _mm_setzero_ps();
1766 /**************************
1767 * CALCULATE INTERACTIONS *
1768 **************************/
1770 /* LENNARD-JONES DISPERSION/REPULSION */
1772 rinvsix = _mm_mul_ps(_mm_mul_ps(rinvsq00,rinvsq00),rinvsq00);
1773 fvdw = _mm_mul_ps(_mm_msub_ps(c12_00,rinvsix,c6_00),_mm_mul_ps(rinvsix,rinvsq00));
1777 fscal = _mm_andnot_ps(dummy_mask,fscal);
1779 /* Update vectorial force */
1780 fix0 = _mm_macc_ps(dx00,fscal,fix0);
1781 fiy0 = _mm_macc_ps(dy00,fscal,fiy0);
1782 fiz0 = _mm_macc_ps(dz00,fscal,fiz0);
1784 fjx0 = _mm_macc_ps(dx00,fscal,fjx0);
1785 fjy0 = _mm_macc_ps(dy00,fscal,fjy0);
1786 fjz0 = _mm_macc_ps(dz00,fscal,fjz0);
1788 /**************************
1789 * CALCULATE INTERACTIONS *
1790 **************************/
1792 r11 = _mm_mul_ps(rsq11,rinv11);
1793 r11 = _mm_andnot_ps(dummy_mask,r11);
1795 /* EWALD ELECTROSTATICS */
1797 /* Analytical PME correction */
1798 zeta2 = _mm_mul_ps(beta2,rsq11);
1799 rinv3 = _mm_mul_ps(rinvsq11,rinv11);
1800 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1801 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1802 felec = _mm_mul_ps(qq11,felec);
1806 fscal = _mm_andnot_ps(dummy_mask,fscal);
1808 /* Update vectorial force */
1809 fix1 = _mm_macc_ps(dx11,fscal,fix1);
1810 fiy1 = _mm_macc_ps(dy11,fscal,fiy1);
1811 fiz1 = _mm_macc_ps(dz11,fscal,fiz1);
1813 fjx1 = _mm_macc_ps(dx11,fscal,fjx1);
1814 fjy1 = _mm_macc_ps(dy11,fscal,fjy1);
1815 fjz1 = _mm_macc_ps(dz11,fscal,fjz1);
1817 /**************************
1818 * CALCULATE INTERACTIONS *
1819 **************************/
1821 r12 = _mm_mul_ps(rsq12,rinv12);
1822 r12 = _mm_andnot_ps(dummy_mask,r12);
1824 /* EWALD ELECTROSTATICS */
1826 /* Analytical PME correction */
1827 zeta2 = _mm_mul_ps(beta2,rsq12);
1828 rinv3 = _mm_mul_ps(rinvsq12,rinv12);
1829 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1830 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1831 felec = _mm_mul_ps(qq12,felec);
1835 fscal = _mm_andnot_ps(dummy_mask,fscal);
1837 /* Update vectorial force */
1838 fix1 = _mm_macc_ps(dx12,fscal,fix1);
1839 fiy1 = _mm_macc_ps(dy12,fscal,fiy1);
1840 fiz1 = _mm_macc_ps(dz12,fscal,fiz1);
1842 fjx2 = _mm_macc_ps(dx12,fscal,fjx2);
1843 fjy2 = _mm_macc_ps(dy12,fscal,fjy2);
1844 fjz2 = _mm_macc_ps(dz12,fscal,fjz2);
1846 /**************************
1847 * CALCULATE INTERACTIONS *
1848 **************************/
1850 r13 = _mm_mul_ps(rsq13,rinv13);
1851 r13 = _mm_andnot_ps(dummy_mask,r13);
1853 /* EWALD ELECTROSTATICS */
1855 /* Analytical PME correction */
1856 zeta2 = _mm_mul_ps(beta2,rsq13);
1857 rinv3 = _mm_mul_ps(rinvsq13,rinv13);
1858 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1859 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1860 felec = _mm_mul_ps(qq13,felec);
1864 fscal = _mm_andnot_ps(dummy_mask,fscal);
1866 /* Update vectorial force */
1867 fix1 = _mm_macc_ps(dx13,fscal,fix1);
1868 fiy1 = _mm_macc_ps(dy13,fscal,fiy1);
1869 fiz1 = _mm_macc_ps(dz13,fscal,fiz1);
1871 fjx3 = _mm_macc_ps(dx13,fscal,fjx3);
1872 fjy3 = _mm_macc_ps(dy13,fscal,fjy3);
1873 fjz3 = _mm_macc_ps(dz13,fscal,fjz3);
1875 /**************************
1876 * CALCULATE INTERACTIONS *
1877 **************************/
1879 r21 = _mm_mul_ps(rsq21,rinv21);
1880 r21 = _mm_andnot_ps(dummy_mask,r21);
1882 /* EWALD ELECTROSTATICS */
1884 /* Analytical PME correction */
1885 zeta2 = _mm_mul_ps(beta2,rsq21);
1886 rinv3 = _mm_mul_ps(rinvsq21,rinv21);
1887 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1888 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1889 felec = _mm_mul_ps(qq21,felec);
1893 fscal = _mm_andnot_ps(dummy_mask,fscal);
1895 /* Update vectorial force */
1896 fix2 = _mm_macc_ps(dx21,fscal,fix2);
1897 fiy2 = _mm_macc_ps(dy21,fscal,fiy2);
1898 fiz2 = _mm_macc_ps(dz21,fscal,fiz2);
1900 fjx1 = _mm_macc_ps(dx21,fscal,fjx1);
1901 fjy1 = _mm_macc_ps(dy21,fscal,fjy1);
1902 fjz1 = _mm_macc_ps(dz21,fscal,fjz1);
1904 /**************************
1905 * CALCULATE INTERACTIONS *
1906 **************************/
1908 r22 = _mm_mul_ps(rsq22,rinv22);
1909 r22 = _mm_andnot_ps(dummy_mask,r22);
1911 /* EWALD ELECTROSTATICS */
1913 /* Analytical PME correction */
1914 zeta2 = _mm_mul_ps(beta2,rsq22);
1915 rinv3 = _mm_mul_ps(rinvsq22,rinv22);
1916 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1917 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1918 felec = _mm_mul_ps(qq22,felec);
1922 fscal = _mm_andnot_ps(dummy_mask,fscal);
1924 /* Update vectorial force */
1925 fix2 = _mm_macc_ps(dx22,fscal,fix2);
1926 fiy2 = _mm_macc_ps(dy22,fscal,fiy2);
1927 fiz2 = _mm_macc_ps(dz22,fscal,fiz2);
1929 fjx2 = _mm_macc_ps(dx22,fscal,fjx2);
1930 fjy2 = _mm_macc_ps(dy22,fscal,fjy2);
1931 fjz2 = _mm_macc_ps(dz22,fscal,fjz2);
1933 /**************************
1934 * CALCULATE INTERACTIONS *
1935 **************************/
1937 r23 = _mm_mul_ps(rsq23,rinv23);
1938 r23 = _mm_andnot_ps(dummy_mask,r23);
1940 /* EWALD ELECTROSTATICS */
1942 /* Analytical PME correction */
1943 zeta2 = _mm_mul_ps(beta2,rsq23);
1944 rinv3 = _mm_mul_ps(rinvsq23,rinv23);
1945 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1946 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1947 felec = _mm_mul_ps(qq23,felec);
1951 fscal = _mm_andnot_ps(dummy_mask,fscal);
1953 /* Update vectorial force */
1954 fix2 = _mm_macc_ps(dx23,fscal,fix2);
1955 fiy2 = _mm_macc_ps(dy23,fscal,fiy2);
1956 fiz2 = _mm_macc_ps(dz23,fscal,fiz2);
1958 fjx3 = _mm_macc_ps(dx23,fscal,fjx3);
1959 fjy3 = _mm_macc_ps(dy23,fscal,fjy3);
1960 fjz3 = _mm_macc_ps(dz23,fscal,fjz3);
1962 /**************************
1963 * CALCULATE INTERACTIONS *
1964 **************************/
1966 r31 = _mm_mul_ps(rsq31,rinv31);
1967 r31 = _mm_andnot_ps(dummy_mask,r31);
1969 /* EWALD ELECTROSTATICS */
1971 /* Analytical PME correction */
1972 zeta2 = _mm_mul_ps(beta2,rsq31);
1973 rinv3 = _mm_mul_ps(rinvsq31,rinv31);
1974 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
1975 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
1976 felec = _mm_mul_ps(qq31,felec);
1980 fscal = _mm_andnot_ps(dummy_mask,fscal);
1982 /* Update vectorial force */
1983 fix3 = _mm_macc_ps(dx31,fscal,fix3);
1984 fiy3 = _mm_macc_ps(dy31,fscal,fiy3);
1985 fiz3 = _mm_macc_ps(dz31,fscal,fiz3);
1987 fjx1 = _mm_macc_ps(dx31,fscal,fjx1);
1988 fjy1 = _mm_macc_ps(dy31,fscal,fjy1);
1989 fjz1 = _mm_macc_ps(dz31,fscal,fjz1);
1991 /**************************
1992 * CALCULATE INTERACTIONS *
1993 **************************/
1995 r32 = _mm_mul_ps(rsq32,rinv32);
1996 r32 = _mm_andnot_ps(dummy_mask,r32);
1998 /* EWALD ELECTROSTATICS */
2000 /* Analytical PME correction */
2001 zeta2 = _mm_mul_ps(beta2,rsq32);
2002 rinv3 = _mm_mul_ps(rinvsq32,rinv32);
2003 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
2004 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
2005 felec = _mm_mul_ps(qq32,felec);
2009 fscal = _mm_andnot_ps(dummy_mask,fscal);
2011 /* Update vectorial force */
2012 fix3 = _mm_macc_ps(dx32,fscal,fix3);
2013 fiy3 = _mm_macc_ps(dy32,fscal,fiy3);
2014 fiz3 = _mm_macc_ps(dz32,fscal,fiz3);
2016 fjx2 = _mm_macc_ps(dx32,fscal,fjx2);
2017 fjy2 = _mm_macc_ps(dy32,fscal,fjy2);
2018 fjz2 = _mm_macc_ps(dz32,fscal,fjz2);
2020 /**************************
2021 * CALCULATE INTERACTIONS *
2022 **************************/
2024 r33 = _mm_mul_ps(rsq33,rinv33);
2025 r33 = _mm_andnot_ps(dummy_mask,r33);
2027 /* EWALD ELECTROSTATICS */
2029 /* Analytical PME correction */
2030 zeta2 = _mm_mul_ps(beta2,rsq33);
2031 rinv3 = _mm_mul_ps(rinvsq33,rinv33);
2032 pmecorrF = gmx_mm_pmecorrF_ps(zeta2);
2033 felec = _mm_macc_ps(pmecorrF,beta3,rinv3);
2034 felec = _mm_mul_ps(qq33,felec);
2038 fscal = _mm_andnot_ps(dummy_mask,fscal);
2040 /* Update vectorial force */
2041 fix3 = _mm_macc_ps(dx33,fscal,fix3);
2042 fiy3 = _mm_macc_ps(dy33,fscal,fiy3);
2043 fiz3 = _mm_macc_ps(dz33,fscal,fiz3);
2045 fjx3 = _mm_macc_ps(dx33,fscal,fjx3);
2046 fjy3 = _mm_macc_ps(dy33,fscal,fjy3);
2047 fjz3 = _mm_macc_ps(dz33,fscal,fjz3);
2049 fjptrA = (jnrlistA>=0) ? f+j_coord_offsetA : scratch;
2050 fjptrB = (jnrlistB>=0) ? f+j_coord_offsetB : scratch;
2051 fjptrC = (jnrlistC>=0) ? f+j_coord_offsetC : scratch;
2052 fjptrD = (jnrlistD>=0) ? f+j_coord_offsetD : scratch;
2054 gmx_mm_decrement_4rvec_4ptr_swizzle_ps(fjptrA,fjptrB,fjptrC,fjptrD,
2055 fjx0,fjy0,fjz0,fjx1,fjy1,fjz1,
2056 fjx2,fjy2,fjz2,fjx3,fjy3,fjz3);
2058 /* Inner loop uses 294 flops */
2061 /* End of innermost loop */
2063 gmx_mm_update_iforce_4atom_swizzle_ps(fix0,fiy0,fiz0,fix1,fiy1,fiz1,fix2,fiy2,fiz2,fix3,fiy3,fiz3,
2064 f+i_coord_offset,fshift+i_shift_offset);
2066 /* Increment number of inner iterations */
2067 inneriter += j_index_end - j_index_start;
2069 /* Outer loop uses 24 flops */
2072 /* Increment number of outer iterations */
2075 /* Update outer/inner flops */
2077 inc_nrnb(nrnb,eNR_NBKERNEL_ELEC_VDW_W4W4_F,outeriter*24 + inneriter*294);