nb_kernel230_ia32_sse.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,028 行 · 第 1/5 页
S
2,028 行
movss (%edi,%eax,4),%xmm3 movss 4(%edi,%eax,4),%xmm4 movss 8(%edi,%eax,4),%xmm5 subss %xmm0,%xmm3 subss %xmm1,%xmm4 subss %xmm2,%xmm5 movss %xmm3,(%edi,%eax,4) movss %xmm4,4(%edi,%eax,4) movss %xmm5,8(%edi,%eax,4) shufps $225,%xmm0,%xmm0 ## constant 11100001 shufps $225,%xmm1,%xmm1 ## constant 11100001 shufps $225,%xmm2,%xmm2 ## constant 11100001 movss (%edi,%ebx,4),%xmm3 movss 4(%edi,%ebx,4),%xmm4 movss 8(%edi,%ebx,4),%xmm5 subss %xmm0,%xmm3 subss %xmm1,%xmm4 subss %xmm2,%xmm5 movss %xmm3,(%edi,%ebx,4) movss %xmm4,4(%edi,%ebx,4) movss %xmm5,8(%edi,%ebx,4)_nb_kernel230_ia32_sse.nb230_checksingle: movl nb230_innerk(%esp),%edx andl $1,%edx jnz _nb_kernel230_ia32_sse.nb230_dosingle jmp _nb_kernel230_ia32_sse.nb230_updateouterdata_nb_kernel230_ia32_sse.nb230_dosingle: movl nb230_charge(%ebp),%esi movl nb230_pos(%ebp),%edi movl nb230_innerjjnr(%esp),%ecx xorps %xmm3,%xmm3 movl (%ecx),%eax movss (%esi,%eax,4),%xmm3 ## xmm3(0) has the charge movl nb230_type(%ebp),%esi movl %eax,%ecx movl (%esi,%ecx,4),%ecx movl nb230_vdwparam(%ebp),%esi shll %ecx addl nb230_ntia(%esp),%ecx xorps %xmm6,%xmm6 movlps (%esi,%ecx,4),%xmm6 movaps %xmm6,%xmm4 shufps $252,%xmm4,%xmm4 ## constant 11111100 shufps $253,%xmm6,%xmm6 ## constant 11111101 movaps %xmm4,nb230_c6(%esp) movaps %xmm6,nb230_c12(%esp) leal (%eax,%eax,2),%eax ## move coordinates to xmm0-xmm2 movss (%edi,%eax,4),%xmm0 movss 4(%edi,%eax,4),%xmm1 movss 8(%edi,%eax,4),%xmm2 mulps nb230_iq(%esp),%xmm3 xorps %xmm7,%xmm7 movaps nb230_ix(%esp),%xmm4 movaps nb230_iy(%esp),%xmm5 movaps nb230_iz(%esp),%xmm6 ## calc dr subps %xmm0,%xmm4 subps %xmm1,%xmm5 subps %xmm2,%xmm6 ## store dr movaps %xmm4,nb230_dx(%esp) movaps %xmm5,nb230_dy(%esp) movaps %xmm6,nb230_dz(%esp) ## square it mulps %xmm4,%xmm4 mulps %xmm5,%xmm5 mulps %xmm6,%xmm6 addps %xmm5,%xmm4 addps %xmm6,%xmm4 ## rsq in xmm4 movss nb230_krf(%esp),%xmm7 rsqrtss %xmm4,%xmm5 ## lookup seed in xmm5 movss %xmm5,%xmm2 mulss %xmm5,%xmm5 movss nb230_three(%esp),%xmm1 mulss %xmm4,%xmm5 ## rsq*lu*lu movss nb230_half(%esp),%xmm0 mulss %xmm4,%xmm7 ## xmm7=krsq subss %xmm5,%xmm1 ## constant 30-rsq*lu*lu mulss %xmm2,%xmm1 mulss %xmm1,%xmm0 ## xmm0=rinv movss %xmm0,%xmm1 movss %xmm0,%xmm6 addss %xmm7,%xmm6 ## xmm6=rinv+ krsq subss nb230_crf(%esp),%xmm6 mulss %xmm3,%xmm6 ## xmm6=vcoul=qq*(rinv+ krsq-crf) mulss nb230_two(%esp),%xmm7 ## 2*krsq addss nb230_vctot(%esp),%xmm6 movss %xmm6,nb230_vctot(%esp) subss %xmm7,%xmm0 ## rinv-2*krsq mulss %xmm3,%xmm0 ## qq*(rinv-2*krsq) mulss %xmm1,%xmm0 ## qq*(rinv-2*krsq)*rinv movss %xmm0,nb230_fstmp(%esp) ## LJ table mulss %xmm1,%xmm4 ## r mulss nb230_tsc(%esp),%xmm4 ## rtab movaps %xmm1,%xmm0 ## copy of rinv cvttps2pi %xmm4,%mm6 cvtpi2ps %mm6,%xmm6 subss %xmm6,%xmm4 movss %xmm4,%xmm1 ## xmm1=eps movss %xmm1,%xmm2 mulss %xmm2,%xmm2 ## xmm2=eps2 pslld $3,%mm6 movd %eax,%mm0 movl nb230_VFtab(%ebp),%esi movd %mm6,%eax ## dispersion movlps (%esi,%eax,4),%xmm5 movaps %xmm5,%xmm4 shufps $136,%xmm7,%xmm4 ## constant 10001000 shufps $221,%xmm7,%xmm5 ## constant 11011101 movlps 8(%esi,%eax,4),%xmm7 movaps %xmm7,%xmm6 shufps $136,%xmm3,%xmm6 ## constant 10001000 shufps $221,%xmm3,%xmm7 ## constant 11011101 ## dispersion table ready, in xmm4-xmm7 mulss %xmm1,%xmm6 ## xmm6=Geps mulss %xmm2,%xmm7 ## xmm7=Heps2 addss %xmm6,%xmm5 addss %xmm7,%xmm5 ## xmm5=Fp mulss nb230_two(%esp),%xmm7 ## two*Heps2 addss %xmm6,%xmm7 addss %xmm5,%xmm7 ## xmm7=FF mulss %xmm1,%xmm5 ## xmm5=eps*Fp addss %xmm4,%xmm5 ## xmm5=VV movss nb230_c6(%esp),%xmm4 mulss %xmm4,%xmm7 ## fijD mulss %xmm4,%xmm5 ## Vvdw6 movss nb230_fstmp(%esp),%xmm3 mulss nb230_tsc(%esp),%xmm7 subss %xmm7,%xmm3 ## put scalar force on stack Update Vvdwtot directly addss nb230_Vvdwtot(%esp),%xmm5 movss %xmm3,nb230_fstmp(%esp) movss %xmm5,nb230_Vvdwtot(%esp) ## repulsion movlps 16(%esi,%eax,4),%xmm5 movaps %xmm5,%xmm4 shufps $136,%xmm7,%xmm4 ## constant 10001000 shufps $221,%xmm7,%xmm5 ## constant 11011101 movlps 24(%esi,%eax,4),%xmm7 movaps %xmm7,%xmm6 shufps $136,%xmm3,%xmm6 ## constant 10001000 shufps $221,%xmm3,%xmm7 ## constant 11011101 ## table ready, in xmm4-xmm7 mulss %xmm1,%xmm6 ## xmm6=Geps mulss %xmm2,%xmm7 ## xmm7=Heps2 addss %xmm6,%xmm5 addss %xmm7,%xmm5 ## xmm5=Fp mulss nb230_two(%esp),%xmm7 ## two*Heps2 addss %xmm6,%xmm7 addss %xmm5,%xmm7 ## xmm7=FF mulss %xmm1,%xmm5 ## xmm5=eps*Fp addss %xmm4,%xmm5 ## xmm5=VV movss nb230_c12(%esp),%xmm4 mulss %xmm4,%xmm7 ## fijR mulss %xmm4,%xmm5 ## Vvdw12 movss nb230_fstmp(%esp),%xmm3 mulss nb230_tsc(%esp),%xmm7 subss %xmm7,%xmm3 addss nb230_Vvdwtot(%esp),%xmm5 movss %xmm5,nb230_Vvdwtot(%esp) mulss %xmm0,%xmm3 movd %mm0,%eax movaps nb230_dx(%esp),%xmm0 movaps nb230_dy(%esp),%xmm1 movaps nb230_dz(%esp),%xmm2 mulss %xmm3,%xmm0 mulss %xmm3,%xmm1 mulss %xmm3,%xmm2 ## xmm0-xmm2 contains tx-tz (partial force) ## now update f_i movaps nb230_fix(%esp),%xmm3 movaps nb230_fiy(%esp),%xmm4 movaps nb230_fiz(%esp),%xmm5 addss %xmm0,%xmm3 addss %xmm1,%xmm4 addss %xmm2,%xmm5 movaps %xmm3,nb230_fix(%esp) movaps %xmm4,nb230_fiy(%esp) movaps %xmm5,nb230_fiz(%esp) ## update fj movl nb230_faction(%ebp),%edi movss (%edi,%eax,4),%xmm3 movss 4(%edi,%eax,4),%xmm4 movss 8(%edi,%eax,4),%xmm5 subss %xmm0,%xmm3 subss %xmm1,%xmm4 subss %xmm2,%xmm5 movss %xmm3,(%edi,%eax,4) movss %xmm4,4(%edi,%eax,4) movss %xmm5,8(%edi,%eax,4)_nb_kernel230_ia32_sse.nb230_updateouterdata: movl nb230_ii3(%esp),%ecx movl nb230_faction(%ebp),%edi movl nb230_fshift(%ebp),%esi movl nb230_is3(%esp),%edx ## accumulate i forces in xmm0, xmm1, xmm2 movaps nb230_fix(%esp),%xmm0 movaps nb230_fiy(%esp),%xmm1 movaps nb230_fiz(%esp),%xmm2 movhlps %xmm0,%xmm3 movhlps %xmm1,%xmm4 movhlps %xmm2,%xmm5 addps %xmm3,%xmm0 addps %xmm4,%xmm1 addps %xmm5,%xmm2 ## sum is in 1/2 in xmm0-xmm2 movaps %xmm0,%xmm3 movaps %xmm1,%xmm4 movaps %xmm2,%xmm5 shufps $1,%xmm3,%xmm3 shufps $1,%xmm4,%xmm4 shufps $1,%xmm5,%xmm5 addss %xmm3,%xmm0 addss %xmm4,%xmm1 addss %xmm5,%xmm2 ## xmm0-xmm2 has single force in pos0 ## increment i force movss (%edi,%ecx,4),%xmm3 movss 4(%edi,%ecx,4),%xmm4 movss 8(%edi,%ecx,4),%xmm5 addss %xmm0,%xmm3 addss %xmm1,%xmm4 addss %xmm2,%xmm5 movss %xmm3,(%edi,%ecx,4) movss %xmm4,4(%edi,%ecx,4) movss %xmm5,8(%edi,%ecx,4) ## increment fshift force movss (%esi,%edx,4),%xmm3 movss 4(%esi,%edx,4),%xmm4 movss 8(%esi,%edx,4),%xmm5 addss %xmm0,%xmm3 addss %xmm1,%xmm4 addss %xmm2,%xmm5 movss %xmm3,(%esi,%edx,4) movss %xmm4,4(%esi,%edx,4) movss %xmm5,8(%esi,%edx,4) ## get n from stack movl nb230_n(%esp),%esi ## get group index for i particle movl nb230_gid(%ebp),%edx ## base of gid[] movl (%edx,%esi,4),%edx ## ggid=gid[n] ## accumulate total potential energy and update it movaps nb230_vctot(%esp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addps %xmm6,%xmm7 ## pos 0-1 in xmm7 have the sum now movaps %xmm7,%xmm6 shufps $1,%xmm6,%xmm6 addss %xmm6,%xmm7 ## add earlier value from mem movl nb230_Vc(%ebp),%eax addss (%eax,%edx,4),%xmm7 ## move back to mem movss %xmm7,(%eax,%edx,4) ## accumulate total lj energy and update it movaps nb230_Vvdwtot(%esp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addps %xmm6,%xmm7 ## pos 0-1 in xmm7 have the sum now movaps %xmm7,%xmm6 shufps $1,%xmm6,%xmm6 addss %xmm6,%xmm7 ## add earlier value from mem movl nb230_Vvdw(%ebp),%eax addss (%eax,%edx,4),%xmm7 ## move back to mem movss %xmm7,(%eax,%edx,4) ## finish if last movl nb230_nn1(%esp),%ecx ## esi already loaded with n incl %esi subl %esi,%ecx jz _nb_kernel230_ia32_sse.nb230_outerend ## not last, iterate outer loop once more! movl %esi,nb230_n(%esp) jmp _nb_kernel230_ia32_sse.nb230_outer_nb_kernel230_ia32_sse.nb230_outerend: ## check if more outer neighborlists remain movl nb230_nri(%esp),%ecx ## esi already loaded with n above subl %esi,%ecx jz _nb_kernel230_ia32_sse.nb230_end ## non-zero, do one more workunit jmp _nb_kernel230_ia32_sse.nb230_threadloop_nb_kernel230_ia32_sse.nb230_end: emms movl nb230_nouter(%esp),%eax movl nb230_ninner(%esp),%ebx movl nb230_outeriter(%ebp),%ecx movl nb230_inneriter(%ebp),%edx movl %eax,(%ecx) movl %ebx,(%edx) movl nb230_salign(%esp),%eax addl %eax,%esp addl $400,%esp popl %edi popl %esi popl %edx popl %ecx popl %ebx popl %eax leave ret.globl nb_kernel230nf_ia32_sse.globl _nb_kernel230nf_ia32_ssenb_kernel230nf_ia32_sse: _nb_kernel230nf_ia32_sse: .set nb230nf_p_nri, 8.set nb230nf_iinr, 12.set nb230nf_jindex, 16.set nb230nf_jjnr, 20.set nb230nf_shift, 24.set nb230nf_shiftvec, 28.set nb230nf_fshift, 32.set nb230nf_gid, 36.set nb230nf_pos, 40.set nb230nf_faction, 44.set nb230nf_charge, 48.set nb230nf_p_facel, 52.set nb230nf_argkrf, 56.set nb230nf_argcrf, 60.set nb230nf_Vc, 64.set nb230nf_type, 68.set nb230nf_p_ntype, 72.set nb230nf_vdwparam, 76.set nb230nf_Vvdw, 80.set nb230nf_p_tabscale, 84.set nb230nf_VFtab, 88.set nb230nf_invsqrta, 92.set nb230nf_dvda, 96.set nb230nf_p_gbtabscale, 100.set nb230nf_GBtab, 104.set nb230nf_p_nthreads, 108.set nb230nf_count, 112.set nb230nf_mtx, 116.set nb230nf_outeriter, 120.set nb230nf_inneriter, 124.set nb230nf_work, 128 ## stack offsets for local variables ## bottom of stack is cache-aligned for sse use .set nb230nf_ix, 0.set nb230nf_iy, 16.set nb230nf_iz, 32.set nb230nf_iq, 48.set nb230nf_dx, 64.set nb230nf_dy, 80.set nb230nf_dz, 96.set nb230nf_c6, 112.set nb230nf_c12, 128
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?