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 + -
显示快捷键?