nb_kernel310_x86_64_sse.s

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

S
1,781
字号
    addps  %xmm7,%xmm5  ## F+Geps+Heps2 = Fp    addps  %xmm7,%xmm7  ## 2*Heps2    addps  %xmm6,%xmm7  ## 2*Heps2+Geps    addps  %xmm5,%xmm7  ## FF = Fp + 2*Heps2 + Geps    mulps  %xmm3,%xmm5  ## eps*Fp    addps  %xmm4,%xmm5  ## VV    mulps  nb310_qq(%rsp),%xmm5     ## VV*qq=vcoul    mulps  nb310_qq(%rsp),%xmm7     ## FF*qq=fijC    ## LJ forces    mulps  nb310_six(%rsp),%xmm2    mulps  nb310_twelve(%rsp),%xmm0    subps  %xmm2,%xmm0    mulps  %xmm1,%xmm0 ## (12*vnb12-6*vnb6)*rinv    ## add potential to vctot         addps  nb310_vctot(%rsp),%xmm5    movaps %xmm5,nb310_vctot(%rsp)    mulps  nb310_tsc(%rsp),%xmm7    subps  %xmm7,%xmm0    mulps  %xmm1,%xmm0 ## fscal    ## calculate scalar force by multiplying dx/dy/dz with fscal        mulps  %xmm0,%xmm9        mulps  %xmm0,%xmm10        mulps  %xmm0,%xmm11        movq nb310_faction(%rbp),%rsi        ## the fj's - start by accumulating x & y forces from memory         movlps (%rsi,%rax,4),%xmm0 ## x1 y1 - -        movlps (%rsi,%rcx,4),%xmm1 ## x3 y3 - -        movhps (%rsi,%rbx,4),%xmm0 ## x1 y1 x2 y2        movhps (%rsi,%rdx,4),%xmm1 ## x3 y3 x4 y4        ## xmm0-xmm2 contains tx-tz (partial force)         ## 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,%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,nb310_innerk(%rsp)        jl    _nb_kernel310_x86_64_sse.nb310_finish_inner        jmp   _nb_kernel310_x86_64_sse.nb310_unroll_loop_nb_kernel310_x86_64_sse.nb310_finish_inner:     ## check if at least two particles remain     addl $4,nb310_innerk(%rsp)    movl  nb310_innerk(%rsp),%edx    andl  $2,%edx    jnz   _nb_kernel310_x86_64_sse.nb310_dopair    jmp   _nb_kernel310_x86_64_sse.nb310_checksingle_nb_kernel310_x86_64_sse.nb310_dopair:         ## twice-unrolled innerloop here         movq  nb310_innerjjnr(%rsp),%rdx       ## pointer to jjnr[k]         movl  (%rdx),%eax        movl  4(%rdx),%ebx        addq $8,nb310_innerjjnr(%rsp)             ## advance pointer (unrolled 2)         movq nb310_charge(%rbp),%rsi        movss (%rsi,%rax,4),%xmm0        movss (%rsi,%rbx,4),%xmm2    unpcklps %xmm2,%xmm0 ## jqa jqb         mulps nb310_iq(%rsp),%xmm0    movaps %xmm0,nb310_qq(%rsp)        movq nb310_type(%rbp),%rsi    ## vdw parameters        movl (%rsi,%rax,4),%r12d        movl (%rsi,%rbx,4),%r13d        shll %r12d        shll %r13d    movl nb310_ntia(%rsp),%edi        addl %edi,%r12d        addl %edi,%r13d        movq nb310_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,nb310_c6(%rsp)    movaps %xmm3,nb310_c12(%rsp)        lea  (%rax,%rax,2),%rax     ## replace jnr with j3         lea  (%rbx,%rbx,2),%rbx        ## load coordinates        movq nb310_pos(%rbp),%rdi        movlps (%rdi,%rax,4),%xmm4      ## x1 y1 - -         movlps (%rdi,%rbx,4),%xmm5      ## x2 y2 - -         movss 8(%rdi,%rax,4),%xmm6      ## z1 - - -         movss 8(%rdi,%rbx,4),%xmm7      ## z2 - - -     unpcklps %xmm5,%xmm4 ## x1 x2 y1 y2    movhlps  %xmm4,%xmm5 ## y1 y2 -  -    unpcklps %xmm7,%xmm6 ## z1 z2 -  -        ## calc dr          subps nb310_ix(%rsp),%xmm4        subps nb310_iy(%rsp),%xmm5        subps nb310_iz(%rsp),%xmm6        ## store dr in xmm9-xmm11    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     ## calculate rinv=1/sqrt(rsq)        rsqrtps %xmm4,%xmm5        movaps %xmm5,%xmm2        mulps %xmm5,%xmm5        movaps nb310_three(%rsp),%xmm1        mulps %xmm4,%xmm5       ## rsq*lu*lu        subps %xmm5,%xmm1   ## 30-rsq*lu*lu         mulps %xmm2,%xmm1        mulps nb310_half(%rsp),%xmm1    ## xmm1=rinv    movaps %xmm4,%xmm3    ## xmm3=rsq     mulps %xmm1,%xmm3 ## r    mulps nb310_tsc(%rsp),%xmm3   ## rtab    ## truncate and convert to integers    cvttps2dq %xmm3,%xmm2    ## convert back to float    cvtdq2ps  %xmm2,%xmm0    ## multiply by 4    pslld   $2,%xmm2    ## move to integer registers    movd    %xmm2,%r12d    pshufd $1,%xmm2,%xmm2    movd    %xmm2,%r13d    ## calculate eps    subps     %xmm0,%xmm3        movq nb310_VFtab(%rbp),%rsi    ## load table data        movlps (%rsi,%r12,4),%xmm4        movlps (%rsi,%r13,4),%xmm5    unpcklps %xmm5,%xmm4    movhlps %xmm4,%xmm5    movaps %xmm1,%xmm0 ## rinv    mulps  %xmm0,%xmm0 ## rinvsq    movaps %xmm0,%xmm2 ## rinvsq    mulps  %xmm2,%xmm2 ## rinv4    mulps  %xmm0,%xmm2 ## rinv6    movaps %xmm2,%xmm12    mulps  %xmm12,%xmm12 ## rinv12        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  nb310_c6(%rsp),%xmm2      ## vvdw6=c6*rinv6        mulps  nb310_c12(%rsp),%xmm12     ## vvdw12=c12*rinv12             movaps %xmm12,%xmm0        subps  %xmm2,%xmm12     ## Vvdw=Vvdw12-Vvdw6    ## add potential to vvdwtot         addps  nb310_Vvdwtot(%rsp),%xmm12    movlps %xmm12,nb310_Vvdwtot(%rsp)    mulps %xmm3,%xmm7  ## Heps    mulps  %xmm3,%xmm6 ## Geps    mulps %xmm3,%xmm7  ## Heps2    addps  %xmm6,%xmm5  ## F+Geps    addps  %xmm7,%xmm5  ## F+Geps+Heps2 = Fp    addps  %xmm7,%xmm7  ## 2*Heps2    addps  %xmm6,%xmm7  ## 2*Heps2+Geps    addps  %xmm5,%xmm7  ## FF = Fp + 2*Heps2 + Geps    mulps  %xmm3,%xmm5  ## eps*Fp    addps  %xmm4,%xmm5  ## VV    mulps  nb310_qq(%rsp),%xmm5     ## VV*qq=vcoul    mulps  nb310_qq(%rsp),%xmm7     ## FF*qq=fijC    ## LJ forces    mulps  nb310_six(%rsp),%xmm2    mulps  nb310_twelve(%rsp),%xmm0    subps  %xmm2,%xmm0    mulps  %xmm1,%xmm0 ## (12*vnb12-6*vnb6)*rinv    ## add potential to vctot         addps  nb310_vctot(%rsp),%xmm5    movlps %xmm5,nb310_vctot(%rsp)    xorps %xmm8,%xmm8    mulps  nb310_tsc(%rsp),%xmm7    subps  %xmm7,%xmm0    mulps  %xmm1,%xmm0 ## fscal    ## calculate scalar force by multiplying dx/dy/dz with fscal        mulps  %xmm0,%xmm9        mulps  %xmm0,%xmm10        mulps  %xmm0,%xmm11    movlhps %xmm8,%xmm9    movlhps %xmm8,%xmm10    movlhps %xmm8,%xmm11        ## accumulate i forces    addps %xmm9,%xmm13    addps %xmm10,%xmm14    addps %xmm11,%xmm15        movq nb310_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_kernel310_x86_64_sse.nb310_checksingle:         movl  nb310_innerk(%rsp),%edx    andl  $1,%edx    jnz    _nb_kernel310_x86_64_sse.nb310_dosingle    jmp    _nb_kernel310_x86_64_sse.nb310_updateouterdata_nb_kernel310_x86_64_sse.nb310_dosingle:     movq nb310_innerjjnr(%rsp),%rcx        movl  (%rcx),%eax        movq nb310_charge(%rbp),%rsi        movss (%rsi,%rax,4),%xmm0        mulss nb310_iq(%rsp),%xmm0    movaps %xmm0,nb310_qq(%rsp)        movq nb310_type(%rbp),%rsi    ## vdw parameters        movl (%rsi,%rax,4),%r12d        shll %r12d    movl nb310_ntia(%rsp),%edi        addl %edi,%r12d        movq nb310_vdwparam(%rbp),%rsi        movss (%rsi,%r12,4),%xmm0        movss 4(%rsi,%r12,4),%xmm3    movaps %xmm0,nb310_c6(%rsp)    movaps %xmm3,nb310_c12(%rsp)        lea  (%rax,%rax,2),%rax        ## replace jnr with j3         movq nb310_pos(%rbp),%rdi        movss (%rdi,%rax,4),%xmm4           ## x1 - - -         movss 4(%rdi,%rax,4),%xmm5       ## y2 - - -         movss 8(%rdi,%rax,4),%xmm6       ## 13 - - -         ## calc dr          subss nb310_ix(%rsp),%xmm4        subss nb310_iy(%rsp),%xmm5        subss nb310_iz(%rsp),%xmm6        ## store dr in xmm9-xmm11    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     ## calculate rinv=1/sqrt(rsq)        rsqrtss %xmm4,%xmm5        movaps %xmm5,%xmm2        mulss %xmm5,%xmm5        movaps nb310_three(%rsp),%xmm1        mulss %xmm4,%xmm5       ## rsq*lu*lu        subss %xmm5,%xmm1   ## 30-rsq*lu*lu         mulss %xmm2,%xmm1        mulss nb310_half(%rsp),%xmm1    ## xmm1=rinv    movaps %xmm4,%xmm3    ## xmm3=rsq     mulss %xmm1,%xmm3 ## r    mulss nb310_tsc(%rsp),%xmm3   ## rtab    ## truncate and convert to integers    cvttss2si %xmm3,%r12d    ## convert back to float    cvtsi2ss  %r12d,%xmm0    ## multiply by 4    shll      $2,%r12d    ## calculate eps    subss     %xmm0,%xmm3        movq nb310_VFtab(%rbp),%rsi    movaps %xmm1,%xmm0 ## rinv    mulss  %xmm0,%xmm0 ## rinvsq    movaps %xmm0,%xmm2 ## rinvsq    mulss  %xmm2,%xmm2 ## rinv4    mulss  %xmm0,%xmm2 ## rinv6    movaps %xmm2,%xmm12    mulss  %xmm12,%xmm12 ## rinv12    ## 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  nb310_c6(%rsp),%xmm2      ## vvdw6=c6*rinv6        mulss  nb310_c12(%rsp),%xmm12     ## vvdw12=c12*rinv12             movaps %xmm12,%xmm0        subss  %xmm2,%xmm12     ## Vvdw=Vvdw12-Vvdw6    ## add potential to vvdwtot         addss  nb310_Vvdwtot(%rsp),%xmm12    movss %xmm12,nb310_Vvdwtot(%rsp)    mulss %xmm3,%xmm7  ## Heps    mulss  %xmm3,%xmm6 ## Geps    mulss %xmm3,%xmm7  ## Heps2    addss  %xmm6,%xmm5  ## F+Geps    addss  %xmm7,%xmm5  ## F+Geps+Heps2 = Fp    addss  %xmm7,%xmm7  ## 2*Heps2    addss  %xmm6,%xmm7  ## 2*Heps2+Geps    addss  %xmm5,%xmm7  ## FF = Fp + 2*Heps2 + Geps    mulss  %xmm3,%xmm5  ## eps*Fp    addss  %xmm4,%xmm5  ## VV    mulss  nb310_qq(%rsp),%xmm5     ## VV*qq=vcoul    mulss  nb310_qq(%rsp),%xmm7     ## FF*qq=fijC    ## LJ forces    mulss  nb310_six(%rsp),%xmm2    mulss  nb310_twelve(%rsp),%xmm0    subss  %xmm2,%xmm0    mulss  %xmm1,%xmm0 ## (12*vnb12-6*vnb6)*rinv    ## add potential to vctot         addss  nb310_vctot(%rsp),%xmm5    movss %xmm5,nb310_vctot(%rsp)    mulss  nb310_tsc(%rsp),%xmm7    subss  %xmm7,%xmm0    mulss  %xmm1,%xmm0 ## fscal    ## calculate scalar force by multiplying dx/dy/dz with fscal        mulss  %xmm0,%xmm9        mulss  %xmm0,%xmm10        mulss  %xmm0,%xmm11        ## accumulate i forces    addss %xmm9,%xmm13    addss %xmm10,%xmm14    addss %xmm11,%xmm15        movq nb310_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_kernel310_x86_64_sse.nb310_updateouterdata:         movl  nb310_ii3(%rsp),%ecx        movq  nb310_faction(%rbp),%rdi        movq  nb310_fshift(%rbp),%rsi        movl  nb310_is3(%rsp),%edx        ## accumulate i forces in xmm13, xmm14, xmm15        movhlps %xmm13,%xmm0        movhlps %xmm14,%xmm1

⌨️ 快捷键说明

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