nb_kernel400_x86_64_sse.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,640 行 · 第 1/4 页
S
1,640 行
addps %xmm5,%xmm7 ## xmm7=FF mulps %xmm1,%xmm5 ## xmm5=eps*Fp addps %xmm4,%xmm5 ## xmm5=VV mulps %xmm3,%xmm5 ## vcoul=qq*VV mulps %xmm7,%xmm3 ## fijC=FF*qq ## at this point xmm5 contains vcoul and xmm3 fijC movq nb400_dvda(%rbp),%rsi ## Calculate dVda xorps %xmm7,%xmm7 mulps nb400_gbscale(%rsp),%xmm3 movaps %xmm3,%xmm6 mulps nb400_r(%rsp),%xmm6 addps %xmm5,%xmm6 ## increment vctot (sum in xmm12) addps %xmm5,%xmm12 ## xmm6=(vcoul+fijC*r) subps %xmm6,%xmm7 movaps %xmm7,%xmm6 ## update dvdasum addps nb400_dvdasum(%rsp),%xmm7 movaps %xmm7,nb400_dvdasum(%rsp) ## update j atoms dvdaj movhlps %xmm6,%xmm7 movaps %xmm6,%xmm5 movaps %xmm7,%xmm4 shufps $0x1,%xmm5,%xmm5 shufps $0x1,%xmm4,%xmm4 ## xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4 addss (%rsi,%rax,4),%xmm6 addss (%rsi,%rbx,4),%xmm5 addss (%rsi,%rcx,4),%xmm7 addss (%rsi,%rdx,4),%xmm4 movss %xmm6,(%rsi,%rax,4) movss %xmm5,(%rsi,%rbx,4) movss %xmm7,(%rsi,%rcx,4) movss %xmm4,(%rsi,%rdx,4) xorps %xmm4,%xmm4 mulps %xmm0,%xmm3 subps %xmm3,%xmm4 movq nb400_faction(%rbp),%rsi ## the fj's - start by accumulating x & y forces from memory movlps (%rsi,%r8,4),%xmm0 ## x1 y1 - - movlps (%rsi,%r10,4),%xmm1 ## x3 y3 - - movhps (%rsi,%r9,4),%xmm0 ## x1 y1 x2 y2 movhps (%rsi,%r11,4),%xmm1 ## x3 y3 x4 y4 mulps %xmm4,%xmm9 mulps %xmm4,%xmm10 mulps %xmm4,%xmm11 ## accumulate i forces addps %xmm9,%xmm13 addps %xmm10,%xmm14 addps %xmm11,%xmm15 movaps %xmm9,%xmm8 unpcklps %xmm10,%xmm9 ## x1 y1 x2 y2 unpckhps %xmm10,%xmm8 ## x3 y3 x4 y4 ## update fjx and fjy addps %xmm9,%xmm0 addps %xmm8,%xmm1 movlps %xmm0,(%rsi,%r8,4) movlps %xmm1,(%rsi,%r10,4) movhps %xmm0,(%rsi,%r9,4) movhps %xmm1,(%rsi,%r11,4) ## xmm11: fjz1 fjz2 fjz3 fjz4 pshufd $1,%xmm11,%xmm10 ## fjz2 - - - movhlps %xmm11,%xmm9 ## fjz3 - - - pshufd $3,%xmm11,%xmm8 ## fjz4 - - - addss 8(%rsi,%r8,4),%xmm11 addss 8(%rsi,%r9,4),%xmm10 addss 8(%rsi,%r10,4),%xmm9 addss 8(%rsi,%r11,4),%xmm8 movss %xmm11,8(%rsi,%r8,4) movss %xmm10,8(%rsi,%r9,4) movss %xmm9,8(%rsi,%r10,4) movss %xmm8,8(%rsi,%r11,4) ## should we do one more iteration? subl $4,nb400_innerk(%rsp) jl _nb_kernel400_x86_64_sse.nb400_finish_inner jmp _nb_kernel400_x86_64_sse.nb400_unroll_loop_nb_kernel400_x86_64_sse.nb400_finish_inner: ## check if at least two particles remain addl $4,nb400_innerk(%rsp) movl nb400_innerk(%rsp),%edx andl $2,%edx jnz _nb_kernel400_x86_64_sse.nb400_dopair jmp _nb_kernel400_x86_64_sse.nb400_checksingle_nb_kernel400_x86_64_sse.nb400_dopair: movq nb400_innerjjnr(%rsp),%rcx movl (%rcx),%eax movl 4(%rcx),%ebx addq $8,nb400_innerjjnr(%rsp) ## load isaj movq nb400_invsqrta(%rbp),%rsi movss (%rsi,%rax,4),%xmm3 movss (%rsi,%rbx,4),%xmm6 unpcklps %xmm6,%xmm3 movaps nb400_isai(%rsp),%xmm2 mulps %xmm3,%xmm2 movaps %xmm2,nb400_isaprod(%rsp) movaps %xmm2,%xmm1 mulps nb400_gbtsc(%rsp),%xmm1 movaps %xmm1,nb400_gbscale(%rsp) movq nb400_charge(%rbp),%rsi ## base of charge[] mulps nb400_iq(%rsp),%xmm2 movss (%rsi,%rax,4),%xmm3 movss (%rsi,%rbx,4),%xmm6 unpcklps %xmm6,%xmm3 mulps %xmm2,%xmm3 movaps %xmm3,nb400_qq(%rsp) movq nb400_pos(%rbp),%rsi ## base of pos[] lea (%rax,%rax,2),%r8 ## j3 lea (%rbx,%rbx,2),%r9 ## move four coordinates to xmm0-xmm2 movlps (%rsi,%r8,4),%xmm4 ## x1 y1 - - movlps (%rsi,%r9,4),%xmm5 ## x2 y2 - - movss 8(%rsi,%r8,4),%xmm6 ## z1 - - - movss 8(%rsi,%r9,4),%xmm7 ## z2 - - - unpcklps %xmm5,%xmm4 ## x1 x2 y1 y2 movhlps %xmm4,%xmm5 ## y1 y2 - - unpcklps %xmm7,%xmm6 ## z1 z2 - - ## calc dr subps nb400_ix(%rsp),%xmm4 subps nb400_iy(%rsp),%xmm5 subps nb400_iz(%rsp),%xmm6 ## store dr movaps %xmm4,%xmm9 movaps %xmm5,%xmm10 movaps %xmm6,%xmm11 ## square it mulps %xmm4,%xmm4 mulps %xmm5,%xmm5 mulps %xmm6,%xmm6 addps %xmm5,%xmm4 addps %xmm6,%xmm4 ## rsq in xmm4 rsqrtps %xmm4,%xmm5 ## lookup seed in xmm5 movaps %xmm5,%xmm2 mulps %xmm5,%xmm5 movaps nb400_three(%rsp),%xmm1 mulps %xmm4,%xmm5 ## rsq*lu*lu movaps nb400_half(%rsp),%xmm0 subps %xmm5,%xmm1 ## 30-rsq*lu*lu mulps %xmm2,%xmm1 mulps %xmm1,%xmm0 ## xmm0=rinv mulps %xmm0,%xmm4 ## xmm4=r movaps %xmm4,nb400_r(%rsp) mulps nb400_gbscale(%rsp),%xmm4 ## truncate and convert to integers cvttps2dq %xmm4,%xmm5 ## convert back to float cvtdq2ps %xmm5,%xmm6 ## multiply by 4 pslld $2,%xmm5 ## move to integer registers movd %xmm5,%r12d pshufd $1,%xmm5,%xmm5 movd %xmm5,%r13d ## calculate eps subps %xmm6,%xmm4 movaps %xmm4,%xmm1 ##eps movq nb400_GBtab(%rbp),%rsi ## load table data movlps (%rsi,%r12,4),%xmm4 movlps (%rsi,%r13,4),%xmm5 unpcklps %xmm5,%xmm4 movhlps %xmm4,%xmm5 movlps 8(%rsi,%r12,4),%xmm6 movlps 8(%rsi,%r13,4),%xmm7 unpcklps %xmm7,%xmm6 movhlps %xmm6,%xmm7 ## table data ready in xmm4-xmm7 mulps %xmm1,%xmm7 ## Heps mulps %xmm1,%xmm6 ## xmm6=Geps mulps %xmm1,%xmm7 ## Heps2 addps %xmm6,%xmm5 addps %xmm7,%xmm5 ## xmm5=Fp addps %xmm7,%xmm7 ## two*Heps2 movaps nb400_qq(%rsp),%xmm3 addps %xmm6,%xmm7 addps %xmm5,%xmm7 ## xmm7=FF mulps %xmm1,%xmm5 ## xmm5=eps*Fp addps %xmm4,%xmm5 ## xmm5=VV mulps %xmm3,%xmm5 ## vcoul=qq*VV mulps %xmm7,%xmm3 ## fijC=FF*qq ## at this point xmm5 contains vcoul and xmm3 fijC ## zero upper part of vcoul xorps %xmm2,%xmm2 movlhps %xmm2,%xmm5 movq nb400_dvda(%rbp),%rsi ## Calculate dVda xorps %xmm7,%xmm7 mulps nb400_gbscale(%rsp),%xmm3 movaps %xmm3,%xmm6 mulps nb400_r(%rsp),%xmm6 addps %xmm5,%xmm6 ## increment vctot (sum in xmm12) addps %xmm5,%xmm12 ## xmm6=(vcoul+fijC*r) subps %xmm6,%xmm7 movaps %xmm7,%xmm6 ## zero upper half of dvda movlhps %xmm2,%xmm7 ## update dvdasum addps nb400_dvdasum(%rsp),%xmm7 movaps %xmm7,nb400_dvdasum(%rsp) ## update j atoms dvdaj movaps %xmm6,%xmm5 shufps $0x1,%xmm5,%xmm5 ## xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4 addss (%rsi,%rax,4),%xmm6 addss (%rsi,%rbx,4),%xmm5 movss %xmm6,(%rsi,%rax,4) movss %xmm5,(%rsi,%rbx,4) xorps %xmm4,%xmm4 mulps %xmm0,%xmm3 subps %xmm3,%xmm4 mulps %xmm4,%xmm9 mulps %xmm4,%xmm10 mulps %xmm4,%xmm11 movlhps %xmm2,%xmm9 movlhps %xmm2,%xmm10 movlhps %xmm2,%xmm11 ## accumulate i forces addps %xmm9,%xmm13 addps %xmm10,%xmm14 addps %xmm11,%xmm15 movq nb400_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_kernel400_x86_64_sse.nb400_checksingle: movl nb400_innerk(%rsp),%edx andl $1,%edx jnz _nb_kernel400_x86_64_sse.nb400_dosingle jmp _nb_kernel400_x86_64_sse.nb400_updateouterdata_nb_kernel400_x86_64_sse.nb400_dosingle: movq nb400_innerjjnr(%rsp),%rcx movl (%rcx),%eax ## load isaj movq nb400_invsqrta(%rbp),%rsi movss (%rsi,%rax,4),%xmm2 mulss nb400_isai(%rsp),%xmm2 movss %xmm2,nb400_isaprod(%rsp) movaps %xmm2,%xmm1 mulss nb400_gbtsc(%rsp),%xmm1 movss %xmm1,nb400_gbscale(%rsp) movq nb400_charge(%rbp),%rsi ## base of charge[] mulss nb400_iq(%rsp),%xmm2 movss (%rsi,%rax,4),%xmm3 mulss %xmm2,%xmm3 movss %xmm3,nb400_qq(%rsp) movq nb400_pos(%rbp),%rsi ## base of pos[] lea (%rax,%rax,2),%r8 ## j3=3*jnr ## move four coordinates to xmm0-xmm2 movss (%rsi,%r8,4),%xmm4 movss 4(%rsi,%r8,4),%xmm5 movss 8(%rsi,%r8,4),%xmm6 ## calc dr subss nb400_ix(%rsp),%xmm4 subss nb400_iy(%rsp),%xmm5 subss nb400_iz(%rsp),%xmm6 ## store dr movaps %xmm4,%xmm9 movaps %xmm5,%xmm10 movaps %xmm6,%xmm11 ## square it mulss %xmm4,%xmm4 mulss %xmm5,%xmm5 mulss %xmm6,%xmm6 addss %xmm5,%xmm4 addss %xmm6,%xmm4 ## rsq in xmm4 rsqrtss %xmm4,%xmm5 ## lookup seed in xmm5 movaps %xmm5,%xmm2 mulss %xmm5,%xmm5 movaps nb400_three(%rsp),%xmm1 mulss %xmm4,%xmm5 ## rsq*lu*lu movaps nb400_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,nb400_r(%rsp) mulss nb400_gbscale(%rsp),%xmm4 ## truncate and convert to integers cvttss2si %xmm4,%r12d ## convert back to float cvtsi2ss %r12d,%xmm6 ## multiply by 4 shll $2,%r12d ## calculate eps subss %xmm6,%xmm4 movaps %xmm4,%xmm1 ##eps movq nb400_GBtab(%rbp),%rsi ## load table data movss (%rsi,%r12,4),%xmm4 movss 4(%rsi,%r12,4),%xmm5 movss 8(%rsi,%r12,4),%xmm6 movss 12(%rsi,%r12,4),%xmm7 ## table data ready in xmm4-xmm7 mulss %xmm1,%xmm7 ## Heps mulss %xmm1,%xmm6 ## xmm6=Geps mulss %xmm1,%xmm7 ## Heps2 addss %xmm6,%xmm5 addss %xmm7,%xmm5 ## xmm5=Fp addss %xmm7,%xmm7 ## two*Heps2 movss nb400_qq(%rsp),%xmm3 addss %xmm6,%xmm7 addss %xmm5,%xmm7 ## xmm7=FF mulss %xmm1,%xmm5 ## xmm5=eps*Fp addss %xmm4,%xmm5 ## xmm5=VV mulss %xmm3,%xmm5 ## vcoul=qq*VV mulss %xmm7,%xmm3 ## fijC=FF*qq ## at this point xmm5 contains vcoul and xmm3 fijC movq nb400_dvda(%rbp),%rsi ## Calculate dVda xorps %xmm7,%xmm7 mulss nb400_gbscale(%rsp),%xmm3 movaps %xmm3,%xmm6 mulss nb400_r(%rsp),%xmm6
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?