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