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