nb_kernel430_x86_64_sse2.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,642 行 · 第 1/4 页
S
1,642 行
## square it mulpd %xmm4,%xmm4 mulpd %xmm5,%xmm5 mulpd %xmm6,%xmm6 addpd %xmm5,%xmm4 addpd %xmm6,%xmm4 ## rsq in xmm4 cvtpd2ps %xmm4,%xmm5 rsqrtps %xmm5,%xmm5 cvtps2pd %xmm5,%xmm2 ## lu in low xmm2 ## lookup seed in xmm2 movapd %xmm2,%xmm5 ## copy of lu mulpd %xmm2,%xmm2 ## lu*lu movapd nb430nf_three(%rsp),%xmm1 mulpd %xmm4,%xmm2 ## rsq*lu*lu movapd nb430nf_half(%rsp),%xmm0 subpd %xmm2,%xmm1 ## 30-rsq*lu*lu mulpd %xmm5,%xmm1 mulpd %xmm0,%xmm1 ## xmm0=iter1 of rinv (new lu) movapd %xmm1,%xmm5 ## copy of lu mulpd %xmm1,%xmm1 ## lu*lu movapd nb430nf_three(%rsp),%xmm2 mulpd %xmm4,%xmm1 ## rsq*lu*lu movapd nb430nf_half(%rsp),%xmm0 subpd %xmm1,%xmm2 ## 30-rsq*lu*lu mulpd %xmm5,%xmm2 mulpd %xmm2,%xmm0 ## xmm0=iter2 of rinv mulpd %xmm0,%xmm4 ## xmm4=r movapd %xmm4,nb430nf_r(%rsp) mulpd nb430nf_gbscale(%rsp),%xmm4 cvttpd2pi %xmm4,%mm6 ## mm6 = lu idx cvtpi2pd %mm6,%xmm5 subpd %xmm5,%xmm4 movapd %xmm4,%xmm1 ## xmm1=eps movapd %xmm1,%xmm2 mulpd %xmm2,%xmm2 ## xmm2=eps2 pslld $2,%mm6 ## idx *= 4 movq nb430nf_GBtab(%rbp),%rsi movd %mm6,%ecx psrlq $32,%mm6 movd %mm6,%edx ## indices in eax/ebx ## Coulomb movapd (%rsi,%rcx,8),%xmm4 ## Y1 F1 movapd (%rsi,%rdx,8),%xmm3 ## Y2 F2 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 Y2 unpckhpd %xmm3,%xmm5 ## F1 F2 movapd 16(%rsi,%rcx,8),%xmm6 ## G1 H1 movapd 16(%rsi,%rdx,8),%xmm3 ## G2 H2 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 G2 unpckhpd %xmm3,%xmm7 ## H1 H2 ## coulomb table ready, in xmm4-xmm7 mulpd %xmm1,%xmm6 ## xmm6=Geps mulpd %xmm2,%xmm7 ## xmm7=Heps2 addpd %xmm6,%xmm5 addpd %xmm7,%xmm5 ## xmm5=Fp movapd nb430nf_qq(%rsp),%xmm3 mulpd %xmm1,%xmm5 ## xmm5=eps*Fp addpd %xmm4,%xmm5 ## xmm5=VV mulpd %xmm3,%xmm5 ## vcoul=qq*VV addpd nb430nf_vctot(%rsp),%xmm5 movapd %xmm5,nb430nf_vctot(%rsp) movapd nb430nf_r(%rsp),%xmm4 mulpd nb430nf_tsc(%rsp),%xmm4 cvttpd2pi %xmm4,%mm6 ## mm6 = lu idx cvtpi2pd %mm6,%xmm5 subpd %xmm5,%xmm4 movapd %xmm4,%xmm1 ## xmm1=eps movapd %xmm1,%xmm2 mulpd %xmm2,%xmm2 ## xmm2=eps2 pslld $3,%mm6 ## idx *= 8 movq nb430nf_VFtab(%rbp),%rsi movd %mm6,%ecx psrlq $32,%mm6 movd %mm6,%edx ## indices in eax/ebx ## Dispersion movapd (%rsi,%rcx,8),%xmm4 ## Y1 F1 movapd (%rsi,%rdx,8),%xmm3 ## Y2 F2 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 Y2 unpckhpd %xmm3,%xmm5 ## F1 F2 movapd 16(%rsi,%rcx,8),%xmm6 ## G1 H1 movapd 16(%rsi,%rdx,8),%xmm3 ## G2 H2 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 G2 unpckhpd %xmm3,%xmm7 ## H1 H2 ## Dispersion table ready, in xmm4-xmm7 mulpd %xmm1,%xmm6 ## xmm6=Geps mulpd %xmm2,%xmm7 ## xmm7=Heps2 addpd %xmm6,%xmm5 addpd %xmm7,%xmm5 ## xmm5=Fp mulpd %xmm1,%xmm5 ## xmm5=eps*Fp addpd %xmm4,%xmm5 ## xmm5=VV mulpd nb430nf_c6(%rsp),%xmm5 ## Vvdw6 addpd nb430nf_Vvdwtot(%rsp),%xmm5 movapd %xmm5,nb430nf_Vvdwtot(%rsp) ## Repulsion movapd 32(%rsi,%rcx,8),%xmm4 ## Y1 F1 movapd 32(%rsi,%rdx,8),%xmm3 ## Y2 F2 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 Y2 unpckhpd %xmm3,%xmm5 ## F1 F2 movapd 48(%rsi,%rcx,8),%xmm6 ## G1 H1 movapd 48(%rsi,%rdx,8),%xmm3 ## G2 H2 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 G2 unpckhpd %xmm3,%xmm7 ## H1 H2 ## Dispersion table ready, in xmm4-xmm7 mulpd %xmm1,%xmm6 ## xmm6=Geps mulpd %xmm2,%xmm7 ## xmm7=Heps2 addpd %xmm6,%xmm5 addpd %xmm7,%xmm5 ## xmm5=Fp mulpd %xmm1,%xmm5 ## xmm5=eps*Fp addpd %xmm4,%xmm5 ## xmm5=VV mulpd nb430nf_c12(%rsp),%xmm5 ## Vvdw12 addpd nb430nf_Vvdwtot(%rsp),%xmm5 movapd %xmm5,nb430nf_Vvdwtot(%rsp) xorpd %xmm4,%xmm4 ## should we do one more iteration? subl $2,nb430nf_innerk(%rsp) jl _nb_kernel430nf_x86_64_sse2.nb430nf_checksingle jmp _nb_kernel430nf_x86_64_sse2.nb430nf_unroll_loop_nb_kernel430nf_x86_64_sse2.nb430nf_checksingle: movl nb430nf_innerk(%rsp),%edx andl $1,%edx jnz _nb_kernel430nf_x86_64_sse2.nb430nf_dosingle jmp _nb_kernel430nf_x86_64_sse2.nb430nf_updateouterdata_nb_kernel430nf_x86_64_sse2.nb430nf_dosingle: movq nb430nf_charge(%rbp),%rsi movq nb430nf_invsqrta(%rbp),%rdx movq nb430nf_pos(%rbp),%rdi movq nb430nf_innerjjnr(%rsp),%rcx movl (%rcx),%eax xorpd %xmm6,%xmm6 movapd %xmm6,%xmm7 movsd (%rdx,%rax,8),%xmm7 movlpd (%rsi,%rax,8),%xmm6 ## xmm6(0) has the charge mulsd nb430nf_isai(%rsp),%xmm7 movapd %xmm7,nb430nf_isaprod(%rsp) movapd %xmm7,%xmm1 mulpd nb430nf_gbtsc(%rsp),%xmm1 movapd %xmm1,nb430nf_gbscale(%rsp) mulsd nb430nf_iq(%rsp),%xmm7 mulsd %xmm7,%xmm6 movapd %xmm6,nb430nf_qq(%rsp) movq nb430nf_type(%rbp),%rsi movl (%rsi,%rax,4),%edx movq nb430nf_vdwparam(%rbp),%rsi shll %edx movl nb430nf_ntia(%rsp),%edi addl %edi,%edx movlpd (%rsi,%rdx,8),%xmm6 ## c6a movhpd 8(%rsi,%rdx,8),%xmm6 ## c6a c12a xorpd %xmm7,%xmm7 movapd %xmm6,%xmm4 unpcklpd %xmm7,%xmm4 unpckhpd %xmm7,%xmm6 movapd %xmm4,nb430nf_c6(%rsp) movapd %xmm6,nb430nf_c12(%rsp) movq nb430nf_pos(%rbp),%rsi ## base of pos[] lea (%rax,%rax,2),%rax ## replace jnr with j3 ## move two coordinates to xmm0-xmm2 movlpd (%rsi,%rax,8),%xmm0 movlpd 8(%rsi,%rax,8),%xmm1 movlpd 16(%rsi,%rax,8),%xmm2 movq nb430nf_faction(%rbp),%rdi ## move nb430nf_ix-iz to xmm4-xmm6 movapd nb430nf_ix(%rsp),%xmm4 movapd nb430nf_iy(%rsp),%xmm5 movapd nb430nf_iz(%rsp),%xmm6 ## calc dr subsd %xmm0,%xmm4 subsd %xmm1,%xmm5 subsd %xmm2,%xmm6 ## 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 nb430nf_three(%rsp),%xmm1 mulsd %xmm4,%xmm2 ## rsq*lu*lu movapd nb430nf_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 nb430nf_three(%rsp),%xmm2 mulsd %xmm4,%xmm1 ## rsq*lu*lu movapd nb430nf_half(%rsp),%xmm0 subsd %xmm1,%xmm2 ## 30-rsq*lu*lu mulsd %xmm5,%xmm2 mulsd %xmm2,%xmm0 ## xmm0=iter2 of rinv (new lu) mulsd %xmm0,%xmm4 ## xmm4=r movsd %xmm4,nb430nf_r(%rsp) mulsd nb430nf_gbscale(%rsp),%xmm4 cvttsd2si %xmm4,%edx ## mm6 = lu idx cvtsi2sd %edx,%xmm5 subsd %xmm5,%xmm4 movapd %xmm4,%xmm1 ## xmm1=eps movapd %xmm1,%xmm2 mulsd %xmm2,%xmm2 ## xmm2=eps2 shll $2,%edx ## idx *= 4 movq nb430nf_GBtab(%rbp),%rsi ## Coulomb movapd (%rsi,%rdx,8),%xmm4 ## Y1 F1 xorpd %xmm3,%xmm3 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 unpckhpd %xmm3,%xmm5 ## F1 movapd 16(%rsi,%rdx,8),%xmm6 ## G1 H1 xorpd %xmm3,%xmm3 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 unpckhpd %xmm3,%xmm7 ## H1 ## coulomb table ready, in xmm4-xmm7 mulsd %xmm1,%xmm6 ## xmm6=Geps mulsd %xmm2,%xmm7 ## xmm7=Heps2 addsd %xmm6,%xmm5 addsd %xmm7,%xmm5 ## xmm5=Fp movapd nb430nf_qq(%rsp),%xmm3 mulsd %xmm1,%xmm5 ## xmm5=eps*Fp addsd %xmm4,%xmm5 ## xmm5=VV mulsd %xmm3,%xmm5 ## vcoul=qq*VV addsd nb430nf_vctot(%rsp),%xmm5 movsd %xmm5,nb430nf_vctot(%rsp) movsd nb430nf_r(%rsp),%xmm4 mulsd nb430nf_tsc(%rsp),%xmm4 cvttsd2si %xmm4,%edx ## mm6 = lu idx cvtsi2sd %edx,%xmm5 subsd %xmm5,%xmm4 movsd %xmm4,%xmm1 ## xmm1=eps movsd %xmm1,%xmm2 mulsd %xmm2,%xmm2 ## xmm2=eps2 shll $3,%edx movq nb430nf_VFtab(%rbp),%rsi ## Dispersion movapd (%rsi,%rdx,8),%xmm4 ## Y1 F1 xorpd %xmm3,%xmm3 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 unpckhpd %xmm3,%xmm5 ## F1 movapd 16(%rsi,%rdx,8),%xmm6 ## G1 H1 xorpd %xmm3,%xmm3 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 unpckhpd %xmm3,%xmm7 ## H1 ## Dispersion table ready, in xmm4-xmm7 mulsd %xmm1,%xmm6 ## xmm6=Geps mulsd %xmm2,%xmm7 ## xmm7=Heps2 addsd %xmm6,%xmm5 addsd %xmm7,%xmm5 ## xmm5=Fp mulsd %xmm1,%xmm5 ## xmm5=eps*Fp addsd %xmm4,%xmm5 ## xmm5=VV mulsd nb430nf_c6(%rsp),%xmm5 ## Vvdw6 addsd nb430nf_Vvdwtot(%rsp),%xmm5 movlpd %xmm5,nb430nf_Vvdwtot(%rsp) ## Repulsion movapd 32(%rsi,%rdx,8),%xmm4 ## Y1 F1 xorpd %xmm3,%xmm3 movapd %xmm4,%xmm5 unpcklpd %xmm3,%xmm4 ## Y1 unpckhpd %xmm3,%xmm5 ## F1 movapd 48(%rsi,%rdx,8),%xmm6 ## G1 H1 xorpd %xmm3,%xmm3 movapd %xmm6,%xmm7 unpcklpd %xmm3,%xmm6 ## G1 unpckhpd %xmm3,%xmm7 ## H1 ## Dispersion table ready, in xmm4-xmm7 mulsd %xmm1,%xmm6 ## xmm6=Geps mulsd %xmm2,%xmm7 ## xmm7=Heps2 addsd %xmm6,%xmm5 addsd %xmm7,%xmm5 ## xmm5=Fp mulsd %xmm1,%xmm5 ## xmm5=eps*Fp addsd %xmm4,%xmm5 ## xmm5=VV mulsd nb430nf_c12(%rsp),%xmm5 ## Vvdw12 addsd nb430nf_Vvdwtot(%rsp),%xmm5 movlpd %xmm5,nb430nf_Vvdwtot(%rsp)_nb_kernel430nf_x86_64_sse2.nb430nf_updateouterdata: ## get n from stack movl nb430nf_n(%rsp),%esi ## get group index for i particle movq nb430nf_gid(%rbp),%rdx ## base of gid[] movl (%rdx,%rsi,4),%edx ## ggid=gid[n] ## accumulate total potential energy and update it movapd nb430nf_vctot(%rsp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addsd %xmm6,%xmm7 ## low xmm7 has the sum now ## add earlier value from mem movq nb430nf_Vc(%rbp),%rax addsd (%rax,%rdx,8),%xmm7 ## move back to mem movsd %xmm7,(%rax,%rdx,8) ## accumulate total lj energy and update it movapd nb430nf_Vvdwtot(%rsp),%xmm7 ## accumulate movhlps %xmm7,%xmm6 addsd %xmm6,%xmm7 ## low xmm7 has the sum now ## add earlier value from mem movq nb430nf_Vvdw(%rbp),%rax addsd (%rax,%rdx,8),%xmm7 ## move back to mem movsd %xmm7,(%rax,%rdx,8) ## finish if last movl nb430nf_nn1(%rsp),%ecx ## esi already loaded with n incl %esi subl %esi,%ecx jz _nb_kernel430nf_x86_64_sse2.nb430nf_outerend ## not last, iterate outer loop once more! movl %esi,nb430nf_n(%rsp) jmp _nb_kernel430nf_x86_64_sse2.nb430nf_outer_nb_kernel430nf_x86_64_sse2.nb430nf_outerend: ## check if more outer neighborlists remain movl nb430nf_nri(%rsp),%ecx ## esi already loaded with n above subl %esi,%ecx jz _nb_kernel430nf_x86_64_sse2.nb430nf_end ## non-zero, do one more workunit jmp _nb_kernel430nf_x86_64_sse2.nb430nf_threadloop_nb_kernel430nf_x86_64_sse2.nb430nf_end: movl nb430nf_nouter(%rsp),%eax movl nb430nf_ninner(%rsp),%ebx movq nb430nf_outeriter(%rbp),%rcx movq nb430nf_inneriter(%rbp),%rdx movl %eax,(%rcx) movl %ebx,(%rdx) addq $392,%rsp emms pop %r15 pop %r14 pop %r13 pop %r12 pop %rbx pop %rbp ret
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?