nb_kernel334_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,325 行 · 第 1/5 页
S
2,325 行
jmp .nb334_unroll_loop.nb334_single_check: add dword ptr [rsp + nb334_innerk], 4 jnz .nb334_single_loop jmp .nb334_updateouterdata.nb334_single_loop: mov rdx, [rsp + nb334_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] add qword ptr [rsp + nb334_innerjjnr], 4 mov rsi, [rbp + nb334_pos] lea rax, [rax + rax*2] ;# fetch j coordinates movlps xmm3, [rsi + rax*4] ;# Ox Oy movlps xmm4, [rsi + rax*4 + 16] ;# H1y H1z movlps xmm5, [rsi + rax*4 + 32] ;# H2z Mx movhps xmm3, [rsi + rax*4 + 8] ;# Ox Oy Oz H1x movhps xmm4, [rsi + rax*4 + 24] ;# H1y H1z H2x H2y movhps xmm5, [rsi + rax*4 + 40] ;# H2z Mx My Mz ;# transpose movaps xmm0, xmm4 movaps xmm1, xmm3 movaps xmm2, xmm4 movaps xmm6, xmm3 shufps xmm4, xmm5, 18 ;# (00010010) h2x - Mx - shufps xmm3, xmm0, 193 ;# (11000001) Oy - H1y - shufps xmm2, xmm5, 35 ;# (00100011) H2y - My - shufps xmm1, xmm0, 18 ;# (00010010) Oz - H1z - ;# xmm6: Ox - - H1x xmm5: H2z - - Mz shufps xmm6, xmm4, 140 ;# (10001100) Ox H1x H2x Mx shufps xmm3, xmm2, 136 ;# (10001000) Oy H1y H2y My shufps xmm1, xmm5, 200 ;# (11001000) Oz H1z H2z Mz ;# store all j coordinates in jO movaps [rsp + nb334_jxO], xmm6 movaps [rsp + nb334_jyO], xmm3 movaps [rsp + nb334_jzO], xmm1 movaps xmm0, xmm6 ;# jxO movaps xmm2, xmm1 ;# jzO movaps xmm1, xmm3 ;# jyO movaps xmm4, xmm3 ;# jyO movaps xmm3, xmm6 ;# jxO movaps xmm5, xmm2 ;# jzO ;# do O and H1 in parallel subps xmm0, [rsp + nb334_ixO] subps xmm1, [rsp + nb334_iyO] subps xmm2, [rsp + nb334_izO] subps xmm3, [rsp + nb334_ixH1] subps xmm4, [rsp + nb334_iyH1] subps xmm5, [rsp + nb334_izH1] movaps [rsp + nb334_dxOO], xmm0 movaps [rsp + nb334_dyOO], xmm1 movaps [rsp + nb334_dzOO], xmm2 movaps [rsp + nb334_dxH1H1], xmm3 movaps [rsp + nb334_dyH1H1], xmm4 movaps [rsp + nb334_dzH1H1], xmm5 mulps xmm0, xmm0 mulps xmm1, xmm1 mulps xmm2, xmm2 addps xmm0, xmm1 addps xmm0, xmm2 ;# have rsq in xmm0 mulps xmm3, xmm3 mulps xmm4, xmm4 mulps xmm5, xmm5 addps xmm4, xmm3 addps xmm4, xmm5 ;# have rsq in xmm4 movaps [rsp + nb334_rsqOO], xmm0 movaps [rsp + nb334_rsqH1H1], xmm4 ;# do 1/sqrt(x) for O and H1 rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [rsp + nb334_three] movaps xmm7, xmm3 mulps xmm1, xmm0 mulps xmm5, xmm4 subps xmm3, xmm1 subps xmm7, xmm5 mulps xmm3, xmm2 mulps xmm7, xmm6 mulps xmm3, [rsp + nb334_half] ;# rinv O - j water mulps xmm7, [rsp + nb334_half] ;# rinv H1 - j water movaps [rsp + nb334_rinvOO], xmm3 movaps [rsp + nb334_rinvH1H1], xmm7 mov rsi, [rbp + nb334_VFtab] ;# do O table LJ interaction movaps xmm0, xmm3 movaps xmm1, xmm0 mulss xmm1, [rsp + nb334_rsqOO] ;# xmm1=r mulss xmm1, [rsp + nb334_tsc] cvttps2pi mm6, xmm1 cvtpi2ps xmm3, mm6 subss xmm1, xmm3 ;# xmm1=eps movaps xmm2, xmm1 mulss xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 movd ebx, mm6 lea rbx, [rbx + rbx*2] ;# load dispersion table data into xmm4 movlps xmm4, [rsi + rbx*4 + 16] movlps xmm6, [rsi + rbx*4 + 24] movaps xmm5, xmm4 movaps xmm7, xmm6 shufps xmm5, xmm5, 0x1 shufps xmm7, xmm7, 0x1 ;# dispersion table YFGH ready in xmm4-xmm7 mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm2 ;# xmm7=Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp mulss xmm7, [rsp + nb334_two] ;# two*Heps2 addss xmm7, xmm6 addss xmm7, xmm5 ;# xmm7=FF mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV movaps xmm4, [rsp + nb334_c6] mulss xmm7, xmm4 ;# fijD mulss xmm5, xmm4 ;# Vvdw6 ;# save scalar force in xmm3. Update Vvdwtot directly addss xmm5, [rsp + nb334_Vvdwtot] movaps xmm3, xmm7 ;# fscal movss [rsp + nb334_Vvdwtot], xmm5 ;# load repulsion table data into xmm4 movlps xmm4, [rsi + rbx*4 + 32] movlps xmm6, [rsi + rbx*4 + 40] movaps xmm5, xmm4 movaps xmm7, xmm6 shufps xmm5, xmm5, 0x1 shufps xmm7, xmm7, 0x1 ;# repulsion table YFGH ready in xmm4-xmm7 mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm2 ;# xmm7=Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp mulss xmm7, [rsp + nb334_two] ;# two*Heps2 addss xmm7, xmm6 addss xmm7, xmm5 ;# xmm7=FF mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV movaps xmm4, [rsp + nb334_c12] mulss xmm7, xmm4 ;# fijR mulss xmm5, xmm4 ;# Vvdw12 addss xmm7, xmm3 addss xmm5, [rsp + nb334_Vvdwtot] movss [rsp + nb334_Vvdwtot], xmm5 xorps xmm1, xmm1 mulss xmm7, [rsp + nb334_tsc] mulss xmm7, xmm0 subss xmm1, xmm7 movaps xmm0, xmm1 movaps xmm2, xmm1 mulss xmm0, [rsp + nb334_dxOO] mulss xmm1, [rsp + nb334_dyOO] mulss xmm2, [rsp + nb334_dzOO] xorps xmm3, xmm3 xorps xmm4, xmm4 xorps xmm5, xmm5 addss xmm3, xmm0 addss xmm4, xmm1 addss xmm5, xmm2 movaps [rsp + nb334_fjxO], xmm3 movaps [rsp + nb334_fjyO], xmm4 movaps [rsp + nb334_fjzO], xmm5 addss xmm0, [rsp + nb334_fixO] addss xmm1, [rsp + nb334_fiyO] addss xmm2, [rsp + nb334_fizO] movss [rsp + nb334_fixO], xmm0 movss [rsp + nb334_fiyO], xmm1 movss [rsp + nb334_fizO], xmm2 ;# do H1 coulomb interaction movaps xmm0, [rsp + nb334_rinvH1H1] ;# rinv movaps xmm1, xmm0 mulps xmm1, [rsp + nb334_rsqH1H1] ;# r mulps xmm1, [rsp + nb334_tsc] movhlps xmm2, xmm1 cvttps2pi mm6, xmm1 cvttps2pi mm7, xmm2 ;# mm6/mm7 contain lu indices cvtpi2ps xmm3, mm6 cvtpi2ps xmm2, mm7 movlhps xmm3, xmm2 subps xmm1, xmm3 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 pslld mm7, 2 psrlq mm6, 32 movd ebx, mm6 movd ecx, mm7 psrlq mm7, 32 movd edx, mm7 ;# table indices in ebx,ecx,edx lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] lea rdx, [rdx + rdx*2] mov rsi, [rbp + nb334_VFtab] movlps xmm4, [rsi + rbx*4] movlps xmm3, [rsi + rcx*4] movlps xmm7, [rsi + rdx*4] movhps xmm4, [rsi + rbx*4 + 8] movhps xmm3, [rsi + rcx*4 + 8] movhps xmm7, [rsi + rdx*4 + 8] movaps xmm6, xmm3 unpcklps xmm6, xmm7 unpckhps xmm3, xmm7 movaps xmm5, xmm4 movaps xmm7, xmm4 shufps xmm4, xmm6, 0x40 shufps xmm5, xmm6, 0xE4 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x48 shufps xmm7, xmm3, 0xEC ;# coulomb table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp mulps xmm7, [rsp + nb334_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [rsp + nb334_qqHH] movhps xmm3, [rsp + nb334_qqMH] shufps xmm3, xmm3, 193 ;# 11000001 addps xmm7, xmm6 addps xmm7, xmm5 ;# xmm7=FF mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, xmm3 ;# vcoul=qq*VV mulps xmm3, xmm7 ;# fijC=FF*qq ;# at this point xmm5 contains vcoul and xmm3 fijC addps xmm5, [rsp + nb334_vctot] movaps [rsp + nb334_vctot], xmm5 mulps xmm3, [rsp + nb334_tsc] xorps xmm2, xmm2 subps xmm2, xmm3 mulps xmm0, xmm2 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [rsp + nb334_dxH1H1] mulps xmm1, [rsp + nb334_dyH1H1] mulps xmm2, [rsp + nb334_dzH1H1] ;# update forces H1 - j water movaps xmm3, [rsp + nb334_fjxO] movaps xmm4, [rsp + nb334_fjyO] movaps xmm5, [rsp + nb334_fjzO] addps xmm3, xmm0 addps xmm4, xmm1 addps xmm5, xmm2 movaps [rsp + nb334_fjxO], xmm3 movaps [rsp + nb334_fjyO], xmm4 movaps [rsp + nb334_fjzO], xmm5 addps xmm0, [rsp + nb334_fixH1] addps xmm1, [rsp + nb334_fiyH1] addps xmm2, [rsp + nb334_fizH1] movaps [rsp + nb334_fixH1], xmm0 movaps [rsp + nb334_fiyH1], xmm1 movaps [rsp + nb334_fizH1], xmm2 ;# i H2 & M simultaneously first get i particle coords: movaps xmm0, [rsp + nb334_jxO] movaps xmm1, [rsp + nb334_jyO] movaps xmm2, [rsp + nb334_jzO] movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 subps xmm0, [rsp + nb334_ixH2] subps xmm1, [rsp + nb334_iyH2] subps xmm2, [rsp + nb334_izH2] subps xmm3, [rsp + nb334_ixM] subps xmm4, [rsp + nb334_iyM] subps xmm5, [rsp + nb334_izM] movaps [rsp + nb334_dxH2H2], xmm0 movaps [rsp + nb334_dyH2H2], xmm1 movaps [rsp + nb334_dzH2H2], xmm2 movaps [rsp + nb334_dxMM], xmm3 movaps [rsp + nb334_dyMM], xmm4 movaps [rsp + nb334_dzMM], xmm5 mulps xmm0, xmm0 mulps xmm1, xmm1 mulps xmm2, xmm2 mulps xmm3, xmm3 mulps xmm4, xmm4 mulps xmm5, xmm5 addps xmm0, xmm1 addps xmm4, xmm3 addps xmm0, xmm2 ;# have rsqH2 in xmm0 addps xmm4, xmm5 ;# have rsqM in xmm4 ;# start with H2, save data movaps [rsp + nb334_rsqH2H2], xmm0 movaps [rsp + nb334_rsqMM], xmm4 ;# do invsqrt rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [rsp + nb334_three] movaps xmm7, xmm3 mulps xmm1, xmm0 mulps xmm5, xmm4 subps xmm3, xmm1 subps xmm7, xmm5 mulps xmm3, xmm2 mulps xmm7, xmm6 mulps xmm3, [rsp + nb334_half] ;# rinv H2 - j water mulps xmm7, [rsp + nb334_half] ;# rinv M - j water movaps [rsp + nb334_rinvH2H2], xmm3 movaps [rsp + nb334_rinvMM], xmm7 movaps xmm1, xmm3 mulps xmm1, [rsp + nb334_rsqH2H2] ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [rsp + nb334_tsc] movhlps xmm2, xmm1 cvttps2pi mm6, xmm1 cvttps2pi mm7, xmm2 ;# mm6/mm7 contain lu indices cvtpi2ps xmm3, mm6 cvtpi2ps xmm2, mm7 movlhps xmm3, xmm2 subps xmm1, xmm3 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 pslld mm7, 2 psrlq mm6, 32 movd ebx, mm6 movd ecx, mm7 psrlq mm7, 32 movd edx, mm7 ;# table indices in ebx,ecx,edx lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] lea rdx, [rdx + rdx*2] movlps xmm4, [rsi + rbx*4] movlps xmm3, [rsi + rcx*4] movlps xmm7, [rsi + rdx*4] movhps xmm4, [rsi + rbx*4 + 8] movhps xmm3, [rsi + rcx*4 + 8] movhps xmm7, [rsi + rdx*4 + 8] movaps xmm6, xmm3 unpcklps xmm6, xmm7 unpckhps xmm3, xmm7 movaps xmm5, xmm4 movaps xmm7, xmm4 shufps xmm4, xmm6, 0x40 shufps xmm5, xmm6, 0xE4 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x48 shufps xmm7, xmm3, 0xEC ;# coulomb table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp mulps xmm7, [rsp + nb334_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [rsp + nb334_qqHH] movhps xmm3, [rsp + nb334_qqMH] shufps xmm3, xmm3, 193 ;# 11000001 addps xmm7, xmm6 addps xmm7, xmm5 ;# xmm7=FF mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, xmm3 ;# vcoul=qq*VV mulps xmm3, xmm7 ;# fijC=FF*qq ;# at this point xmm5 contains vcoul and xmm3 fijC addps xmm5, [rsp + nb334_vctot] movaps [rsp + nb334_vctot], xmm5 xorps xmm1, xmm1 mulps xmm3, [rsp + nb334_tsc] mulps xmm3, xmm0 subps xmm1, xmm3 movaps xmm0, xmm1 movaps xmm2, xmm1 mulps xmm0, [rsp + nb334_dxH2H2] mulps xmm1, [rsp + nb334_dyH2H2] mulps xmm2, [rsp + nb334_dzH2H2] ;# update forces H1 - j water movaps xmm3, [rsp + nb334_fjxO] movaps xmm4, [rsp + nb334_fjyO] movaps xmm5, [rsp + nb334_fjzO] addps xmm3, xmm0 addps xmm4, xmm1 addps xmm5, xmm2 movaps [rsp + nb334_fjxO], xmm3 movaps [rsp + nb334_fjyO], xmm4 movaps [rsp + nb334_fjzO], xmm5 addps xmm0, [rsp + nb334_fixH2] addps xmm1, [rsp + nb334_fiyH2] addps xmm2, [rsp + nb334_fizH2] movaps [rsp + nb334_fixH2], xmm0 movaps [rsp + nb334_fiyH2], xmm1 movaps [rsp + nb334_fizH2], xmm2 ;# do table for i M - j water interaction movaps xmm0, [rsp + nb334_rinvMM] movaps xmm1, xmm0 mulps xmm1, [rsp + nb334_rsqMM] ;# xmm0=rinv, xmm1=r mulps xmm1, [rsp + nb334_tsc] movhlps xmm2, xmm1 cvttps2pi mm6, xmm1 cvttps2pi mm7, xmm2 ;# mm6/mm7 contain lu indices cvtpi2ps xmm3, mm6 cvtpi2ps xmm2, mm7 movlhps xmm3, xmm2 subps xmm1, xmm3 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 pslld mm7, 2 psrlq mm6, 32 movd ebx, mm6 movd ecx, mm7 psrlq mm7, 32 movd edx, mm7 ;# table indices in ebx,ecx,e
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?