nb_kernel430_ia32_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,411 行 · 第 1/5 页
S
2,411 行
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 mulps xmm7, [esp + nb430_two] ;# two*Heps2 movaps xmm3, [esp + nb430_qq] 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 ;# get jnr from stack mov eax, [esp + nb430_jnra] mov ebx, [esp + nb430_jnrb] mov ecx, [esp + nb430_jnrc] mov edx, [esp + nb430_jnrd] mov esi, [ebp + nb430_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulps xmm3, [esp + nb430_gbscale] movaps xmm6, xmm3 mulps xmm6, [esp + nb430_r] addps xmm6, xmm5 addps xmm5, [esp + nb430_vctot] movaps [esp + nb430_vctot], xmm5 ;# xmm6=(vcoul+fijC*r) subps xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addps xmm7, [esp + nb430_dvdasum] movaps [esp + nb430_dvdasum], xmm7 ;# update j atoms dvdaj movhlps xmm7, xmm6 movaps xmm5, xmm6 movaps xmm4, xmm7 shufps xmm5, xmm5, 0x1 shufps xmm4, xmm4, 0x1 ;# xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4 addss xmm6, [esi + eax*4] addss xmm5, [esi + ebx*4] addss xmm7, [esi + ecx*4] addss xmm4, [esi + edx*4] movss [esi + eax*4], xmm6 movss [esi + ebx*4], xmm5 movss [esi + ecx*4], xmm7 movss [esi + edx*4], xmm4 ;# put scalar force on stack temporarily movaps [esp + nb430_fscal], xmm3 movaps xmm4, [esp + nb430_r] mulps xmm4, [esp + nb430_tsc] 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, 3 pslld mm7, 3 mov esi, [ebp + nb430_VFtab] movd eax, mm6 psrlq mm6, 32 movd ecx, mm7 psrlq mm7, 32 movd ebx, mm6 movd edx, mm7 ;# dispersion movaps xmm4, [esi + eax*4] movaps xmm5, [esi + ebx*4] movaps xmm6, [esi + ecx*4] movaps xmm7, [esi + edx*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 ;# dispersion 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 + nb430_two] ;# two*Heps2 addps xmm7, xmm6 addps xmm7, xmm5 ;# xmm7=FF mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV movaps xmm4, [esp + nb430_c6] mulps xmm7, xmm4 ;# fijD mulps xmm5, xmm4 ;# Vvdw6 mulps xmm7, [esp + nb430_tsc] addps xmm7, [esp + nb430_fscal] ;# add to fscal ;# put scalar force on stack Update Vvdwtot directly addps xmm5, [esp + nb430_Vvdwtot] movaps [esp + nb430_fscal], xmm7 movaps [esp + nb430_Vvdwtot], xmm5 ;# repulsion movaps xmm4, [esi + eax*4 + 16] movaps xmm5, [esi + ebx*4 + 16] movaps xmm6, [esi + ecx*4 + 16] movaps xmm7, [esi + edx*4 + 16] ;# 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 ;# 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 + nb430_two] ;# two*Heps2 addps xmm7, xmm6 addps xmm7, xmm5 ;# xmm7=FF mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV movaps xmm4, [esp + nb430_c12] mulps xmm7, xmm4 ;# fijR mulps xmm5, xmm4 ;# Vvdw12 mulps xmm7, [esp + nb430_tsc] addps xmm7, [esp + nb430_fscal] addps xmm5, [esp + nb430_Vvdwtot] movaps [esp + nb430_Vvdwtot], xmm5 xorps xmm4, xmm4 mulps xmm7, xmm0 subps xmm4, xmm7 movaps xmm0, [esp + nb430_dx] movaps xmm1, [esp + nb430_dy] movaps xmm2, [esp + nb430_dz] movd eax, mm0 movd ebx, mm1 movd ecx, mm2 movd edx, mm3 mov edi, [ebp + nb430_faction] mulps xmm0, xmm4 mulps xmm1, xmm4 mulps xmm2, xmm4 ;# xmm0-xmm2 contains tx-tz (partial force) ;# now update f_i movaps xmm3, [esp + nb430_fix] movaps xmm4, [esp + nb430_fiy] movaps xmm5, [esp + nb430_fiz] addps xmm3, xmm0 addps xmm4, xmm1 addps xmm5, xmm2 movaps [esp + nb430_fix], xmm3 movaps [esp + nb430_fiy], xmm4 movaps [esp + nb430_fiz], xmm5 ;# the fj's - start by accumulating x & y forces from memory movlps xmm4, [edi + eax*4] movlps xmm6, [edi + ecx*4] movhps xmm4, [edi + ebx*4] movhps xmm6, [edi + edx*4] movaps xmm3, xmm4 shufps xmm3, xmm6, 136 ;# constant 10001000 shufps xmm4, xmm6, 221 ;# constant 11011101 ;# now xmm3-xmm5 contains fjx, fjy, fjz subps xmm3, xmm0 subps xmm4, xmm1 ;# unpack them back so we can store them - first x & y in xmm3/xmm4 movaps xmm6, xmm3 unpcklps xmm6, xmm4 unpckhps xmm3, xmm4 ;# xmm6(l)=x & y for j1, (h) for j2 ;# xmm3(l)=x & y for j3, (h) for j4 movlps [edi + eax*4], xmm6 movlps [edi + ecx*4], xmm3 movhps [edi + ebx*4], xmm6 movhps [edi + edx*4], xmm3 ;# and the z forces movss xmm4, [edi + eax*4 + 8] movss xmm5, [edi + ebx*4 + 8] movss xmm6, [edi + ecx*4 + 8] movss xmm7, [edi + edx*4 + 8] subss xmm4, xmm2 shufps xmm2, xmm2, 229 ;# constant 11100101 subss xmm5, xmm2 shufps xmm2, xmm2, 234 ;# constant 11101010 subss xmm6, xmm2 shufps xmm2, xmm2, 255 ;# constant 11111111 subss xmm7, xmm2 movss [edi + eax*4 + 8], xmm4 movss [edi + ebx*4 + 8], xmm5 movss [edi + ecx*4 + 8], xmm6 movss [edi + edx*4 + 8], xmm7 ;# should we do one more iteration? sub dword ptr [esp + nb430_innerk], 4 jl .nb430_finish_inner jmp .nb430_unroll_loop.nb430_finish_inner: ;# check if at least two particles remain add dword ptr [esp + nb430_innerk], 4 mov edx, [esp + nb430_innerk] and edx, 2 jnz .nb430_dopair jmp .nb430_checksingle.nb430_dopair: mov ecx, [esp + nb430_innerjjnr] mov eax, [ecx] mov ebx, [ecx + 4] add dword ptr [esp + nb430_innerjjnr], 8 xorps xmm2, xmm2 movaps xmm6, xmm2 ;# load isaj mov esi, [ebp + nb430_invsqrta] movss xmm2, [esi + eax*4] movss xmm3, [esi + ebx*4] unpcklps xmm2, xmm3 ;# isaj in xmm3(0,1) mulps xmm2, [esp + nb430_isai] movaps [esp + nb430_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [esp + nb430_gbtsc] movaps [esp + nb430_gbscale], xmm1 mov esi, [ebp + nb430_charge] ;# base of charge[] movss xmm3, [esi + eax*4] movss xmm6, [esi + ebx*4] unpcklps xmm3, xmm6 ;# constant 00001000 ;# xmm3(0,1) has the charges mulps xmm2, [esp + nb430_iq] mulps xmm3, xmm2 movaps [esp + nb430_qq], xmm3 mov esi, [ebp + nb430_type] mov ecx, eax mov edx, ebx mov ecx, [esi + ecx*4] mov edx, [esi + edx*4] mov esi, [ebp + nb430_vdwparam] shl ecx, 1 shl edx, 1 mov edi, [esp + nb430_ntia] add ecx, edi add edx, edi movlps xmm6, [esi + ecx*4] movhps xmm6, [esi + edx*4] mov edi, [ebp + nb430_pos] movaps xmm4, xmm6 shufps xmm4, xmm4, 8 ;# constant 00001000 shufps xmm6, xmm6, 13 ;# constant 00001101 movlhps xmm4, xmm7 movlhps xmm6, xmm7 movaps [esp + nb430_c6], xmm4 movaps [esp + nb430_c12], xmm6 movd mm0, eax ;# copy jnr to mm0/mm1 movd mm1, ebx lea eax, [eax + eax*2] lea ebx, [ebx + ebx*2] ;# move coordinates to xmm0-xmm2 movlps xmm1, [edi + eax*4] movss xmm2, [edi + eax*4 + 8] movhps xmm1, [edi + ebx*4] movss xmm0, [edi + ebx*4 + 8] movlhps xmm3, xmm7 shufps xmm2, xmm0, 0 movaps xmm0, xmm1 shufps xmm2, xmm2, 136 ;# constant 10001000 shufps xmm0, xmm0, 136 ;# constant 10001000 shufps xmm1, xmm1, 221 ;# constant 11011101 mov edi, [ebp + nb430_faction] ;# move ix-iz to xmm4-xmm6 xorps xmm7, xmm7 movaps xmm4, [esp + nb430_ix] movaps xmm5, [esp + nb430_iy] movaps xmm6, [esp + nb430_iz] ;# calc dr subps xmm4, xmm0 subps xmm5, xmm1 subps xmm6, xmm2 ;# store dr movaps [esp + nb430_dx], xmm4 movaps [esp + nb430_dy], xmm5 movaps [esp + nb430_dz], xmm6 ;# 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, [esp + nb430_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [esp + nb430_half] subps xmm1, xmm5 ;# constant 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r movaps [esp + nb430_r], xmm4 mulps xmm4, [esp + nb430_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 esi, [ebp + nb430_GBtab] movd ecx, mm6 psrlq mm6, 32 movd edx, mm6 ;# load coulomb table movaps xmm4, [esi + ecx*4] movaps xmm7, [esi + edx*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 mulps xmm7, [esp + nb430_two] ;# two*Heps2 movaps xmm3, [esp + nb430_qq] 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 ;# get jnr from mm0/mm1 movd ecx, mm0 movd edx, mm1 mov esi, [ebp + nb430_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulps xmm3, [esp + nb430_gbscale] movaps xmm6, xmm3 mulps xmm6, [esp + nb430_r] addps xmm6, xmm5 addps xmm5, [esp + nb430_vctot] movaps [esp + nb430_vctot], xmm5 ;# xmm6=(vcoul+fijC*r) subps xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addps xmm7, [esp + nb430_dvdasum] movaps [esp + nb430_dvdasum], xmm7 ;# update j atoms dvdaj movaps xmm7, xmm6 shufps xmm7, xmm7, 0x1 addss xmm6, [esi + ecx*4] addss xmm7, [esi + edx*4] movss [esi + ecx*4], xmm6 movss [esi + edx*4], xmm7 ;# put scalar force on stack temporarily movaps [esp + nb430_fscal], xmm3 movaps xmm4, [esp + nb430_r] mulps xmm4, [esp + nb430_tsc] cvttps2pi mm6, xmm4 cvtpi2ps xmm6, mm6 subps xmm4, xmm6 movaps xmm1, xmm4 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 3 mov esi, [ebp + nb430_VFtab] movd ecx, mm6 psrlq mm6, 32 movd edx, mm6 ;# dispersion movaps xmm4, [esi + ecx*4] movaps xmm7, [esi + edx*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 ;# dispersion 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 + nb430_two] ;# two*Heps2 addps xmm7, xmm6 addps xmm7, xmm5 ;# xmm7=FF mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV movaps xmm4, [esp + nb430_c6] mulps xmm7, xmm4 ;# fijD mulps xmm5, xmm4 ;# Vvdw6 mulps xmm7, [esp + nb430_tsc] addps xmm7, [esp + nb430_fscal] ;# add to fscal
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?