nb_kernel314_ia32_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,300 行 · 第 1/5 页
S
2,300 行
subss xmm2, xmm1 mulss xmm0, xmm2 ;# fscal movss xmm1, xmm0 movss xmm2, xmm0 mulss xmm0, [esp + nb314_dxOO] mulss xmm1, [esp + nb314_dyOO] mulss xmm2, [esp + nb314_dzOO] xorps xmm3, xmm3 xorps xmm4, xmm4 xorps xmm5, xmm5 subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movaps [esp + nb314_fjxO], xmm3 movaps [esp + nb314_fjyO], xmm4 movaps [esp + nb314_fjzO], xmm5 addss xmm0, [esp + nb314_fixO] addss xmm1, [esp + nb314_fiyO] addss xmm2, [esp + nb314_fizO] movss [esp + nb314_fixO], xmm0 movss [esp + nb314_fiyO], xmm1 movss [esp + nb314_fizO], xmm2 ;# do H1 coulomb interaction movaps xmm0, [esp + nb314_rinvH1H1] ;# rinv movaps xmm1, xmm0 mulps xmm1, [esp + nb314_rsqH1H1] ;# r mulps xmm1, [esp + nb314_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 mov esi, [ebp + nb314_VFtab] movlps xmm4, [esi + ebx*4] movlps xmm3, [esi + ecx*4] movlps xmm7, [esi + edx*4] movhps xmm4, [esi + ebx*4 + 8] movhps xmm3, [esi + ecx*4 + 8] movhps xmm7, [esi + edx*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, [esp + nb314_two] ;# two*Heps2 ;# fetch charges to xmm3 (temporary) xorps xmm3, xmm3 movss xmm3, [esp + nb314_qqHH] movhps xmm3, [esp + nb314_qqMH] shufps xmm3, xmm3, 193 ;# constant 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, [esp + nb314_vctot] movaps [esp + nb314_vctot], xmm5 mulps xmm3, [esp + nb314_tsc] xorps xmm2, xmm2 subps xmm2, xmm3 mulps xmm0, xmm2 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [esp + nb314_dxH1H1] mulps xmm1, [esp + nb314_dyH1H1] mulps xmm2, [esp + nb314_dzH1H1] ;# update forces H1 - j water movaps xmm3, [esp + nb314_fjxO] movaps xmm4, [esp + nb314_fjyO] movaps xmm5, [esp + nb314_fjzO] subps xmm3, xmm0 subps xmm4, xmm1 subps xmm5, xmm2 movaps [esp + nb314_fjxO], xmm3 movaps [esp + nb314_fjyO], xmm4 movaps [esp + nb314_fjzO], xmm5 addps xmm0, [esp + nb314_fixH1] addps xmm1, [esp + nb314_fiyH1] addps xmm2, [esp + nb314_fizH1] movaps [esp + nb314_fixH1], xmm0 movaps [esp + nb314_fiyH1], xmm1 movaps [esp + nb314_fizH1], xmm2 ;# i H2 & M simultaneously first get i particle coords: movaps xmm0, [esp + nb314_ixH2] movaps xmm1, [esp + nb314_iyH2] movaps xmm2, [esp + nb314_izH2] movaps xmm3, [esp + nb314_ixM] movaps xmm4, [esp + nb314_iyM] movaps xmm5, [esp + nb314_izM] subps xmm0, [esp + nb314_jxO] subps xmm1, [esp + nb314_jyO] subps xmm2, [esp + nb314_jzO] subps xmm3, [esp + nb314_jxO] subps xmm4, [esp + nb314_jyO] subps xmm5, [esp + nb314_jzO] movaps [esp + nb314_dxH2H2], xmm0 movaps [esp + nb314_dyH2H2], xmm1 movaps [esp + nb314_dzH2H2], xmm2 movaps [esp + nb314_dxMM], xmm3 movaps [esp + nb314_dyMM], xmm4 movaps [esp + nb314_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 [esp + nb314_rsqH2H2], xmm0 movaps [esp + nb314_rsqMM], xmm4 ;# do invsqrt rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [esp + nb314_three] movaps xmm7, xmm3 mulps xmm1, xmm0 mulps xmm5, xmm4 subps xmm3, xmm1 subps xmm7, xmm5 mulps xmm3, xmm2 mulps xmm7, xmm6 mulps xmm3, [esp + nb314_half] ;# rinv H2 - j water mulps xmm7, [esp + nb314_half] ;# rinv M - j water movaps [esp + nb314_rinvH2H2], xmm3 movaps [esp + nb314_rinvMM], xmm7 movaps xmm1, xmm3 mulps xmm1, [esp + nb314_rsqH2H2] ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [esp + nb314_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 movlps xmm4, [esi + ebx*4] movlps xmm3, [esi + ecx*4] movlps xmm7, [esi + edx*4] movhps xmm4, [esi + ebx*4 + 8] movhps xmm3, [esi + ecx*4 + 8] movhps xmm7, [esi + edx*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, [esp + nb314_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [esp + nb314_qqHH] movhps xmm3, [esp + nb314_qqMH] shufps xmm3, xmm3, 193 ;# constant 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, [esp + nb314_vctot] movaps [esp + nb314_vctot], xmm5 xorps xmm1, xmm1 mulps xmm3, [esp + nb314_tsc] mulps xmm3, xmm0 subps xmm1, xmm3 movaps xmm0, xmm1 movaps xmm2, xmm1 mulps xmm0, [esp + nb314_dxH2H2] mulps xmm1, [esp + nb314_dyH2H2] mulps xmm2, [esp + nb314_dzH2H2] ;# update forces H1 - j water movaps xmm3, [esp + nb314_fjxO] movaps xmm4, [esp + nb314_fjyO] movaps xmm5, [esp + nb314_fjzO] subps xmm3, xmm0 subps xmm4, xmm1 subps xmm5, xmm2 movaps [esp + nb314_fjxO], xmm3 movaps [esp + nb314_fjyO], xmm4 movaps [esp + nb314_fjzO], xmm5 addps xmm0, [esp + nb314_fixH2] addps xmm1, [esp + nb314_fiyH2] addps xmm2, [esp + nb314_fizH2] movaps [esp + nb314_fixH2], xmm0 movaps [esp + nb314_fiyH2], xmm1 movaps [esp + nb314_fizH2], xmm2 ;# do table for i M - j water interaction movaps xmm0, [esp + nb314_rinvMM] movaps xmm1, xmm0 mulps xmm1, [esp + nb314_rsqMM] ;# xmm0=rinv, xmm1=r mulps xmm1, [esp + nb314_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 movlps xmm4, [esi + ebx*4] movlps xmm3, [esi + ecx*4] movlps xmm7, [esi + edx*4] movhps xmm4, [esi + ebx*4 + 8] movhps xmm3, [esi + ecx*4 + 8] movhps xmm7, [esi + edx*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, [esp + nb314_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [esp + nb314_qqMH] movhps xmm3, [esp + nb314_qqMM] shufps xmm3, xmm3, 193 ;# constant 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, [esp + nb314_vctot] movaps [esp + nb314_vctot], xmm5 xorps xmm1, xmm1 mulps xmm3, [esp + nb314_tsc] mulps xmm3, xmm0 subps xmm1, xmm3 movaps xmm0, xmm1 movaps xmm2, xmm1 mulps xmm0, [esp + nb314_dxMM] mulps xmm1, [esp + nb314_dyMM] mulps xmm2, [esp + nb314_dzMM] movaps xmm3, [esp + nb314_fjxO] movaps xmm4, [esp + nb314_fjyO] movaps xmm5, [esp + nb314_fjzO] subps xmm3, xmm0 subps xmm4, xmm1 subps xmm5, xmm2 mov esi, [ebp + nb314_faction] movaps [esp + nb314_fjxO], xmm3 movaps [esp + nb314_fjyO], xmm4 movaps [esp + nb314_fjzO], xmm5 addps xmm0, [esp + nb314_fixM] addps xmm1, [esp + nb314_fiyM] addps xmm2, [esp + nb314_fizM] movaps [esp + nb314_fixM], xmm0 movaps [esp + nb314_fiyM], xmm1 movaps [esp + nb314_fizM], xmm2 ;# update j water forces from local variables. ;# transpose back first movaps xmm0, [esp + nb314_fjxO] ;# Ox H1x H2x Mx movaps xmm1, [esp + nb314_fjyO] ;# Oy H1y H2y My movaps xmm2, [esp + nb314_fjzO] ;# Oz H1z H2z Mz movaps xmm3, xmm0 movaps xmm4, xmm0 unpcklps xmm3, xmm1 ;# Ox Oy - - shufps xmm4, xmm2, 0x1 ;# h1x - Oz - movaps xmm5, xmm1 movaps xmm6, xmm0 unpcklps xmm5, xmm2 ;# - - H1y H1z unpckhps xmm6, xmm1 ;# h2x h2y - - unpckhps xmm1, xmm2 ;# - - My Mz shufps xmm2, xmm0, 0x32 ;# (00110010) h2z - Mx - shufps xmm3, xmm4, 36 ;# constant 00100100 ;# Ox Oy Oz H1x shufps xmm5, xmm6, 78 ;# constant 01001110 ;# h1y h1z h2x h2y shufps xmm2, xmm1, 232 ;# constant 11101000 ;# h2z mx my mz movlps xmm0, [esi + eax*4] movlps xmm1, [esi + eax*4 + 16] movlps xmm4, [esi + eax*4 + 32] movhps xmm0, [esi + eax*4 + 8] movhps xmm1, [esi + eax*4 + 24] movhps xmm4, [esi + eax*4 + 40] addps xmm0, xmm3 addps xmm1, xmm5 addps xmm4, xmm2 movlps [esi + eax*4], xmm0 movlps [esi + eax*4 + 16], xmm1 movlps [esi + eax*4 + 32], xmm4 movhps [esi + eax*4 + 8], xmm0 movhps [esi + eax*4 + 24], xmm1 movhps [esi + eax*4 + 40], xmm4 dec dword ptr [esp + nb314_innerk] jz .nb314_updateouterdata jmp .nb314_single_loop.nb314_updateouterdata: mov ecx, [esp + nb314_ii3] mov edi, [ebp + nb314_faction] mov esi, [ebp + nb314_fshift] mov edx, [esp + nb314_is3] ;# accumulate Oi forces in xmm0, xmm1, xmm2 movaps xmm0, [esp + nb314_fixO] movaps xmm1, [esp + nb314_fiyO] movaps xmm2, [esp + nb314_fizO] movhlps xmm3, xmm0 movhlps xmm4, xmm1 movhlps xmm5, xmm2 addps xmm0, xmm3 addps xmm1, xmm4 addps xmm2, xmm5 ;# sum is in 1/2 in xmm0-xmm2 movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 shufps xmm3, xmm3, 1 shufps xmm4, xmm4, 1 shufps xmm5, xmm5, 1 addss xmm0, xmm3 addss xmm1, xmm4 addss xmm2, xmm5 ;# xmm0-xmm2 has single force in pos0 ;# increment i force movss xmm3, [edi + ecx*4] movss xmm4, [edi + ecx*4 + 4] movss xmm5, [edi + ecx*4 + 8] addss xmm3, xmm0 addss xmm4, xmm1 addss xmm5, xmm2 movss [edi + ecx*4], xmm3 movss [edi + ecx*4 + 4], xmm4 movss [edi + ecx*4 + 8], xmm5 ;# accumulate force in xmm6/xmm7 for fshift movaps xmm6, xmm0 movss xmm7, xmm2 movlhps xmm6, xmm1 shufps xmm6, xmm6, 8 ;# constant 00001000 ;# accumulate H1i forces in xmm0, xmm1, xmm2 movaps xmm0, [esp + nb314_fixH1] movaps xmm1, [esp + nb314_fiyH1] movaps xmm2, [esp + nb314_fizH1] movhlps xmm3, xmm0 movhlps xmm4, xmm1 movhlps xmm5, xmm2 addps xmm0, xmm3 addps xmm1, xmm4 addps xmm2, xmm5 ;# sum is in 1/2 in xmm0-xmm2 movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 shufps xmm3, xmm3, 1 shufps xmm4, xmm4, 1 shufps xmm5, xmm5, 1 ad
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?