nb_kernel430_x86_64_sse2.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,642 行 · 第 1/4 页
S
1,642 行
movapd 16(%rsi,%r12,8),%xmm2 ## G1c H1c movapd 16(%rsi,%r13,8),%xmm12 ## G2c H2c movapd 16(%rdi,%r14,8),%xmm6 ## G1d H1d movapd 16(%rdi,%r15,8),%xmm13 ## G2d H2d movapd 48(%rdi,%r14,8),%xmm10 ## G1r H1r movapd 48(%rdi,%r15,8),%xmm14 ## G2r H2r movapd %xmm2,%xmm3 movapd %xmm6,%xmm7 movapd %xmm10,%xmm11 unpcklpd %xmm12,%xmm2 ## G1c G2c unpckhpd %xmm12,%xmm3 ## H1c H2c unpcklpd %xmm13,%xmm6 ## G1d G2d unpckhpd %xmm13,%xmm7 ## H1d H2d unpcklpd %xmm14,%xmm10 ## G1r G2r unpckhpd %xmm14,%xmm11 ## H1r H2r ## table data ready. Coul GB in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11 movq nb430_vdwparam(%rbp),%rdi movapd nb430_epsgb(%rsp),%xmm12 movapd nb430_eps(%rsp),%xmm13 mulpd %xmm12,%xmm3 ## Heps mulpd %xmm13,%xmm7 mulpd %xmm13,%xmm11 mulpd %xmm12,%xmm2 ## Geps mulpd %xmm13,%xmm6 mulpd %xmm13,%xmm10 mulpd %xmm12,%xmm3 ## Heps2 mulpd %xmm13,%xmm7 mulpd %xmm13,%xmm11 movlpd (%rdi,%r8,8),%xmm14 movlpd 8(%rdi,%r8,8),%xmm15 addpd %xmm2,%xmm1 ## F+Geps addpd %xmm6,%xmm5 addpd %xmm10,%xmm9 addpd %xmm3,%xmm1 ## F+Geps+Heps2 = Fp addpd %xmm7,%xmm5 addpd %xmm11,%xmm9 addpd %xmm3,%xmm3 ## 2*Heps2 addpd %xmm7,%xmm7 addpd %xmm11,%xmm11 movhpd (%rdi,%r9,8),%xmm14 movhpd 8(%rdi,%r9,8),%xmm15 addpd %xmm2,%xmm3 ## 2*Heps2+Geps addpd %xmm6,%xmm7 addpd %xmm10,%xmm11 addpd %xmm1,%xmm3 ## FF = Fp + 2*Heps2 + Geps addpd %xmm5,%xmm7 addpd %xmm9,%xmm11 mulpd %xmm12,%xmm1 ## eps*Fp mulpd %xmm13,%xmm5 mulpd %xmm13,%xmm9 addpd %xmm0,%xmm1 ## VV addpd %xmm4,%xmm5 addpd %xmm8,%xmm9 mulpd nb430_qq(%rsp),%xmm1 ## VV*qq = vcoul mulpd %xmm14,%xmm5 ## vnb6 mulpd %xmm15,%xmm9 ## vnb12 mulpd nb430_qq(%rsp),%xmm3 ## FF*qq = fij mulpd %xmm14,%xmm7 ## fijD mulpd %xmm15,%xmm11 ##fijR addpd %xmm7,%xmm11 ## fijD+fijR mulpd nb430_tsc(%rsp),%xmm11 ## (fijD+fijR)*tabscale ## accumulate Vvdwtot addpd nb430_Vvdwtot(%rsp),%xmm5 addpd %xmm9,%xmm5 movapd %xmm5,nb430_Vvdwtot(%rsp) movq nb430_dvda(%rbp),%rsi ## Calculate dVda mulpd nb430_gbscale(%rsp),%xmm3 ## fijC=qq*FF*gbscale movapd %xmm3,%xmm6 mulpd nb430_r(%rsp),%xmm6 addpd %xmm1,%xmm6 ## vcoul+fijC*r addpd %xmm11,%xmm3 ## fijC+fijD+fijR ## increment vctot addpd nb430_vctot(%rsp),%xmm1 movapd %xmm1,nb430_vctot(%rsp) ## xmm6=(vcoul+fijC*r) xorpd %xmm7,%xmm7 subpd %xmm6,%xmm7 movapd %xmm7,%xmm6 ## the fj's - start by combiningg forces from memory movq nb430_faction(%rbp),%rdi movlpd (%rdi,%r10,8),%xmm0 movlpd 8(%rdi,%r10,8),%xmm1 movlpd 16(%rdi,%r10,8),%xmm2 movhpd (%rdi,%r11,8),%xmm0 movhpd 8(%rdi,%r11,8),%xmm1 movhpd 16(%rdi,%r11,8),%xmm2 ## update dvdasum addpd nb430_dvdasum(%rsp),%xmm7 movapd %xmm7,nb430_dvdasum(%rsp) ## update j atoms dvdaj movhlps %xmm6,%xmm7 addsd (%rsi,%rax,8),%xmm6 addsd (%rsi,%rbx,8),%xmm7 movsd %xmm6,(%rsi,%rax,8) movsd %xmm7,(%rsi,%rbx,8) xorpd %xmm4,%xmm4 mulpd nb430_rinv(%rsp),%xmm3 subpd %xmm3,%xmm4 movapd %xmm4,%xmm9 movapd %xmm4,%xmm10 movapd %xmm4,%xmm11 mulpd nb430_dx(%rsp),%xmm9 mulpd nb430_dy(%rsp),%xmm10 mulpd nb430_dz(%rsp),%xmm11 addpd %xmm9,%xmm0 addpd %xmm10,%xmm1 addpd %xmm11,%xmm2 ## accumulate i forces addpd nb430_fix(%rsp),%xmm9 addpd nb430_fiy(%rsp),%xmm10 addpd nb430_fiz(%rsp),%xmm11 movlpd %xmm0,(%rdi,%r10,8) movlpd %xmm1,8(%rdi,%r10,8) movlpd %xmm2,16(%rdi,%r10,8) movapd %xmm9,nb430_fix(%rsp) movapd %xmm10,nb430_fiy(%rsp) movapd %xmm11,nb430_fiz(%rsp) movhpd %xmm0,(%rdi,%r11,8) movhpd %xmm1,8(%rdi,%r11,8) movhpd %xmm2,16(%rdi,%r11,8) ## should we do one more iteration? subl $2,nb430_innerk(%rsp) jl _nb_kernel430_x86_64_sse2.nb430_checksingle jmp _nb_kernel430_x86_64_sse2.nb430_unroll_loop_nb_kernel430_x86_64_sse2.nb430_checksingle: movl nb430_innerk(%rsp),%edx andl $1,%edx jnz _nb_kernel430_x86_64_sse2.nb430_dosingle jmp _nb_kernel430_x86_64_sse2.nb430_updateouterdata_nb_kernel430_x86_64_sse2.nb430_dosingle: movq nb430_charge(%rbp),%rsi movq nb430_invsqrta(%rbp),%rdx movq nb430_pos(%rbp),%rdi movq nb430_innerjjnr(%rsp),%rcx movl (%rcx),%eax ## load isaj movq nb430_invsqrta(%rbp),%rsi movsd (%rsi,%rax,8),%xmm2 mulsd nb430_isai(%rsp),%xmm2 movapd %xmm2,nb430_isaprod(%rsp) movapd %xmm2,%xmm1 mulsd nb430_gbtsc(%rsp),%xmm1 movapd %xmm1,nb430_gbscale(%rsp) mulsd nb430_iq(%rsp),%xmm2 movq nb430_charge(%rbp),%rsi ## base of charge[] movsd (%rsi,%rax,8),%xmm3 mulsd %xmm2,%xmm3 movapd %xmm3,nb430_qq(%rsp) movq nb430_type(%rbp),%rsi movl (%rsi,%rax,4),%r8d movq nb430_vdwparam(%rbp),%rsi shll %r8d movl nb430_ntia(%rsp),%edi addl %edi,%r8d movsd (%rsi,%r8,8),%xmm4 movsd 8(%rsi,%r8,8),%xmm6 movapd %xmm4,nb430_c6(%rsp) movapd %xmm6,nb430_c12(%rsp) movq nb430_pos(%rbp),%rsi ## base of pos[] lea (%rax,%rax,2),%r10 ## j3 ## move coordinate to xmm4-xmm6 movsd (%rsi,%r10,8),%xmm4 movsd 8(%rsi,%r10,8),%xmm5 movsd 16(%rsi,%r10,8),%xmm6 movq nb430_faction(%rbp),%rdi ## calc dr subsd nb430_ix(%rsp),%xmm4 subsd nb430_iy(%rsp),%xmm5 subsd nb430_iz(%rsp),%xmm6 ## store dr movapd %xmm4,nb430_dx(%rsp) movapd %xmm5,nb430_dy(%rsp) movapd %xmm6,nb430_dz(%rsp) ## square it mulsd %xmm4,%xmm4 mulsd %xmm5,%xmm5 mulsd %xmm6,%xmm6 addsd %xmm5,%xmm4 addsd %xmm6,%xmm4 ## rsq in xmm4 cvtsd2ss %xmm4,%xmm5 rsqrtss %xmm5,%xmm5 cvtss2sd %xmm5,%xmm2 ## lu in low xmm2 ## lookup seed in xmm2 movapd %xmm2,%xmm5 ## copy of lu mulsd %xmm2,%xmm2 ## lu*lu movapd nb430_three(%rsp),%xmm1 mulsd %xmm4,%xmm2 ## rsq*lu*lu movapd nb430_half(%rsp),%xmm0 subsd %xmm2,%xmm1 ## 30-rsq*lu*lu mulsd %xmm5,%xmm1 mulsd %xmm0,%xmm1 ## xmm0=iter1 of rinv (new lu) movapd %xmm1,%xmm5 ## copy of lu mulsd %xmm1,%xmm1 ## lu*lu movapd nb430_three(%rsp),%xmm2 mulsd %xmm4,%xmm1 ## rsq*lu*lu movapd nb430_half(%rsp),%xmm0 subsd %xmm1,%xmm2 ## 30-rsq*lu*lu mulsd %xmm5,%xmm2 mulsd %xmm2,%xmm0 ## xmm0=iter2 of rinv mulsd %xmm0,%xmm4 ## xmm4=r movapd %xmm4,nb430_r(%rsp) movapd %xmm0,nb430_rinv(%rsp) movapd %xmm4,%xmm8 ## r mulsd nb430_gbscale(%rsp),%xmm4 mulsd nb430_tsc(%rsp),%xmm8 ## truncate and convert to integers cvttsd2si %xmm4,%r12d ## gb cvttsd2si %xmm8,%r14d ## lj ## convert back to float cvtsi2sd %r12d,%xmm6 ## gb cvtsi2sd %r14d,%xmm10 ## lj ## multiply by 4 and 8, respectively shll $2,%r12d ## gb shll $3,%r14d ## lj ## GB indices: r10 LJ indices: r12 ## calculate eps subsd %xmm6,%xmm4 ## gb subsd %xmm10,%xmm8 ## lj movapd %xmm4,nb430_epsgb(%rsp) ## gb eps movapd %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 movapd (%rsi,%r12,8),%xmm0 ## Y1c F1c movapd (%rdi,%r14,8),%xmm4 ## Y1d F1d movapd 32(%rdi,%r14,8),%xmm8 ## Y1r F1r movhlps %xmm0,%xmm1 movhlps %xmm4,%xmm5 movhlps %xmm8,%xmm9 movapd 16(%rsi,%r12,8),%xmm2 ## G1c H1c movapd 16(%rdi,%r14,8),%xmm6 ## G1d H1d movapd 48(%rdi,%r14,8),%xmm10 ## G1r H1r movhlps %xmm2,%xmm3 movhlps %xmm6,%xmm7 movhlps %xmm10,%xmm11 ## table data ready. Coul GB in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11 movapd nb430_epsgb(%rsp),%xmm12 movapd nb430_eps(%rsp),%xmm13 mulsd %xmm12,%xmm3 ## Heps mulsd %xmm13,%xmm7 mulsd %xmm13,%xmm11 mulsd %xmm12,%xmm2 ## Geps mulsd %xmm13,%xmm6 mulsd %xmm13,%xmm10 mulsd %xmm12,%xmm3 ## Heps2 mulsd %xmm13,%xmm7 mulsd %xmm13,%xmm11 addsd %xmm2,%xmm1 ## F+Geps addsd %xmm6,%xmm5 addsd %xmm10,%xmm9 addsd %xmm3,%xmm1 ## F+Geps+Heps2 = Fp addsd %xmm7,%xmm5 addsd %xmm11,%xmm9 addsd %xmm3,%xmm3 ## 2*Heps2 addsd %xmm7,%xmm7 addsd %xmm11,%xmm11 addsd %xmm2,%xmm3 ## 2*Heps2+Geps addsd %xmm6,%xmm7 addsd %xmm10,%xmm11 addsd %xmm1,%xmm3 ## FF = Fp + 2*Heps2 + Geps addsd %xmm5,%xmm7 addsd %xmm9,%xmm11 mulsd %xmm12,%xmm1 ## eps*Fp mulsd %xmm13,%xmm5 mulsd %xmm13,%xmm9 addsd %xmm0,%xmm1 ## VV addsd %xmm4,%xmm5 addsd %xmm8,%xmm9 mulsd nb430_qq(%rsp),%xmm1 ## VV*qq = vcoul mulsd nb430_c6(%rsp),%xmm5 ## vnb6 mulsd nb430_c12(%rsp),%xmm9 ## vnb12 mulsd nb430_qq(%rsp),%xmm3 ## FF*qq = fij mulsd nb430_c6(%rsp),%xmm7 ## fijD mulsd nb430_c12(%rsp),%xmm11 ##fijR addsd %xmm7,%xmm11 ## fijD+fijR mulsd nb430_tsc(%rsp),%xmm11 ## (fijD+fijR)*tabscale ## accumulate Vvdwtot addsd nb430_Vvdwtot(%rsp),%xmm5 addsd %xmm9,%xmm5 movsd %xmm5,nb430_Vvdwtot(%rsp) movq nb430_dvda(%rbp),%rsi ## Calculate dVda mulsd nb430_gbscale(%rsp),%xmm3 ## fijC=qq*FF*gbscale movapd %xmm3,%xmm6 mulsd nb430_r(%rsp),%xmm6 addsd %xmm1,%xmm6 ## vcoul+fijC*r addsd %xmm11,%xmm3 ## fijC+fijD+fijR ## increment vctot addsd nb430_vctot(%rsp),%xmm1 movsd %xmm1,nb430_vctot(%rsp) ## xmm6=(vcoul+fijC*r) xorpd %xmm7,%xmm7 subsd %xmm6,%xmm7 movapd %xmm7,%xmm6 ## update dvdasum addsd nb430_dvdasum(%rsp),%xmm7 movsd %xmm7,nb430_dvdasum(%rsp) ## update j atoms dvdaj addsd (%rsi,%rax,8),%xmm6 movsd %xmm6,(%rsi,%rax,8) xorpd %xmm4,%xmm4 mulsd nb430_rinv(%rsp),%xmm3 subsd %xmm3,%xmm4 movapd %xmm4,%xmm9 movapd %xmm4,%xmm10 movapd %xmm4,%xmm11 mulsd nb430_dx(%rsp),%xmm9 mulsd nb430_dy(%rsp),%xmm10 mulsd nb430_dz(%rsp),%xmm11 movapd %xmm9,%xmm3 movapd %xmm10,%xmm4 movapd %xmm11,%xmm5 ## accumulate i forces addsd nb430_fix(%rsp),%xmm9 addsd nb430_fiy(%rsp),%xmm10 addsd nb430_fiz(%rsp),%xmm11 movsd %xmm9,nb430_fix(%rsp) movsd %xmm10,nb430_fiy(%rsp) movsd %xmm11,nb430_fiz(%rsp) movq nb430_faction(%rbp),%rdi ## the fj's - start by accumulating forces from memory addsd (%rdi,%r10,8),%xmm3 addsd 8(%rdi,%r10,8),%xmm4 addsd 16(%rdi,%r10,8),%xmm5 movsd %xmm3,(%rdi,%r10,8) movsd %xmm4,8(%rdi,%r10,8) movsd %xmm5,16(%rdi,%r10,8)_nb_kernel430_x86_64_sse2.nb430_updateouterdata: movl nb430_ii3(%rsp),%ecx movq nb430_faction(%rbp),%rdi movq nb430_fshift(%rbp),%rsi movl nb430_is3(%rsp),%edx ## accumulate i forces in xmm0, xmm1, xmm2 movapd nb430_fix(%rsp),%xmm0 movapd nb430_fiy(%rsp),%xmm1 movapd nb430_fiz(%rsp),%xmm2 movhlps %xmm0,%xmm3 movhlps %xmm1,%xmm4 movhlps %xmm2,%xmm5 addsd %xmm3,%xmm0
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?