nb_kernel430_x86_64_sse.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,168 行 · 第 1/5 页
S
2,168 行
mulps nb430_c12(%rsp),%xmm9 ## vnb12 mulps nb430_qq(%rsp),%xmm3 ## FF*qq = fij mulps nb430_c6(%rsp),%xmm7 ## fijD mulps nb430_c12(%rsp),%xmm11 ##fijR addps %xmm7,%xmm11 ## fijD+fijR mulps nb430_tsc(%rsp),%xmm11 ## (fijD+fijR)*tabscale ## accumulate Vvdwtot addps nb430_Vvdwtot(%rsp),%xmm5 addps %xmm9,%xmm5 movlps %xmm5,nb430_Vvdwtot(%rsp) movq nb430_dvda(%rbp),%rsi ## Calculate dVda mulps nb430_gbscale(%rsp),%xmm3 ## fijC=qq*FF*gbscale movaps %xmm3,%xmm6 mulps nb430_r(%rsp),%xmm6 addps %xmm1,%xmm6 ## vcoul+fijC*r addps %xmm11,%xmm3 ## fijC+fijD+fijR ## increment vctot addps nb430_vctot(%rsp),%xmm1 movlps %xmm1,nb430_vctot(%rsp) ## xmm6=(vcoul+fijC*r) xorps %xmm7,%xmm7 subps %xmm6,%xmm7 movaps %xmm7,%xmm6 ## update dvdasum addps nb430_dvdasum(%rsp),%xmm7 movlps %xmm7,nb430_dvdasum(%rsp) ## update j atoms dvdaj movaps %xmm6,%xmm5 shufps $0x1,%xmm5,%xmm5 ## xmm6=dvdaj1 xmm5=dvdaj2 addss (%rsi,%rax,4),%xmm6 addss (%rsi,%rbx,4),%xmm5 movss %xmm6,(%rsi,%rax,4) movss %xmm5,(%rsi,%rbx,4) xorps %xmm4,%xmm4 mulps nb430_rinv(%rsp),%xmm3 subps %xmm3,%xmm4 movaps %xmm4,%xmm9 movaps %xmm4,%xmm10 movaps %xmm4,%xmm11 mulps nb430_dx(%rsp),%xmm9 mulps nb430_dy(%rsp),%xmm10 mulps nb430_dz(%rsp),%xmm11 ## accumulate i forces movaps nb430_fix(%rsp),%xmm12 movaps nb430_fiy(%rsp),%xmm13 movaps nb430_fiz(%rsp),%xmm14 addps %xmm9,%xmm12 addps %xmm10,%xmm13 addps %xmm11,%xmm14 movlps %xmm12,nb430_fix(%rsp) movlps %xmm13,nb430_fiy(%rsp) movlps %xmm14,nb430_fiz(%rsp) movq nb430_faction(%rbp),%rsi ## the fj's - start by accumulating x & y forces from memory movlps (%rsi,%r8,4),%xmm0 ## x1 y1 - - movhps (%rsi,%r9,4),%xmm0 ## x1 y1 x2 y2 unpcklps %xmm10,%xmm9 ## x1 y1 x2 y2 addps %xmm9,%xmm0 movlps %xmm0,(%rsi,%r8,4) movhps %xmm0,(%rsi,%r9,4) ## z forces pshufd $1,%xmm11,%xmm8 addss 8(%rsi,%r8,4),%xmm11 addss 8(%rsi,%r9,4),%xmm8 movss %xmm11,8(%rsi,%r8,4) movss %xmm8,8(%rsi,%r9,4)_nb_kernel430_x86_64_sse.nb430_checksingle: movl nb430_innerk(%rsp),%edx andl $1,%edx jnz _nb_kernel430_x86_64_sse.nb430_dosingle jmp _nb_kernel430_x86_64_sse.nb430_updateouterdata_nb_kernel430_x86_64_sse.nb430_dosingle: movq nb430_charge(%rbp),%rsi movq nb430_invsqrta(%rbp),%rdx movq nb430_pos(%rbp),%rdi movq nb430_innerjjnr(%rsp),%rcx movl (%rcx),%eax ## load isaj movq nb430_invsqrta(%rbp),%rsi movss (%rsi,%rax,4),%xmm3 movaps nb430_isai(%rsp),%xmm2 mulss %xmm3,%xmm2 movaps %xmm2,nb430_isaprod(%rsp) movaps %xmm2,%xmm1 mulss nb430_gbtsc(%rsp),%xmm1 movaps %xmm1,nb430_gbscale(%rsp) movq nb430_charge(%rbp),%rsi ## base of charge[] movss (%rsi,%rax,4),%xmm3 mulss nb430_iq(%rsp),%xmm2 mulss %xmm2,%xmm3 movaps %xmm3,nb430_qq(%rsp) ## vdw parameters movq nb430_type(%rbp),%rsi movl (%rsi,%rax,4),%r12d shll %r12d movl nb430_ntia(%rsp),%edi addl %edi,%r12d movq nb430_vdwparam(%rbp),%rsi movss (%rsi,%r12,4),%xmm0 movss 4(%rsi,%r12,4),%xmm3 movaps %xmm0,nb430_c6(%rsp) movaps %xmm3,nb430_c12(%rsp) movq nb430_pos(%rbp),%rsi ## base of pos[] lea (%rax,%rax,2),%r8 ## j3 ## move four coordinates to xmm0-xmm2 movss (%rsi,%r8,4),%xmm0 movss 4(%rsi,%r8,4),%xmm1 movss 8(%rsi,%r8,4),%xmm2 ## calc dr subss nb430_ix(%rsp),%xmm0 subss nb430_iy(%rsp),%xmm1 subss nb430_iz(%rsp),%xmm2 ## store dr movaps %xmm0,nb430_dx(%rsp) movaps %xmm1,nb430_dy(%rsp) movaps %xmm2,nb430_dz(%rsp) ## square it mulss %xmm0,%xmm0 mulss %xmm1,%xmm1 mulss %xmm2,%xmm2 addss %xmm1,%xmm0 addss %xmm2,%xmm0 movaps %xmm0,%xmm4 ## rsq in xmm4 rsqrtss %xmm4,%xmm5 ## lookup seed in xmm5 movaps %xmm5,%xmm2 mulss %xmm5,%xmm5 movaps nb430_three(%rsp),%xmm1 mulss %xmm4,%xmm5 ## rsq*lu*lu movaps nb430_half(%rsp),%xmm0 subss %xmm5,%xmm1 ## 30-rsq*lu*lu mulss %xmm2,%xmm1 mulss %xmm1,%xmm0 ## xmm0=rinv mulss %xmm0,%xmm4 ## xmm4=r movaps %xmm4,nb430_r(%rsp) movaps %xmm0,nb430_rinv(%rsp) movaps %xmm4,%xmm8 ## r mulss nb430_gbscale(%rsp),%xmm4 ## rgbtab mulss nb430_tsc(%rsp),%xmm8 ## rtab ## truncate and convert to integers cvttss2si %xmm4,%r12d ## gb cvttss2si %xmm8,%r14d ## lj ## convert back to float cvtsi2ss %r12d,%xmm6 ## gb cvtsi2ss %r14d,%xmm10 ## lj ## multiply by 4 and 8, respectively shll $2,%r12d ## gb shll $3,%r14d ## lj ## GB index: r12 LJ indices: r14 ## calculate eps subss %xmm6,%xmm4 ## gb subss %xmm10,%xmm8 ## lj movaps %xmm4,nb430_epsgb(%rsp) ## gb eps movaps %xmm8,nb430_eps(%rsp) ## lj eps movq nb430_GBtab(%rbp),%rsi movq nb430_VFtab(%rbp),%rdi ## load GB table data to xmm0-xmm3, disp to xmm4-xmm7, rep. to xmm8-xmm11 movss (%rsi,%r12,4),%xmm0 movss 4(%rsi,%r12,4),%xmm1 movss 8(%rsi,%r12,4),%xmm2 movss 12(%rsi,%r12,4),%xmm3 movss (%rdi,%r14,4),%xmm4 movss 4(%rdi,%r14,4),%xmm5 movss 8(%rdi,%r14,4),%xmm6 movss 12(%rdi,%r14,4),%xmm7 movss 16(%rdi,%r14,4),%xmm8 movss 20(%rdi,%r14,4),%xmm9 movss 24(%rdi,%r14,4),%xmm10 movss 28(%rdi,%r14,4),%xmm11 ## table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11 movaps nb430_epsgb(%rsp),%xmm12 movaps nb430_eps(%rsp),%xmm13 mulss %xmm12,%xmm3 ## Heps mulss %xmm13,%xmm7 mulss %xmm13,%xmm11 mulss %xmm12,%xmm2 ## Geps mulss %xmm13,%xmm6 mulss %xmm13,%xmm10 mulss %xmm12,%xmm3 ## Heps2 mulss %xmm13,%xmm7 mulss %xmm13,%xmm11 addss %xmm2,%xmm1 ## F+Geps addss %xmm6,%xmm5 addss %xmm10,%xmm9 addss %xmm3,%xmm1 ## F+Geps+Heps2 = Fp addss %xmm7,%xmm5 addss %xmm11,%xmm9 addss %xmm3,%xmm3 ## 2*Heps2 addss %xmm7,%xmm7 addss %xmm11,%xmm11 addss %xmm2,%xmm3 ## 2*Heps2+Geps addss %xmm6,%xmm7 addss %xmm10,%xmm11 addss %xmm1,%xmm3 ## FF = Fp + 2*Heps2 + Geps addss %xmm5,%xmm7 addss %xmm9,%xmm11 mulss %xmm12,%xmm1 ## eps*Fp mulss %xmm13,%xmm5 mulss %xmm13,%xmm9 addss %xmm0,%xmm1 ## VV addss %xmm4,%xmm5 addss %xmm8,%xmm9 mulss nb430_qq(%rsp),%xmm1 ## VV*qq = vcoul mulss nb430_c6(%rsp),%xmm5 ## vnb6 mulss nb430_c12(%rsp),%xmm9 ## vnb12 mulss nb430_qq(%rsp),%xmm3 ## FF*qq = fij mulss nb430_c6(%rsp),%xmm7 ## fijD mulss nb430_c12(%rsp),%xmm11 ##fijR addss %xmm7,%xmm11 ## fijD+fijR mulss nb430_tsc(%rsp),%xmm11 ## (fijD+fijR)*tabscale ## accumulate Vvdwtot addss nb430_Vvdwtot(%rsp),%xmm5 addss %xmm9,%xmm5 movss %xmm5,nb430_Vvdwtot(%rsp) movq nb430_dvda(%rbp),%rsi ## Calculate dVda mulss nb430_gbscale(%rsp),%xmm3 ## fijC=qq*FF*gbscale movaps %xmm3,%xmm6 mulss nb430_r(%rsp),%xmm6 addss %xmm1,%xmm6 ## vcoul+fijC*r addss %xmm11,%xmm3 ## fijC+fijD+fijR ## increment vctot addss nb430_vctot(%rsp),%xmm1 movss %xmm1,nb430_vctot(%rsp) ## xmm6=(vcoul+fijC*r) xorps %xmm7,%xmm7 subss %xmm6,%xmm7 movaps %xmm7,%xmm6 ## update dvdasum addss nb430_dvdasum(%rsp),%xmm7 movss %xmm7,nb430_dvdasum(%rsp) ## update j atoms dvdaj ## xmm6=dvdaj1 addss (%rsi,%rax,4),%xmm6 movss %xmm6,(%rsi,%rax,4) xorps %xmm4,%xmm4 mulss nb430_rinv(%rsp),%xmm3 subss %xmm3,%xmm4 movss %xmm4,%xmm9 movss %xmm4,%xmm10 movss %xmm4,%xmm11 mulss nb430_dx(%rsp),%xmm9 mulss nb430_dy(%rsp),%xmm10 mulss nb430_dz(%rsp),%xmm11 ## accumulate i forces movaps nb430_fix(%rsp),%xmm12 movaps nb430_fiy(%rsp),%xmm13 movaps nb430_fiz(%rsp),%xmm14 addss %xmm9,%xmm12 addss %xmm10,%xmm13 addss %xmm11,%xmm14 movss %xmm12,nb430_fix(%rsp) movss %xmm13,nb430_fiy(%rsp) movss %xmm14,nb430_fiz(%rsp) movq nb430_faction(%rbp),%rsi ## add to j forces addss (%rsi,%r8,4),%xmm9 addss 4(%rsi,%r8,4),%xmm10 addss 8(%rsi,%r8,4),%xmm11 movss %xmm9,(%rsi,%r8,4) movss %xmm10,4(%rsi,%r8,4) movss %xmm11,8(%rsi,%r8,4)_nb_kernel430_x86_64_sse.nb430_updateouterdata: movl nb430_ii3(%rsp),%ecx movq nb430_faction(%rbp),%rdi movq nb430_fshift(%rbp),%rsi movl nb430_is3(%rsp),%edx ## accumulate i forces in xmm0, xmm1, xmm2 movaps nb430_fix(%rsp),%xmm0 movaps nb430_fiy(%rsp),%xmm1 movaps nb430_fiz(%rsp),%xmm2 movhlps %xmm0,%xmm3 movhlps %xmm1,%xmm4 movhlps %xmm2,%xmm5 addps %xmm3,%xmm0 addps %xmm4,%xmm1 addps %xmm5,%xmm2 ## sum is in 1/2 in xmm0-xmm2 movaps %xmm0,%xmm3 movaps %xmm1,%xmm4 movaps %xmm2,%xmm5 shufps $1,%xmm3,%xmm3 shufps $1,%xmm4,%xmm4 shufps $1,%xmm5,%xmm5 addss %xmm3,%xmm0 addss %xmm4,%xmm1 addss %xmm5,%xmm2 ## xmm0-xmm2 has single force in pos0 ## increment i force movss (%rdi,%rcx,4),%xmm3 movss 4(%rdi,%rcx,4),%xmm4 movss 8(%rdi,%rcx,4),%xmm5 subss %xmm0,%xmm3 subss %xmm1,%xmm4 subss %xmm2,%xmm5 movss %xmm3,(%rdi,%rcx,4) movss %xmm4,4(%rdi,%rcx,4) movss %xmm5,8(%rdi,%rcx,4) ## increment fshift force movss (%rsi,%rdx,4),%xmm3 movss 4(%rsi,%rdx,4),%xmm4 movss 8(%rsi,%rdx,4),%xmm5 subss %xmm0,%xmm3 subss %xmm1,%xmm4 subss %xmm2,%xmm5 movss %xmm3,(%rsi,%rdx,4) movss %xmm4,4(%rsi,%rdx,4) movss %xmm5,8(%rsi,%rdx,4) ## get n from stack movl nb430_n(%rsp),%esi ## get group index for i particle movq nb430_gid(%rbp),%rdx ## base of gid[] movl (%rdx,%rsi,4),%edx ## ggid=gid[n] ## accumulate total potential energy and update it movaps nb430_vctot(%rsp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addps %xmm6,%xmm7 ## pos 0-1 in xmm7 have the sum now movaps %xmm7,%xmm6 shufps $1,%xmm6,%xmm6 addss %xmm6,%xmm7 ## add earlier value from mem movq nb430_Vc(%rbp),%rax addss (%rax,%rdx,4),%xmm7 ## move back to mem movss %xmm7,(%rax,%rdx,4) ## accumulate total lj energy and update it movaps nb430_Vvdwtot(%rsp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addps %xmm6,%xmm7 ## pos 0-1 in xmm7 have the sum now movaps %xmm7,%xmm6 shufps $1,%xmm6,%xmm6 addss %xmm6,%xmm7 ## add earlier value from mem movq nb430_Vvdw(%rbp),%rax addss (%rax,%rdx,4),%xmm7 ## move back to mem movss %xmm7,(%rax,%rdx,4) ## accumulate dVda and update it movaps nb430_dvdasum(%rsp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addps %xmm6,%xmm7 ## pos 0-1 in xmm7 have the sum now movaps %xmm7,%xmm6 shufps $1,%xmm6,%xmm6 addss %xmm6,%xmm7 movl nb430_ii(%rsp),%edx movq nb430_dvda(%rbp),%rax addss (%rax,%rdx,4),%xmm7 movss %xmm7,(%rax,%rdx,4) ## finish if last movl nb430_nn1(%rsp),%ecx ## esi already loaded with n incl %esi subl %esi,%ecx jz _nb_kernel430_x86_64_sse.nb430_outerend ## not last, iterate outer loop once more!
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?