nb_kernel330_x86_64_sse.s

来自「最著名最快的分子模拟软件」· S 代码 · 共 2,027 行 · 第 1/4 页

S
2,027
字号
        movlps (%rsi,%rcx,4),%xmm1 ## x3 y3 - -    addps  %xmm7,%xmm3    addps  %xmm11,%xmm3    mulps  %xmm15,%xmm3    mulps  nb330_tsc(%rsp),%xmm3    ## fscal    subps  %xmm3,%xmm9    movaps %xmm9,%xmm10    movaps %xmm9,%xmm11        movhps (%rsi,%rbx,4),%xmm0 ## x1 y1 x2 y2        movhps (%rsi,%rdx,4),%xmm1 ## x3 y3 x4 y4    movaps nb330_fix(%rsp),%xmm12    movaps nb330_fiy(%rsp),%xmm13    movaps nb330_fiz(%rsp),%xmm14    mulps  nb330_dx(%rsp),%xmm9    mulps  nb330_dy(%rsp),%xmm10    mulps  nb330_dz(%rsp),%xmm11    ## accumulate i forces    addps %xmm9,%xmm12    addps %xmm10,%xmm13    addps %xmm11,%xmm14    movaps %xmm12,nb330_fix(%rsp)    movaps %xmm13,nb330_fiy(%rsp)    movaps %xmm14,nb330_fiz(%rsp)    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,%rax,4)        movlps %xmm1,(%rsi,%rcx,4)        movhps %xmm0,(%rsi,%rbx,4)        movhps %xmm1,(%rsi,%rdx,4)    ## xmm11: fjz1 fjz2 fjz3 fjz4    pshufd $1,%xmm11,%xmm10 ## fjz2 - - -    movhlps %xmm11,%xmm9     ## fjz3 - - -    pshufd $3,%xmm11,%xmm8  ## fjz4 - - -        addss  8(%rsi,%rax,4),%xmm11        addss  8(%rsi,%rbx,4),%xmm10        addss  8(%rsi,%rcx,4),%xmm9        addss  8(%rsi,%rdx,4),%xmm8        movss  %xmm11,8(%rsi,%rax,4)        movss  %xmm10,8(%rsi,%rbx,4)        movss  %xmm9,8(%rsi,%rcx,4)        movss  %xmm8,8(%rsi,%rdx,4)        ## should we do one more iteration?         subl $4,nb330_innerk(%rsp)        jl    _nb_kernel330_x86_64_sse.nb330_finish_inner        jmp   _nb_kernel330_x86_64_sse.nb330_unroll_loop_nb_kernel330_x86_64_sse.nb330_finish_inner:         ## check if at least two particles remain         addl $4,nb330_innerk(%rsp)        movl  nb330_innerk(%rsp),%edx        andl  $2,%edx        jnz   _nb_kernel330_x86_64_sse.nb330_dopair        jmp   _nb_kernel330_x86_64_sse.nb330_checksingle_nb_kernel330_x86_64_sse.nb330_dopair:     movq  nb330_innerjjnr(%rsp),%rcx        movl  (%rcx),%eax        movl  4(%rcx),%ebx        addq $8,nb330_innerjjnr(%rsp)        movq nb330_charge(%rbp),%rsi        movss (%rsi,%rax,4),%xmm0        movss (%rsi,%rbx,4),%xmm2    unpcklps %xmm2,%xmm0 ## jqa jqb         mulps nb330_iq(%rsp),%xmm0    movaps %xmm0,nb330_qq(%rsp)        movq nb330_type(%rbp),%rsi    ## vdw parameters        movl (%rsi,%rax,4),%r12d        movl (%rsi,%rbx,4),%r13d        shll %r12d        shll %r13d    movl nb330_ntia(%rsp),%edi        addl %edi,%r12d        addl %edi,%r13d        movq nb330_vdwparam(%rbp),%rsi        movlps (%rsi,%r12,4),%xmm3        movhps (%rsi,%r13,4),%xmm3    xorps  %xmm7,%xmm7        movaps %xmm3,%xmm0        shufps $136,%xmm7,%xmm0 ## 10001000        shufps $221,%xmm7,%xmm3 ## 11011101    movaps %xmm0,nb330_c6(%rsp)    movaps %xmm3,nb330_c12(%rsp)        lea  (%rax,%rax,2),%rax     ## replace jnr with j3         lea  (%rbx,%rbx,2),%rbx        ## load coordinates        movq nb330_pos(%rbp),%rdi        movlps (%rdi,%rax,4),%xmm1      ## x1 y1 - -         movlps (%rdi,%rbx,4),%xmm2      ## x2 y2 - -         movss 8(%rdi,%rax,4),%xmm5      ## z1 - - -         movss 8(%rdi,%rbx,4),%xmm6      ## z2 - - -     unpcklps %xmm2,%xmm1 ## x1 x2 y1 y2    movhlps  %xmm1,%xmm2 ## y1 y2 -  -    unpcklps %xmm6,%xmm5 ## z1 z2 -  -        ## calc dr          subps nb330_ix(%rsp),%xmm1        subps nb330_iy(%rsp),%xmm2        subps nb330_iz(%rsp),%xmm5        ## store dr    movaps %xmm1,nb330_dx(%rsp)    movaps %xmm2,nb330_dy(%rsp)    movaps %xmm5,nb330_dz(%rsp)        ## square it         mulps %xmm1,%xmm1        mulps %xmm2,%xmm2        mulps %xmm5,%xmm5        addps %xmm2,%xmm1        addps %xmm5,%xmm1        ## rsq in xmm1    ## calculate rinv=1/sqrt(rsq)        rsqrtps %xmm1,%xmm5        movaps %xmm5,%xmm2        mulps %xmm5,%xmm5        movaps nb330_three(%rsp),%xmm4        mulps %xmm1,%xmm5       ## rsq*lu*lu        subps %xmm5,%xmm4   ## 30-rsq*lu*lu         mulps %xmm2,%xmm4        mulps nb330_half(%rsp),%xmm4        movaps %xmm4,%xmm15        mulps  %xmm4,%xmm1    ## xmm15=rinv    ## xmm1=r    mulps nb330_tsc(%rsp),%xmm1   ## rtab    ## truncate and convert to integers    cvttps2dq %xmm1,%xmm5    ## convert back to float    cvtdq2ps  %xmm5,%xmm4    ## multiply by 4    pslld   $2,%xmm5    ## multiply by three (copy, mult. by two, add back)    movaps  %xmm5,%xmm6    pslld   $1,%xmm5    paddd   %xmm6,%xmm5    ## calculate eps    subps     %xmm4,%xmm1    ## move to integer registers    movd    %xmm5,%r8d    pshufd $1,%xmm5,%xmm5    movd    %xmm5,%r9d    movaps %xmm1,nb330_eps(%rsp)    ## xmm15=rinv        movq nb330_VFtab(%rbp),%rsi    ## load Coulomb and LJ table data in parallel        movlps (%rsi,%r8,4),%xmm0        ## Y1c F1c         movlps 16(%rsi,%r8,4),%xmm4      ## Y1d F1d         movlps 32(%rsi,%r8,4),%xmm8      ## Y1r F1r         movlps (%rsi,%r9,4),%xmm1        ## Y2c F2c        movlps 16(%rsi,%r9,4),%xmm5      ## Y2d F2d        movlps 32(%rsi,%r9,4),%xmm9     ## Y2r F2r    unpcklps %xmm1,%xmm0 ## Y1c Y2c F1c F2c    unpcklps %xmm5,%xmm4 ## Y1d Y2d F1d F2d    unpcklps %xmm9,%xmm8 ## Y1r Y2r F1r F2r    movhlps  %xmm0,%xmm1 ## F1c F2c    movhlps  %xmm4,%xmm5 ## F1d F2d    movhlps  %xmm8,%xmm9 ## F1r F2r        movlps 8(%rsi,%r8,4),%xmm2       ## G1c H1c         movlps 24(%rsi,%r8,4),%xmm6      ## G1d H1d         movlps 40(%rsi,%r8,4),%xmm10     ## G1r H1r         movlps 8(%rsi,%r9,4),%xmm3       ## G2c H2c        movlps 24(%rsi,%r9,4),%xmm7      ## G2d H2d        movlps 40(%rsi,%r9,4),%xmm11     ## G2r H2r    unpcklps %xmm3,%xmm2  ## G1c G2c H1c H2c    unpcklps %xmm7,%xmm6  ## G1d G2d H1d H2d    unpcklps %xmm11,%xmm10 ## G1r G2r H1r H2r    movhlps  %xmm2,%xmm3  ## H1c H2c    movhlps  %xmm6,%xmm7  ## H1d H2d    movhlps  %xmm10,%xmm11 ## H1r H2r    ## table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11    movaps nb330_eps(%rsp),%xmm12    mulps  %xmm12,%xmm3  ## Heps    mulps  %xmm12,%xmm7    mulps  %xmm12,%xmm11    mulps  %xmm12,%xmm2    ## Geps    mulps  %xmm12,%xmm6    mulps  %xmm12,%xmm10    mulps  %xmm12,%xmm3  ## Heps2    mulps  %xmm12,%xmm7    mulps  %xmm12,%xmm11    addps  %xmm2,%xmm1  ## F+Geps    addps  %xmm6,%xmm5    addps  %xmm10,%xmm9    addps  %xmm3,%xmm1  ## F+Geps+Heps2 = Fp    addps  %xmm7,%xmm5    addps  %xmm11,%xmm9    addps  %xmm3,%xmm3   ## 2*Heps2    addps  %xmm7,%xmm7    addps  %xmm11,%xmm11    addps  %xmm2,%xmm3   ## 2*Heps2+Geps    addps  %xmm6,%xmm7    addps  %xmm10,%xmm11    addps  %xmm1,%xmm3  ## FF = Fp + 2*Heps2 + Geps    addps  %xmm5,%xmm7    addps  %xmm9,%xmm11    mulps  %xmm12,%xmm1  ## eps*Fp    mulps  %xmm12,%xmm5    mulps  %xmm12,%xmm9    addps  %xmm0,%xmm1    ## VV    addps  %xmm4,%xmm5    addps  %xmm8,%xmm9    mulps  nb330_qq(%rsp),%xmm1     ## VV*qq = vcoul    mulps  nb330_c6(%rsp),%xmm5     ## vnb6    mulps  nb330_c12(%rsp),%xmm9     ## vnb12    mulps  nb330_qq(%rsp),%xmm3      ## FF*qq = fij    mulps  nb330_c6(%rsp),%xmm7     ## fijD    mulps  nb330_c12(%rsp),%xmm11     ##fijR    ## accumulate vctot    addps  nb330_vctot(%rsp),%xmm1    movlps %xmm1,nb330_vctot(%rsp)    ## accumulate Vvdwtot    addps  nb330_Vvdwtot(%rsp),%xmm5    addps  %xmm9,%xmm5    movlps %xmm5,nb330_Vvdwtot(%rsp)    xorps  %xmm9,%xmm9    addps  %xmm7,%xmm3    addps  %xmm11,%xmm3    mulps  %xmm15,%xmm3    mulps  nb330_tsc(%rsp),%xmm3    ## fscal    subps  %xmm3,%xmm9    movaps %xmm9,%xmm10    movaps %xmm9,%xmm11    movaps nb330_fix(%rsp),%xmm12    movaps nb330_fiy(%rsp),%xmm13    movaps nb330_fiz(%rsp),%xmm14    mulps  nb330_dx(%rsp),%xmm9    mulps  nb330_dy(%rsp),%xmm10    mulps  nb330_dz(%rsp),%xmm11    ## accumulate i forces    addps %xmm9,%xmm12    addps %xmm10,%xmm13    addps %xmm11,%xmm14    movlps %xmm12,nb330_fix(%rsp)    movlps %xmm13,nb330_fiy(%rsp)    movlps %xmm14,nb330_fiz(%rsp)        movq nb330_faction(%rbp),%rsi        ## the fj's - start by accumulating x & y forces from memory         movlps (%rsi,%rax,4),%xmm0 ## x1 y1 - -        movhps (%rsi,%rbx,4),%xmm0 ## x1 y1 x2 y2    unpcklps %xmm10,%xmm9 ## x1 y1 x2 y2    addps    %xmm9,%xmm0        movlps %xmm0,(%rsi,%rax,4)        movhps %xmm0,(%rsi,%rbx,4)    ## z forces    pshufd $1,%xmm11,%xmm8    addss  8(%rsi,%rax,4),%xmm11    addss  8(%rsi,%rbx,4),%xmm8    movss  %xmm11,8(%rsi,%rax,4)    movss  %xmm8,8(%rsi,%rbx,4)_nb_kernel330_x86_64_sse.nb330_checksingle:             movl  nb330_innerk(%rsp),%edx        andl  $1,%edx        jnz    _nb_kernel330_x86_64_sse.nb330_dosingle        jmp    _nb_kernel330_x86_64_sse.nb330_updateouterdata_nb_kernel330_x86_64_sse.nb330_dosingle:         movq nb330_pos(%rbp),%rdi        movq  nb330_innerjjnr(%rsp),%rcx        movl  (%rcx),%eax        movq nb330_charge(%rbp),%rsi        movss (%rsi,%rax,4),%xmm0        mulss nb330_iq(%rsp),%xmm0    movaps %xmm0,nb330_qq(%rsp)    ## vdw parameters        movq nb330_type(%rbp),%rsi        movl (%rsi,%rax,4),%r12d        shll %r12d    movl nb330_ntia(%rsp),%edi        addl %edi,%r12d        movq nb330_vdwparam(%rbp),%rsi        movss (%rsi,%r12,4),%xmm0        movss 4(%rsi,%r12,4),%xmm3    movaps %xmm0,nb330_c6(%rsp)    movaps %xmm3,nb330_c12(%rsp)        lea  (%rax,%rax,2),%rax     ## replace jnr with j3         movq nb330_pos(%rbp),%rdi        ## load coordinates        movss (%rdi,%rax,4),%xmm1        movss 4(%rdi,%rax,4),%xmm2        movss 8(%rdi,%rax,4),%xmm5        ## calc dr          subss nb330_ix(%rsp),%xmm1        subss nb330_iy(%rsp),%xmm2        subss nb330_iz(%rsp),%xmm5        ## store dr    movaps %xmm1,nb330_dx(%rsp)    movaps %xmm2,nb330_dy(%rsp)    movaps %xmm5,nb330_dz(%rsp)        ## square it         mulss %xmm1,%xmm1        mulss %xmm2,%xmm2        mulss %xmm5,%xmm5        addss %xmm2,%xmm1        addss %xmm5,%xmm1        ## rsq in xmm1    ## calculate rinv=1/sqrt(rsq)        rsqrtss %xmm1,%xmm5        movaps %xmm5,%xmm2        mulss %xmm5,%xmm5        movaps nb330_three(%rsp),%xmm4        mulss %xmm1,%xmm5       ## rsq*lu*lu        subss %xmm5,%xmm4   ## 30-rsq*lu*lu         mulss %xmm2,%xmm4        mulss nb330_half(%rsp),%xmm4        movaps %xmm4,%xmm15        mulss  %xmm4,%xmm1    ## xmm15=rinv    ## xmm1=r    mulss nb330_tsc(%rsp),%xmm1   ## rtab    ## truncate and convert to integers    cvttss2si %xmm1,%r8d    ## convert back to float    cvtsi2ss  %r8d,%xmm4    ## multiply by 4    shll      $2,%r8d    ## calculate eps    subss     %xmm4,%xmm1    ## mult. by 3        lea  (%r8,%r8,2),%r8    movaps %xmm1,nb330_eps(%rsp)    ## xmm15=rinv        movq nb330_VFtab(%rbp),%rsi    ## load Coulomb and LJ table data in parallel    movss  (%rsi,%r8,4),%xmm0    movss  4(%rsi,%r8,4),%xmm1    movss  8(%rsi,%r8,4),%xmm2    movss  12(%rsi,%r8,4),%xmm3    movss  16(%rsi,%r8,4),%xmm4    movss  20(%rsi,%r8,4),%xmm5    movss  24(%rsi,%r8,4),%xmm6    movss  28(%rsi,%r8,4),%xmm7    movss  32(%rsi,%r8,4),%xmm8    movss  36(%rsi,%r8,4),%xmm9    movss  40(%rsi,%r8,4),%xmm10    movss  44(%rsi,%r8,4),%xmm11    ## table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11    movaps nb330_eps(%rsp),%xmm12    mulps  %xmm12,%xmm3  ## Heps    mulps  %xmm12,%xmm7    mulps  %xmm12,%xmm11    mulps  %xmm12,%xmm2    ## Geps    mulps  %xmm12,%xmm6    mulps  %xmm12,%xmm10    mulps  %xmm12,%xmm3  ## Heps2    mulps  %xmm12,%xmm7    mulps  %xmm12,%xmm11    addps  %xmm2,%xmm1  ## F+Geps    addps  %xmm6,%xmm5    addps  %xmm10,%xmm9    addps  %xmm3,%xmm1  ## F+Geps+Heps2 = Fp    addps  %xmm7,%xmm5    addps  %xmm11,%xmm9    addps  %xmm3,%xmm3   ## 2*Heps2    addps  %xmm7,%xmm7    addps  %xmm11,%xmm11    addps  %xmm2,%xmm3   ## 2*Heps2+Geps    addps  %xmm6,%xmm7    addps  %xmm10,%xmm11    addps  %xmm1,%xmm3  ## FF = Fp + 2*Heps2 + Geps    addps  %xmm5,%xmm7    addps  %xmm9,%xmm11    mulps  nb330_eps(%rsp),%xmm1     ## eps*Fp    mulps  nb330_eps(%rsp),%xmm5    mulps  nb330_eps(%rsp),%xmm9    addps  %xmm0,%xmm1    ## VV    addps  %xmm4,%xmm5    addps  %xmm8,%xmm9    mulps  nb330_qq(%rsp),%xmm1     ## VV*qq = vcoul    mulps  nb330_c6(%rsp),%xmm5     ## vnb6    mulps  nb330_c12(%rsp),%xmm9     ## vnb12    mulps  nb330_qq(%rsp),%xmm3      ## FF*qq = fij    mulps  nb330_c6(%rsp),%xmm7     ## fijD    mulps  nb330_c12(%rsp),%xmm11     ##fijR    ## accumulate vctot    addps  nb330_vctot(%rsp),%xmm1    movaps %xmm1,nb330_vctot(%rsp)    ## accumulate Vvdwtot    addps  nb330_Vvdwtot(%rsp),%xmm5    addps  %xmm9,%xmm5    movaps %xmm5,nb330_Vvdwtot(%rsp)    xorps  %xmm9,%xmm9    addps  %xmm7,%xmm3    addps  %xmm11,%xmm3    mulss  %xmm15,%xmm3    mulps  nb330_tsc(%rsp),%xmm3    ## fscal    subps  %xmm3,%xmm9    movaps %xmm9,%xmm10    movaps %xmm9,%xmm11    movaps nb330_fix(%rsp),%xmm12    movaps nb330_fiy(%rsp),%xmm13    movaps nb330_fiz(%rsp),%xmm14    mulss  nb330_dx(%rsp),%xmm9    mulss  nb330_dy(%rsp),%xmm10    mulss  nb330_dz(%rsp),%xmm11    ## accumulate i forces    addss %xmm9,%xmm12    addss %xmm10,%xmm13    addss %xmm11,%xmm14    movaps %xmm12,nb330_fix(%rsp)    movaps %xmm13,nb330_fiy(%rsp)    movaps %xmm14,nb330_fiz(%rsp)        movq nb330_faction(%rbp),%rsi    ## add to j forces    addss  (%rsi,%rax,4),%xmm9    addss  4(%rsi,%rax,4),%xmm10    addss  8(%rsi,%rax,4),%xmm11    movss  %xmm9,(%rsi,%rax,4)    movss  %xmm10,4(%rsi,%rax,4)    movss  %xmm11,8(%rsi,%rax,4)_nb_kernel330_x86_64_sse.nb330_updateouterdata:         movl  nb330_ii3(%rsp),%ecx        movq  nb330_faction(%rbp),%rdi        movq  nb330_fshift(%rbp),%rsi        movl  nb330_is3(%rsp),%edx        ## accumulate i forces in xmm0, xmm1, xmm2         movaps nb330_fix(%rsp),%xmm0

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?