nb_kernel302_ia32_sse.s

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

S
1,970
字号
        movaps %xmm3,nb302_fjxH2(%esp)        movaps %xmm4,nb302_fjyH2(%esp)        movaps %xmm5,nb302_fjzH2(%esp)        movaps %xmm0,nb302_fixH1(%esp)        movaps %xmm1,nb302_fiyH1(%esp)        movaps %xmm2,nb302_fizH1(%esp)        ## H2-O interaction         movaps nb302_rinvH2O(%esp),%xmm0        movaps %xmm0,%xmm1        mulps  nb302_rsqH2O(%esp),%xmm1   ## xmm1=r         mulps  nb302_tsc(%esp),%xmm1        movhlps %xmm1,%xmm2        cvttps2pi %xmm1,%mm6        cvttps2pi %xmm2,%mm7    ## mm6/mm7 contain lu indices         cvtpi2ps %mm6,%xmm3        cvtpi2ps %mm7,%xmm2        movlhps  %xmm2,%xmm3        subps    %xmm3,%xmm1    ## xmm1=eps         movaps %xmm1,%xmm2        mulps  %xmm2,%xmm2      ## xmm2=eps2         pslld   $2,%mm6        pslld   $2,%mm7        movd %mm6,%eax        psrlq $32,%mm6        movd %mm7,%ecx        psrlq $32,%mm7        movd %mm6,%ebx        movd %mm7,%edx        movlps (%esi,%eax,4),%xmm5        movlps (%esi,%ecx,4),%xmm7        movhps (%esi,%ebx,4),%xmm5        movhps (%esi,%edx,4),%xmm7 ## got half coulomb table         movaps %xmm5,%xmm4        shufps $136,%xmm7,%xmm4 ## constant 10001000        shufps $221,%xmm7,%xmm5 ## constant 11011101        movlps 8(%esi,%eax,4),%xmm7        movlps 8(%esi,%ecx,4),%xmm3        movhps 8(%esi,%ebx,4),%xmm7        movhps 8(%esi,%edx,4),%xmm3    ## other half of coulomb table          movaps %xmm7,%xmm6        shufps $136,%xmm3,%xmm6 ## constant 10001000        shufps $221,%xmm3,%xmm7 ## constant 11011101        ## coulomb table ready, in xmm4-xmm7          mulps  %xmm1,%xmm6      ## xmm6=Geps         mulps  %xmm2,%xmm7      ## xmm7=Heps2         addps  %xmm6,%xmm5        addps  %xmm7,%xmm5      ## xmm5=Fp         mulps  nb302_two(%esp),%xmm7            ## two*Heps2         movaps nb302_qqOH(%esp),%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 mm5 contains vcoul and mm3 fijC         addps  nb302_vctot(%esp),%xmm5        movaps %xmm5,nb302_vctot(%esp)        xorps  %xmm1,%xmm1        mulps  nb302_tsc(%esp),%xmm3        mulps  %xmm0,%xmm3        subps  %xmm3,%xmm1        movaps %xmm1,%xmm0        movaps %xmm1,%xmm2        movaps nb302_fjxO(%esp),%xmm3        movaps nb302_fjyO(%esp),%xmm4        movaps nb302_fjzO(%esp),%xmm5        mulps nb302_dxH2O(%esp),%xmm0        mulps nb302_dyH2O(%esp),%xmm1        mulps nb302_dzH2O(%esp),%xmm2        subps %xmm0,%xmm3        subps %xmm1,%xmm4        subps %xmm2,%xmm5        addps nb302_fixH2(%esp),%xmm0        addps nb302_fiyH2(%esp),%xmm1        addps nb302_fizH2(%esp),%xmm2        movaps %xmm3,nb302_fjxO(%esp)        movaps %xmm4,nb302_fjyO(%esp)        movaps %xmm5,nb302_fjzO(%esp)        movaps %xmm0,nb302_fixH2(%esp)        movaps %xmm1,nb302_fiyH2(%esp)        movaps %xmm2,nb302_fizH2(%esp)        ## H2-H1 interaction         movaps nb302_rinvH2H1(%esp),%xmm0        movaps %xmm0,%xmm1        mulps  nb302_rsqH2H1(%esp),%xmm1   ## xmm1=r         mulps  nb302_tsc(%esp),%xmm1        movhlps %xmm1,%xmm2        cvttps2pi %xmm1,%mm6        cvttps2pi %xmm2,%mm7    ## mm6/mm7 contain lu indices         cvtpi2ps %mm6,%xmm3        cvtpi2ps %mm7,%xmm2        movlhps  %xmm2,%xmm3        subps    %xmm3,%xmm1    ## xmm1=eps         movaps %xmm1,%xmm2        mulps  %xmm2,%xmm2      ## xmm2=eps2         pslld   $2,%mm6        pslld   $2,%mm7        movd %mm6,%eax        psrlq $32,%mm6        movd %mm7,%ecx        psrlq $32,%mm7        movd %mm6,%ebx        movd %mm7,%edx        movlps (%esi,%eax,4),%xmm5        movlps (%esi,%ecx,4),%xmm7        movhps (%esi,%ebx,4),%xmm5        movhps (%esi,%edx,4),%xmm7 ## got half coulomb table         movaps %xmm5,%xmm4        shufps $136,%xmm7,%xmm4 ## constant 10001000        shufps $221,%xmm7,%xmm5 ## constant 11011101        movlps 8(%esi,%eax,4),%xmm7        movlps 8(%esi,%ecx,4),%xmm3        movhps 8(%esi,%ebx,4),%xmm7        movhps 8(%esi,%edx,4),%xmm3    ## other half of coulomb table          movaps %xmm7,%xmm6        shufps $136,%xmm3,%xmm6 ## constant 10001000        shufps $221,%xmm3,%xmm7 ## constant 11011101        ## coulomb table ready, in xmm4-xmm7          mulps  %xmm1,%xmm6      ## xmm6=Geps         mulps  %xmm2,%xmm7      ## xmm7=Heps2         addps  %xmm6,%xmm5        addps  %xmm7,%xmm5      ## xmm5=Fp         mulps  nb302_two(%esp),%xmm7            ## two*Heps2         movaps nb302_qqHH(%esp),%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 mm5 contains vcoul and mm3 fijC         addps  nb302_vctot(%esp),%xmm5        movaps %xmm5,nb302_vctot(%esp)        xorps  %xmm1,%xmm1        mulps  nb302_tsc(%esp),%xmm3        mulps  %xmm0,%xmm3        subps  %xmm3,%xmm1        movaps %xmm1,%xmm0        movaps %xmm1,%xmm2        movaps nb302_fjxH1(%esp),%xmm3        movaps nb302_fjyH1(%esp),%xmm4        movaps nb302_fjzH1(%esp),%xmm5        mulps nb302_dxH2H1(%esp),%xmm0        mulps nb302_dyH2H1(%esp),%xmm1        mulps nb302_dzH2H1(%esp),%xmm2        subps %xmm0,%xmm3        subps %xmm1,%xmm4        subps %xmm2,%xmm5        addps nb302_fixH2(%esp),%xmm0        addps nb302_fiyH2(%esp),%xmm1        addps nb302_fizH2(%esp),%xmm2        movaps %xmm3,nb302_fjxH1(%esp)        movaps %xmm4,nb302_fjyH1(%esp)        movaps %xmm5,nb302_fjzH1(%esp)        movaps %xmm0,nb302_fixH2(%esp)        movaps %xmm1,nb302_fiyH2(%esp)        movaps %xmm2,nb302_fizH2(%esp)        ## H2-H2 interaction         movaps nb302_rinvH2H2(%esp),%xmm0        movaps %xmm0,%xmm1        mulps  nb302_rsqH2H2(%esp),%xmm1   ## xmm1=r         mulps  nb302_tsc(%esp),%xmm1        movhlps %xmm1,%xmm2        cvttps2pi %xmm1,%mm6        cvttps2pi %xmm2,%mm7    ## mm6/mm7 contain lu indices         cvtpi2ps %mm6,%xmm3        cvtpi2ps %mm7,%xmm2        movlhps  %xmm2,%xmm3        subps    %xmm3,%xmm1    ## xmm1=eps         movaps %xmm1,%xmm2        mulps  %xmm2,%xmm2      ## xmm2=eps2         pslld   $2,%mm6        pslld   $2,%mm7        movd %mm6,%eax        psrlq $32,%mm6        movd %mm7,%ecx        psrlq $32,%mm7        movd %mm6,%ebx        movd %mm7,%edx        movlps (%esi,%eax,4),%xmm5        movlps (%esi,%ecx,4),%xmm7        movhps (%esi,%ebx,4),%xmm5        movhps (%esi,%edx,4),%xmm7 ## got half coulomb table         movaps %xmm5,%xmm4        shufps $136,%xmm7,%xmm4 ## constant 10001000        shufps $221,%xmm7,%xmm5 ## constant 11011101        movlps 8(%esi,%eax,4),%xmm7        movlps 8(%esi,%ecx,4),%xmm3        movhps 8(%esi,%ebx,4),%xmm7        movhps 8(%esi,%edx,4),%xmm3    ## other half of coulomb table          movaps %xmm7,%xmm6        shufps $136,%xmm3,%xmm6 ## constant 10001000        shufps $221,%xmm3,%xmm7 ## constant 11011101        ## coulomb table ready, in xmm4-xmm7          mulps  %xmm1,%xmm6      ## xmm6=Geps         mulps  %xmm2,%xmm7      ## xmm7=Heps2         addps  %xmm6,%xmm5        addps  %xmm7,%xmm5      ## xmm5=Fp         mulps  nb302_two(%esp),%xmm7            ## two*Heps2         movaps nb302_qqHH(%esp),%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 mm5 contains vcoul and mm3 fijC         addps  nb302_vctot(%esp),%xmm5        movaps %xmm5,nb302_vctot(%esp)        xorps  %xmm1,%xmm1        mulps  nb302_tsc(%esp),%xmm3        mulps  %xmm0,%xmm3        subps  %xmm3,%xmm1        movaps %xmm1,%xmm0        movaps %xmm1,%xmm2        movaps nb302_fjxH2(%esp),%xmm3        movaps nb302_fjyH2(%esp),%xmm4        movaps nb302_fjzH2(%esp),%xmm5        mulps nb302_dxH2H2(%esp),%xmm0        mulps nb302_dyH2H2(%esp),%xmm1        mulps nb302_dzH2H2(%esp),%xmm2        subps %xmm0,%xmm3        subps %xmm1,%xmm4        subps %xmm2,%xmm5        addps nb302_fixH2(%esp),%xmm0        addps nb302_fiyH2(%esp),%xmm1        addps nb302_fizH2(%esp),%xmm2        movaps %xmm3,nb302_fjxH2(%esp)        movaps %xmm4,nb302_fjyH2(%esp)        movaps %xmm5,nb302_fjzH2(%esp)        movaps %xmm0,nb302_fixH2(%esp)        movaps %xmm1,nb302_fiyH2(%esp)        movaps %xmm2,nb302_fizH2(%esp)        movl nb302_faction(%ebp),%edi        movd %mm0,%eax        movd %mm1,%ebx        movd %mm2,%ecx        movd %mm3,%edx        ## Did all interactions - now update j forces         ## At this stage forces are still on the stack, in positions:        ## fjxO, fjyO, fjzO, ... , fjzH2.        ## Each position is a quadruplet of forces for the four         ## corresponding j waters, so we need to transpose them before        ## adding to the memory positions.        ##         ## This _used_ to be a simple transpose, but the resulting high number        ## of unaligned 128-bit load/stores might trigger a possible hardware         ## bug on Athlon and Opteron chips, so I have worked around it        ## to use 64-bit load/stores instead. The performance hit should be        ## very modest, since the 128-bit unaligned memory instructions were        ## slow anyway.         ## 4 j waters with three atoms each - first do Oxygen X & Y forces for 4 j particles         movaps nb302_fjxO(%esp),%xmm0   ## xmm0= fjxOa  fjxOb  fjxOc  fjxOd         movaps nb302_fjyO(%esp),%xmm2   ## xmm1= fjyOa  fjyOb  fjyOc  fjyOd        movlps (%edi,%eax,4),%xmm3        movlps (%edi,%ecx,4),%xmm4        movaps %xmm0,%xmm1        unpcklps %xmm2,%xmm0       ## xmm0= fjxOa  fjyOa  fjxOb  fjyOb        unpckhps %xmm2,%xmm1       ## xmm1= fjxOc  fjyOc  fjxOd  fjyOd        movhps (%edi,%ebx,4),%xmm3        movhps (%edi,%edx,4),%xmm4        addps  %xmm0,%xmm3        addps  %xmm1,%xmm4        movlps %xmm3,(%edi,%eax,4)        movlps %xmm4,(%edi,%ecx,4)        movhps %xmm3,(%edi,%ebx,4)        movhps %xmm4,(%edi,%edx,4)        ## Oxygen Z & first hydrogen X forces for 4 j particles         movaps nb302_fjzO(%esp),%xmm0    ## xmm0= fjzOa   fjzOb   fjzOc   fjzOd         movaps nb302_fjxH1(%esp),%xmm2   ## xmm1= fjxH1a  fjxH1b  fjxH1c  fjxH1d        movlps 8(%edi,%eax,4),%xmm3        movlps 8(%edi,%ecx,4),%xmm4        movaps %xmm0,%xmm1        unpcklps %xmm2,%xmm0       ## xmm0= fjzOa  fjxH1a  fjzOb  fjxH1b        unpckhps %xmm2,%xmm1       ## xmm1= fjzOc  fjxH1c  fjzOd  fjxH1d        movhps 8(%edi,%ebx,4),%xmm3        movhps 8(%edi,%edx,4),%xmm4        addps  %xmm0,%xmm3        addps  %xmm1,%xmm4        movlps %xmm3,8(%edi,%eax,4)        movlps %xmm4,8(%edi,%ecx,4)        movhps %xmm3,8(%edi,%ebx,4)        movhps %xmm4,8(%edi,%edx,4)        ## First hydrogen Y & Z forces for 4 j particles         movaps nb302_fjyH1(%esp),%xmm0    ## xmm0= fjyH1a  fjyH1b  fjyH1c  fjyH1d         movaps nb302_fjzH1(%esp),%xmm2   ## xmm1= fjzH1a  fjzH1b  fjzH1c  fjzH1d        movlps 16(%edi,%eax,4),%xmm3        movlps 16(%edi,%ecx,4),%xmm4        movaps %xmm0,%xmm1        unpcklps %xmm2,%xmm0            ## xmm0= fjyH1a  fjzH1a  fjyH1b  fjzH1b        unpckhps %xmm2,%xmm1            ## xmm1= fjyH1c  fjzH1c  fjyH1d  fjzH1d        movhps 16(%edi,%ebx,4),%xmm3        movhps 16(%edi,%edx,4),%xmm4        addps  %xmm0,%xmm3        addps  %xmm1,%xmm4        movlps %xmm3,16(%edi,%eax,4)        movlps %xmm4,16(%edi,%ecx,4)        movhps %xmm3,16(%edi,%ebx,4)        movhps %xmm4,16(%edi,%edx,4)        ## Second hydrogen X & Y forces for 4 j particles         movaps nb302_fjxH2(%esp),%xmm0    ## xmm0= fjxH2a  fjxH2b  fjxH2c  fjxH2d         movaps nb302_fjyH2(%esp),%xmm2   ## xmm1= fjyH2a  fjyH2b  fjyH2c  fjyH2d        movlps 24(%edi,%eax,4),%xmm3        movlps 24(%edi,%ecx,4),%xmm4        movaps %xmm0,%xmm1        unpcklps %xmm2,%xmm0            ## xmm0= fjxH2a  fjyH2a  fjxH2b  fjyH2b        unpckhps %xmm2,%xmm1            ## xmm1= fjxH2c  fjyH2c  fjxH2d  fjyH2d        movhps 24(%edi,%ebx,4),%xmm3        movhps 24(%edi,%edx,4),%xmm4        addps  %xmm0,%xmm3        addps  %xmm1,%xmm4        movlps %xmm3,24(%edi,%eax,4)        movlps %xmm4,24(%edi,%ecx,4)        movhps %xmm3,24(%edi,%ebx,4)        movhps %xmm4,24(%edi,%edx,4)        ## Second hydrogen Z forces for 4 j particles         ## Just load the four Z coords into one reg. each        movss 32(%edi,%eax,4),%xmm4        movss 32(%edi,%ebx,4),%xmm5        movss 32(%edi,%ecx,4),%xmm6        movss 32(%edi,%edx,4),%xmm7        ## add what we have on the stack        addss nb302_fjzH2(%esp),%xmm4        addss nb302_fjzH2b(%esp),%xmm5        addss nb302_fjzH2c(%esp),%xmm6        addss nb302_fjzH2d(%esp),%xmm7        ## store back        movss %xmm4,32(%edi,%eax,4)        movss %xmm5,32(%edi,%ebx,4)        movss %xmm6,32(%edi,%ecx,4)        movss %xmm7,32(%edi,%edx,4)        ## should we do one more iteration?         subl $4,nb302_innerk(%esp)        jl    _nb_kernel302_ia32_sse.nb302_single_check        jmp   _nb_kernel302_ia32_sse.nb302_unroll_loop_nb_kernel302_ia32_sse.nb302_single_check:         addl $4,nb302_innerk(%esp)        jnz   _nb_kernel302_ia32_sse.nb302_single_loop        jmp   _nb_kernel302_ia32_sse.nb302_updateouterdata_nb_kernel302_ia32_sse.nb302_single_loop:         movl  nb302_innerjjnr(%esp),%edx        ## pointer to jjnr[k]         movl  (%edx),%eax        addl $4,nb302_innerjjnr(%esp)        movl nb302_pos(%ebp),%esi        leal  (%eax,%eax,2),%eax        ## fetch j coordinates         xorps %xmm3,%xmm3        xorps %xmm4,%xmm4

⌨️ 快捷键说明

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