nb_kernel430_x86_64_sse.s

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

S
2,168
字号
    movd    %xmm11,%r14d    ## lj    pshufd $1,%xmm5,%xmm5 ## gb    pshufd $1,%xmm9,%xmm9 ## lj    pshufd $1,%xmm7,%xmm7 ## gb    pshufd $1,%xmm11,%xmm11 ## lj    movd    %xmm5,%r9d      ## gb    movd    %xmm9,%r13d     ## lj    movd    %xmm7,%r11d     ## gb    movd    %xmm11,%r15d    ## lj    ## GB indices: r8-r11   LJ indices: r12-r15    ## calculate eps    subps     %xmm6,%xmm4  ## gb    subps     %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        movlps (%rsi,%r8,4),%xmm1         ## Y1c F1c         movlps (%rdi,%r12,4),%xmm5        ## Y1d F1d         movlps 16(%rdi,%r12,4),%xmm9      ## Y1r F1r         movlps (%rsi,%r10,4),%xmm3        ## Y3c F3c         movlps (%rdi,%r14,4),%xmm7        ## Y3d F3d         movlps 16(%rdi,%r14,4),%xmm11     ## Y3r F3r         movhps (%rsi,%r9,4),%xmm1         ## Y1c F1c Y2c F2c        movhps (%rdi,%r13,4),%xmm5        ## Y1d F1d Y2d F2d        movhps 16(%rdi,%r13,4),%xmm9      ## Y1r F1r Y2r F2r        movhps (%rsi,%r11,4),%xmm3        ## Y3c F3c Y4c F4c        movhps (%rdi,%r15,4),%xmm7        ## Y3d F3d Y4d F4d        movhps 16(%rdi,%r15,4),%xmm11     ## Y3r F3r Y4r F4r    movaps %xmm1,%xmm0    movaps %xmm5,%xmm4    movaps %xmm9,%xmm8        shufps $136,%xmm3,%xmm0 ## 10001000   => Y1c Y2c Y3c Y4c        shufps $136,%xmm7,%xmm4 ## 10001000   => Y1d Y2d Y3d Y4d        shufps $136,%xmm11,%xmm8 ## 10001000  => Y1r Y2r Y3r Y4r        shufps $221,%xmm3,%xmm1 ## 11011101   => F1c F2c F3c F4c        shufps $221,%xmm7,%xmm5 ## 11011101   => F1d F2d F3d F4d        shufps $221,%xmm11,%xmm9 ## 11011101  => F1r F2r F3r F4r        movlps 8(%rsi,%r8,4),%xmm3         ## G1c H1c         movlps 8(%rdi,%r12,4),%xmm7        ## G1d H1d         movlps 24(%rdi,%r12,4),%xmm11      ## G1r H1r         movlps 8(%rsi,%r10,4),%xmm12       ## G3c H3c         movlps 8(%rdi,%r14,4),%xmm13       ## G3d H3d         movlps 24(%rdi,%r14,4),%xmm14      ## G3r H3r         movhps 8(%rsi,%r9,4),%xmm3         ## G1c H1c G2c H2c        movhps 8(%rdi,%r13,4),%xmm7        ## G1d H1d G2d H2d        movhps 24(%rdi,%r13,4),%xmm11      ## G1r H1r G2r H2r        movhps 8(%rsi,%r11,4),%xmm12       ## G3c H3c G4c H4c        movhps 8(%rdi,%r15,4),%xmm13       ## G3d H3d G4d H4d        movhps 24(%rdi,%r15,4),%xmm14      ## G3r H3r G4r H4r    movaps %xmm3,%xmm2    movaps %xmm7,%xmm6    movaps %xmm11,%xmm10        shufps $136,%xmm12,%xmm2 ## 10001000  => G1c G2c G3c G4c        shufps $136,%xmm13,%xmm6 ## 10001000  => G1d G2d G3d G4d        shufps $136,%xmm14,%xmm10 ## 10001000 => G1r G2r G3r G4r        shufps $221,%xmm12,%xmm3 ## 11011101  => H1c H2c H3c H4c        shufps $221,%xmm13,%xmm7 ## 11011101  => H1d H2d H3d H4d        shufps $221,%xmm14,%xmm11 ## 11011101 => H1r H2r H3r H4r    ## 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    mulps  %xmm12,%xmm3  ## Heps    mulps  %xmm13,%xmm7    mulps  %xmm13,%xmm11    mulps  %xmm12,%xmm2    ## Geps    mulps  %xmm13,%xmm6    mulps  %xmm13,%xmm10    mulps  %xmm12,%xmm3  ## Heps2    mulps  %xmm13,%xmm7    mulps  %xmm13,%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  %xmm13,%xmm5    mulps  %xmm13,%xmm9    addps  %xmm0,%xmm1    ## VV    addps  %xmm4,%xmm5    addps  %xmm8,%xmm9    mulps  nb430_qq(%rsp),%xmm1     ## VV*qq = vcoul    mulps  nb430_c6(%rsp),%xmm5     ## vnb6    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    movaps %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    movaps %xmm1,nb430_vctot(%rsp)        ## xmm6=(vcoul+fijC*r)        xorps  %xmm7,%xmm7        subps  %xmm6,%xmm7        movaps %xmm7,%xmm6        ## update dvdasum         addps  nb430_dvdasum(%rsp),%xmm7    movaps %xmm7,nb430_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 nb430_rinv(%rsp),%xmm3        subps  %xmm3,%xmm4    movd %mm0,%r8  ## fetch j3    movd %mm1,%r9    movd %mm2,%r10    movd %mm3,%r11    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    movaps %xmm12,nb430_fix(%rsp)    movaps %xmm13,nb430_fiy(%rsp)    movaps %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 - -        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    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,nb430_innerk(%rsp)        jl    _nb_kernel430_x86_64_sse.nb430_finish_inner        jmp   _nb_kernel430_x86_64_sse.nb430_unroll_loop_nb_kernel430_x86_64_sse.nb430_finish_inner:         ## check if at least two particles remain         addl $4,nb430_innerk(%rsp)        movl  nb430_innerk(%rsp),%edx        andl  $2,%edx        jnz   _nb_kernel430_x86_64_sse.nb430_dopair        jmp   _nb_kernel430_x86_64_sse.nb430_checksingle_nb_kernel430_x86_64_sse.nb430_dopair:         movq  nb430_innerjjnr(%rsp),%rcx        movl  (%rcx),%eax        movl  4(%rcx),%ebx        addq $8,nb430_innerjjnr(%rsp)        ## load isaj        movq nb430_invsqrta(%rbp),%rsi        movss (%rsi,%rax,4),%xmm3        movss (%rsi,%rbx,4),%xmm6        movaps nb430_isai(%rsp),%xmm2    unpcklps %xmm6,%xmm3        mulps  %xmm3,%xmm2    movaps %xmm2,nb430_isaprod(%rsp)        movaps %xmm2,%xmm1        mulps nb430_gbtsc(%rsp),%xmm1        movaps %xmm1,nb430_gbscale(%rsp)        movq nb430_charge(%rbp),%rsi     ## base of charge[]         movss (%rsi,%rax,4),%xmm3        movss (%rsi,%rbx,4),%xmm6    unpcklps %xmm6,%xmm3        mulps nb430_iq(%rsp),%xmm2        mulps  %xmm2,%xmm3        movaps %xmm3,nb430_qq(%rsp)    ## vdw parameters        movq nb430_type(%rbp),%rsi        movl (%rsi,%rax,4),%r12d        movl (%rsi,%rbx,4),%r13d        shll %r12d        shll %r13d    movl nb430_ntia(%rsp),%edi        addl %edi,%r12d        addl %edi,%r13d        movq nb430_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,nb430_c6(%rsp)    movaps %xmm3,nb430_c12(%rsp)        movq nb430_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),%xmm0       ## x1 y1 - -         movlps (%rsi,%r9,4),%xmm1       ## x2 y2 - -         movss 8(%rsi,%r8,4),%xmm2       ## z1 - - -         movss 8(%rsi,%r9,4),%xmm7       ## z2 - - -     unpcklps %xmm1,%xmm0 ## x1 x2 y1 y2    movhlps  %xmm0,%xmm1 ## y1 y2 -  -    unpcklps %xmm7,%xmm2 ## z1 z2 -  -        ## calc dr         subps nb430_ix(%rsp),%xmm0        subps nb430_iy(%rsp),%xmm1        subps nb430_iz(%rsp),%xmm2        ## store dr         movaps %xmm0,nb430_dx(%rsp)        movaps %xmm1,nb430_dy(%rsp)        movaps %xmm2,nb430_dz(%rsp)        ## square it         mulps %xmm0,%xmm0        mulps %xmm1,%xmm1        mulps %xmm2,%xmm2        addps %xmm1,%xmm0        addps %xmm2,%xmm0    movaps %xmm0,%xmm4        ## rsq in xmm4         rsqrtps %xmm4,%xmm5        ## lookup seed in xmm5         movaps %xmm5,%xmm2        mulps %xmm5,%xmm5        movaps nb430_three(%rsp),%xmm1        mulps %xmm4,%xmm5       ## rsq*lu*lu                            movaps nb430_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,nb430_r(%rsp)    movaps %xmm0,nb430_rinv(%rsp)    movaps %xmm4,%xmm8   ## r        mulps nb430_gbscale(%rsp),%xmm4   ## rgbtab    mulps nb430_tsc(%rsp),%xmm8      ## rtab    ## truncate and convert to integers    cvttps2dq %xmm4,%xmm5 ## gb    cvttps2dq %xmm8,%xmm9 ## lj    ## convert back to float    cvtdq2ps  %xmm5,%xmm6  ## gb    cvtdq2ps  %xmm9,%xmm10 ## lj    ## multiply by 4 and 8, respectively    pslld   $2,%xmm5  ## gb    pslld   $3,%xmm9  ## lj    ## move to integer registers    movd    %xmm5,%r12d      ## gb    movd    %xmm9,%r14d     ## lj    pshufd $1,%xmm5,%xmm5  ## gb    pshufd $1,%xmm9,%xmm9  ## lj    movd    %xmm5,%r13d      ## gb    movd    %xmm9,%r15d     ## lj    ## GB indices: r12-r13   LJ indices: r14-r15    ## calculate eps    subps     %xmm6,%xmm4  ## gb    subps     %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        movlps (%rsi,%r12,4),%xmm0       ## Y1c F1c        movlps (%rsi,%r13,4),%xmm1       ## Y2c F2c        movlps (%rdi,%r14,4),%xmm4       ## Y1d F1d          movlps (%rdi,%r15,4),%xmm5       ## Y2d F2d        movlps 16(%rdi,%r14,4),%xmm8     ## Y1r F1r        movlps 16(%rdi,%r15,4),%xmm9     ## Y2r F2r    unpcklps %xmm1,%xmm0    movhlps  %xmm0,%xmm1    unpcklps %xmm5,%xmm4    movhlps  %xmm4,%xmm5    unpcklps %xmm9,%xmm8    movhlps  %xmm8,%xmm9        movlps 8(%rsi,%r12,4),%xmm2       ## G1c H1c        movlps 8(%rsi,%r13,4),%xmm3       ## G2c H2c        movlps 8(%rdi,%r14,4),%xmm6       ## G1d H1d          movlps 8(%rdi,%r15,4),%xmm7       ## G2d H2d        movlps 24(%rdi,%r14,4),%xmm10     ## G1r H1r        movlps 24(%rdi,%r15,4),%xmm11     ## G2r H2r    unpcklps %xmm3,%xmm2    movhlps  %xmm2,%xmm3    unpcklps %xmm7,%xmm6    movhlps  %xmm6,%xmm7    unpcklps %xmm11,%xmm10    movhlps  %xmm10,%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    mulps  %xmm12,%xmm3  ## Heps    mulps  %xmm13,%xmm7    mulps  %xmm13,%xmm11    mulps  %xmm12,%xmm2    ## Geps    mulps  %xmm13,%xmm6    mulps  %xmm13,%xmm10    mulps  %xmm12,%xmm3  ## Heps2    mulps  %xmm13,%xmm7    mulps  %xmm13,%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  %xmm13,%xmm5    mulps  %xmm13,%xmm9    addps  %xmm0,%xmm1    ## VV    addps  %xmm4,%xmm5    addps  %xmm8,%xmm9    mulps  nb430_qq(%rsp),%xmm1     ## VV*qq = vcoul    mulps  nb430_c6(%rsp),%xmm5     ## vnb6

⌨️ 快捷键说明

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