nb_kernel400_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,664 行 · 第 1/3 页
S
1,664 行
movaps xmm3, xmm2 addps xmm2, xmm2 ;# two addps xmm3, xmm2 ;# three movaps [rsp + nb400nf_half], xmm1 movaps [rsp + nb400nf_three], xmm3.nb400nf_threadloop: mov rsi, [rbp + nb400nf_count] ;# pointer to sync counter mov eax, [rsi].nb400nf_spinlock: mov ebx, eax ;# ebx=*count=nn0 add ebx, 1 ;# ebx=nn1=nn0+10 lock cmpxchg [esi], ebx ;# write nn1 to *counter, ;# if it hasnt changed. ;# or reread *counter to eax. pause ;# -> better p4 performance jnz .nb400nf_spinlock ;# if(nn1>nri) nn1=nri mov ecx, [rsp + nb400nf_nri] mov edx, ecx sub ecx, ebx cmovle ebx, edx ;# if(nn1>nri) nn1=nri ;# Cleared the spinlock if we got here. ;# eax contains nn0, ebx contains nn1. mov [rsp + nb400nf_n], eax mov [rsp + nb400nf_nn1], ebx sub ebx, eax ;# calc number of outer lists mov esi, eax ;# copy n to esi jg .nb400nf_outerstart jmp .nb400nf_end.nb400nf_outerstart: ;# ebx contains number of outer iterations add ebx, [rsp + nb400nf_nouter] mov [rsp + nb400nf_nouter], ebx.nb400nf_outer: mov rax, [rsp + nb400nf_shift] ;# rax = pointer into shift[] mov ebx, [rax + rsi*4] ;# ebx=shift[n] lea rbx, [rbx + rbx*2] ;# rbx=3*is mov [rsp + nb400nf_is3],ebx ;# store is3 mov rax, [rsp + nb400nf_shiftvec] ;# rax = base of shiftvec[] movss xmm0, [rax + rbx*4] movss xmm1, [rax + rbx*4 + 4] movss xmm2, [rax + rbx*4 + 8] mov rcx, [rsp + nb400nf_iinr] ;# rcx = pointer into iinr[] mov ebx, [rcx + rsi*4] ;# ebx =ii mov rdx, [rbp + nb400nf_charge] movss xmm3, [rdx + rbx*4] mulss xmm3, [rsp + nb400nf_facel] shufps xmm3, xmm3, 0 mov rdx, [rbp + nb400nf_invsqrta] ;# load invsqrta[ii] movss xmm4, [rdx + rbx*4] shufps xmm4, xmm4, 0 lea rbx, [rbx + rbx*2] ;# rbx = 3*ii=ii3 mov rax, [rbp + nb400nf_pos] ;# rax = base of pos[] addss xmm0, [rax + rbx*4] addss xmm1, [rax + rbx*4 + 4] addss xmm2, [rax + rbx*4 + 8] movaps [rsp + nb400nf_iq], xmm3 movaps [rsp + nb400nf_isai], xmm4 shufps xmm0, xmm0, 0 shufps xmm1, xmm1, 0 shufps xmm2, xmm2, 0 movaps [rsp + nb400nf_ix], xmm0 movaps [rsp + nb400nf_iy], xmm1 movaps [rsp + nb400nf_iz], xmm2 mov [rsp + nb400nf_ii3], ebx ;# clear vctot xorps xmm4, xmm4 movaps [rsp + nb400nf_vctot], xmm4 mov rax, [rsp + nb400nf_jindex] mov ecx, [rax + rsi*4] ;# jindex[n] mov edx, [rax + rsi*4 + 4] ;# jindex[n+1] sub edx, ecx ;# number of innerloop atoms mov rsi, [rbp + nb400nf_pos] mov rdi, [rbp + nb400nf_faction] mov rax, [rsp + nb400nf_jjnr] shl ecx, 2 add rax, rcx mov [rsp + nb400nf_innerjjnr], rax ;# pointer to jjnr[nj0] mov ecx, edx sub edx, 4 add ecx, [rsp + nb400nf_ninner] mov [rsp + nb400nf_ninner], ecx add edx, 0 mov [rsp + nb400nf_innerk], edx ;# number of innerloop atoms jge .nb400nf_unroll_loop jmp .nb400nf_finish_inner.nb400nf_unroll_loop: ;# quad-unroll innerloop here mov rdx, [rsp + nb400nf_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] mov ebx, [rdx + 4] mov ecx, [rdx + 8] mov edx, [rdx + 12] ;# eax-edx=jnr1-4 add qword ptr [rsp + nb400nf_innerjjnr], 16 ;# advance pointer (unrolled 4) ;# load isa2 mov rsi, [rbp + nb400nf_invsqrta] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] movaps xmm2, [rsp + nb400nf_isai] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm2, xmm3 movaps [rsp + nb400nf_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb400nf_gbtsc] movaps [rsp + nb400nf_gbscale], xmm1 mov rsi, [rbp + nb400nf_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] mulps xmm2, [rsp + nb400nf_iq] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm3, xmm2 movaps [rsp + nb400nf_qq], xmm3 mov rsi, [rbp + nb400nf_pos] ;# base of pos[] lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] ;# replace jnr with j3 lea rdx, [rdx + rdx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm4, [rsi + rax*4] movlps xmm5, [rsi + rcx*4] movss xmm2, [rsi + rax*4 + 8] movss xmm6, [rsi + rcx*4 + 8] movhps xmm4, [rsi + rbx*4] movhps xmm5, [rsi + rdx*4] movss xmm0, [rsi + rbx*4 + 8] movss xmm1, [rsi + rdx*4 + 8] shufps xmm2, xmm0, 0 shufps xmm6, xmm1, 0 movaps xmm0, xmm4 movaps xmm1, xmm4 shufps xmm2, xmm6, 136 ;# 10001000 shufps xmm0, xmm5, 136 ;# 10001000 shufps xmm1, xmm5, 221 ;# 11011101 ;# move ix-iz to xmm4-xmm6 movaps xmm4, [rsp + nb400nf_ix] movaps xmm5, [rsp + nb400nf_iy] movaps xmm6, [rsp + nb400nf_iz] ;# calc dr subps xmm4, xmm0 subps xmm5, xmm1 subps xmm6, xmm2 ;# square it mulps xmm4,xmm4 mulps xmm5,xmm5 mulps xmm6,xmm6 addps xmm4, xmm5 addps xmm4, xmm6 ;# rsq in xmm4 rsqrtps xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulps xmm5, xmm5 movaps xmm1, [rsp + nb400nf_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb400nf_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r mulps xmm4, [rsp + nb400nf_gbscale] movhlps xmm5, xmm4 cvttps2pi mm6, xmm4 cvttps2pi mm7, xmm5 ;# mm6/mm7 contain lu indices cvtpi2ps xmm6, mm6 cvtpi2ps xmm5, mm7 movlhps xmm6, xmm5 subps xmm4, xmm6 movaps xmm1, xmm4 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 pslld mm7, 2 movd mm0, eax movd mm1, ebx movd mm2, ecx movd mm3, edx mov rsi, [rbp + nb400nf_GBtab] movd eax, mm6 psrlq mm6, 32 movd ecx, mm7 psrlq mm7, 32 movd ebx, mm6 movd edx, mm7 ;# load coulomb table movaps xmm4, [rsi + rax*4] movaps xmm5, [rsi + rbx*4] movaps xmm6, [rsi + rcx*4] movaps xmm7, [rsi + rdx*4] ;# transpose, using xmm3 for scratch movaps xmm3, xmm6 shufps xmm3, xmm7, 0xEE shufps xmm6, xmm7, 0x44 movaps xmm7, xmm4 shufps xmm7, xmm5, 0xEE shufps xmm4, xmm5, 0x44 movaps xmm5, xmm4 shufps xmm5, xmm6, 0xDD shufps xmm4, xmm6, 0x88 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x88 shufps xmm7, xmm3, 0xDD ;# coulomb table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp movaps xmm3, [rsp + nb400nf_qq] mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, xmm3 ;# vcoul=qq*VV addps xmm5, [rsp + nb400nf_vctot] movaps [rsp + nb400nf_vctot], xmm5 ;# should we do one more iteration? sub dword ptr [rsp + nb400nf_innerk], 4 jl .nb400nf_finish_inner jmp .nb400nf_unroll_loop.nb400nf_finish_inner: ;# check if at least two particles remain add dword ptr [rsp + nb400nf_innerk], 4 mov edx, [rsp + nb400nf_innerk] and edx, 2 jnz .nb400nf_dopair jmp .nb400nf_checksingle.nb400nf_dopair: mov rcx, [rsp + nb400nf_innerjjnr] mov eax, [rcx] mov ebx, [rcx + 4] add qword ptr [rsp + nb400nf_innerjjnr], 8 xorps xmm2, xmm2 movaps xmm6, xmm2 ;# load isa2 mov rsi, [rbp + nb400nf_invsqrta] movss xmm2, [rsi + rax*4] movss xmm3, [rsi + rbx*4] unpcklps xmm2, xmm3 ;# isa2 in xmm3(0,1) mulps xmm2, [rsp + nb400nf_isai] movaps [rsp + nb400nf_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb400nf_gbtsc] movaps [rsp + nb400nf_gbscale], xmm1 mov rsi, [rbp + nb400nf_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm6, [rsi + rbx*4] unpcklps xmm3, xmm6 ;# 00001000 ;# xmm3(0,1) has the charges mulps xmm2, [rsp + nb400nf_iq] mulps xmm3, xmm2 movaps [rsp + nb400nf_qq], xmm3 mov rdi, [rbp + nb400nf_pos] lea rax, [rax + rax*2] lea rbx, [rbx + rbx*2] ;# move coordinates to xmm0-xmm2 movlps xmm1, [rdi + rax*4] movss xmm2, [rdi + rax*4 + 8] movhps xmm1, [rdi + rbx*4] movss xmm0, [rdi + rbx*4 + 8] movlhps xmm3, xmm7 shufps xmm2, xmm0, 0 movaps xmm0, xmm1 shufps xmm2, xmm2, 136 ;# 10001000 shufps xmm0, xmm0, 136 ;# 10001000 shufps xmm1, xmm1, 221 ;# 11011101 mov rdi, [rbp + nb400nf_faction] ;# move ix-iz to xmm4-xmm6 xorps xmm7, xmm7 movaps xmm4, [rsp + nb400nf_ix] movaps xmm5, [rsp + nb400nf_iy] movaps xmm6, [rsp + nb400nf_iz] ;# calc dr subps xmm4, xmm0 subps xmm5, xmm1 subps xmm6, xmm2 ;# square it mulps xmm4,xmm4 mulps xmm5,xmm5 mulps xmm6,xmm6 addps xmm4, xmm5 addps xmm4, xmm6 ;# rsq in xmm4 rsqrtps xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulps xmm5, xmm5 movaps xmm1, [rsp + nb400nf_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb400nf_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r mulps xmm4, [rsp + nb400nf_gbscale] cvttps2pi mm6, xmm4 ;# mm6 contain lu indices cvtpi2ps xmm6, mm6 subps xmm4, xmm6 movaps xmm1, xmm4 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 mov rsi, [rbp + nb400nf_GBtab] movd ecx, mm6 psrlq mm6, 32 movd edx, mm6 ;# load coulomb table movaps xmm4, [rsi + rcx*4] movaps xmm7, [rsi + rdx*4] ;# transpose, using xmm3 for scratch movaps xmm6, xmm4 unpcklps xmm4, xmm7 ;# Y1 Y2 F1 F2 unpckhps xmm6, xmm7 ;# G1 G2 H1 H2 movhlps xmm5, xmm4 ;# F1 F2 movhlps xmm7, xmm6 ;# H1 H2 ;# coulomb table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp movaps xmm3, [rsp + nb400nf_qq] mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, xmm3 ;# vcoul=qq*VV addps xmm5, [rsp + nb400nf_vctot] movaps [rsp + nb400nf_vctot], xmm5 .nb400nf_checksingle: mov edx, [rsp + nb400nf_innerk] and edx, 1 jnz .nb400nf_dosingle jmp .nb400nf_updateouterdata.nb400nf_dosingle: mov rsi, [rbp + nb400nf_charge] mov rdx, [rbp + nb400nf_invsqrta] mov rdi, [rbp + nb400nf_pos] mov rcx, [rsp + nb400nf_innerjjnr] mov eax, [rcx] xorps xmm2, xmm2 movaps xmm6, xmm2 movss xmm2, [rdx + rax*4] ;# isa2 mulss xmm2, [rsp + nb400nf_isai] movss [rsp + nb400nf_isaprod], xmm2 movss xmm1, xmm2 mulss xmm1, [rsp + nb400nf_gbtsc] movss [rsp + nb400nf_gbscale], xmm1 mulss xmm2, [rsp + nb400nf_iq] movss xmm6, [rsi + rax*4] ;# xmm6(0) has the charge mulss xmm6, xmm2 movss [rsp + nb400nf_qq], xmm6 lea rax, [rax + rax*2] ;# move coordinates to xmm0-xmm2 movss xmm0, [rdi + rax*4] movss xmm1, [rdi + rax*4 + 4] movss xmm2, [rdi + rax*4 + 8] movss xmm4, [rsp + nb400nf_ix] movss xmm5, [rsp + nb400nf_iy] movss xmm6, [rsp + nb400nf_iz] ;# calc dr subss xmm4, xmm0 subss xmm5, xmm1 subss xmm6, xmm2 ;# square it mulss xmm4,xmm4 mulss xmm5,xmm5 mulss xmm6,xmm6 addss xmm4, xmm5 addss xmm4, xmm6 ;# rsq in xmm4 rsqrtss xmm5, xmm4 ;# lookup seed in xmm5 movss xmm2, xmm5 mulss xmm5, xmm5 movss xmm1, [rsp + nb400nf_three] mulss xmm5, xmm4 ;# rsq*lu*lu movss xmm0, [rsp + nb400nf_half] subss xmm1, xmm5 ;# 30-rsq*lu*lu mulss xmm1, xmm2 mulss xmm0, xmm1 ;# xmm0=rinv mulss xmm4, xmm0 ;# xmm4=r mulss xmm4, [rsp + nb400nf_gbscale] cvttss2si ebx, xmm4 ;# mm6 contain lu indices cvtsi2ss xmm6, ebx subss xmm4, xmm6 movss xmm1, xmm4 ;# xmm1=eps movss xmm2, xmm1 mulss xmm2, xmm2 ;# xmm2=eps2 shl ebx, 2 mov rsi, [rbp + nb400nf_GBtab] movaps xmm4, [rsi + rbx*4] movhlps xmm6, xmm4 movaps xmm5, xmm4 movaps xmm7, xmm6 shufps xmm5, xmm5, 1 shufps xmm7, xmm7, 1 ;# table ready in xmm4-xmm7 mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm2 ;# xmm7=Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp movss xmm3, [rsp + nb400nf_qq] mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV mulss xmm5, xmm3 ;# vcoul=qq*VV addss xmm5, [rsp + nb400nf_vctot] movss [rsp + nb400nf_vctot], xmm5 .nb400nf_updateouterdata: ;# get n from stack mov esi, [rsp + nb400nf_n] ;# get group index for i particle mov rdx, [rbp + nb400nf_gid] ;# base of gid[] mov edx, [rdx + rsi*4] ;# ggid=gid[n] ;# accumulate total potential energy and update it movaps xmm7, [rsp + nb400nf_vctot] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 ;# add earlier value from mem mov rax, [rbp + nb400nf_Vc] addss xmm7, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm7 ;# finish if last mov ecx, [rsp + nb400nf_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb400nf_outerend ;# not last, iterate outer loop once more! mov [rsp + nb400nf_n], esi jmp .nb400nf_outer.nb400nf_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb400nf_nri] ;# esi already loaded with n above sub ecx, esi jz .nb400nf_end ;# non-zero, do one more workunit jmp .nb400nf_threadloop.nb400nf_end: mov eax, [rsp + nb400nf_nouter] mov ebx, [rsp + nb400nf_ninner] mov rcx, [rbp + nb400nf_outeriter] mov rdx, [rbp + nb400nf_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 296 emms pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?