nb_kernel234_ia32_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,176 行 · 第 1/5 页
S
2,176 行
movaps xmm1, [esp + nb234_fjzH1] movaps xmm2, [esp + nb234_fjxH2] movaps xmm3, [esp + nb234_fjyH2] movaps xmm4, xmm0 movaps xmm5, xmm1 unpcklps xmm4, xmm2 unpcklps xmm5, xmm3 unpckhps xmm0, xmm2 unpckhps xmm1, xmm3 movaps xmm2, xmm4 movaps xmm3, xmm0 unpcklps xmm4, xmm5 unpckhps xmm2, xmm5 unpcklps xmm0, xmm1 unpckhps xmm3, xmm1 ;# results are now in xmm4, xmm2, xmm0, xmm3 ;# load the corresponding j forces from memory movlps xmm1, [edi + eax*4 + 16] movlps xmm5, [edi + ebx*4 + 16] movlps xmm6, [edi + ecx*4 + 16] movlps xmm7, [edi + edx*4 + 16] movhps xmm1, [edi + eax*4 + 24] movhps xmm5, [edi + ebx*4 + 24] movhps xmm6, [edi + ecx*4 + 24] movhps xmm7, [edi + edx*4 + 24] ;# add addps xmm1, xmm4 addps xmm5, xmm2 addps xmm6, xmm0 addps xmm7, xmm3 ;# store back movlps [edi + eax*4 + 16], xmm1 movlps [edi + ebx*4 + 16], xmm5 movlps [edi + ecx*4 + 16], xmm6 movlps [edi + edx*4 + 16], xmm7 movhps [edi + eax*4 + 24], xmm1 movhps [edi + ebx*4 + 24], xmm5 movhps [edi + ecx*4 + 24], xmm6 movhps [edi + edx*4 + 24], xmm7 ;# step 3 : transpose fjzH2, fjxM, fjyM, fjzM. xmm4 is scratch movaps xmm0, [esp + nb234_fjzH2] movaps xmm1, [esp + nb234_fjxM] movaps xmm2, [esp + nb234_fjyM] movaps xmm3, [esp + nb234_fjzM] movaps xmm4, xmm0 movaps xmm5, xmm1 unpcklps xmm4, xmm2 unpcklps xmm5, xmm3 unpckhps xmm0, xmm2 unpckhps xmm1, xmm3 movaps xmm2, xmm4 movaps xmm3, xmm0 unpcklps xmm4, xmm5 unpckhps xmm2, xmm5 unpcklps xmm0, xmm1 unpckhps xmm3, xmm1 ;# results are now in xmm0, xmm1, xmm2, xmm3 ;# load the corresponding j forces from memory movlps xmm1, [edi + eax*4 + 32] movlps xmm5, [edi + ebx*4 + 32] movlps xmm6, [edi + ecx*4 + 32] movlps xmm7, [edi + edx*4 + 32] movhps xmm1, [edi + eax*4 + 40] movhps xmm5, [edi + ebx*4 + 40] movhps xmm6, [edi + ecx*4 + 40] movhps xmm7, [edi + edx*4 + 40] ;# add addps xmm1, xmm4 addps xmm5, xmm2 addps xmm6, xmm0 addps xmm7, xmm3 ;# store back movlps [edi + eax*4 + 32], xmm1 movlps [edi + ebx*4 + 32], xmm5 movlps [edi + ecx*4 + 32], xmm6 movlps [edi + edx*4 + 32], xmm7 movhps [edi + eax*4 + 40], xmm1 movhps [edi + ebx*4 + 40], xmm5 movhps [edi + ecx*4 + 40], xmm6 movhps [edi + edx*4 + 40], xmm7 ;# should we do one more iteration? sub dword ptr [esp + nb234_innerk], 4 jl .nb234_single_check jmp .nb234_unroll_loop.nb234_single_check: add dword ptr [esp + nb234_innerk], 4 jnz .nb234_single_loop jmp .nb234_updateouterdata.nb234_single_loop: mov edx, [esp + nb234_innerjjnr] ;# pointer to jjnr[k] mov eax, [edx] add dword ptr [esp + nb234_innerjjnr], 4 mov esi, [ebp + nb234_pos] lea eax, [eax + eax*2] ;# fetch j coordinates movlps xmm3, [esi + eax*4] ;# Ox Oy movlps xmm4, [esi + eax*4 + 16] ;# H1y H1z movlps xmm5, [esi + eax*4 + 32] ;# H2z Mx movhps xmm3, [esi + eax*4 + 8] ;# Ox Oy Oz H1x movhps xmm4, [esi + eax*4 + 24] ;# H1y H1z H2x H2y movhps xmm5, [esi + eax*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 [esp + nb234_jxO], xmm6 movaps [esp + nb234_jyO], xmm3 movaps [esp + nb234_jzO], xmm1 ;# do O and M in parallel movaps xmm0, [esp + nb234_ixO] movaps xmm1, [esp + nb234_iyO] movaps xmm2, [esp + nb234_izO] movaps xmm3, [esp + nb234_ixM] movaps xmm4, [esp + nb234_iyM] movaps xmm5, [esp + nb234_izM] subps xmm0, [esp + nb234_jxO] subps xmm1, [esp + nb234_jyO] subps xmm2, [esp + nb234_jzO] subps xmm3, [esp + nb234_jxO] subps xmm4, [esp + nb234_jyO] subps xmm5, [esp + nb234_jzO] movaps [esp + nb234_dxOO], xmm0 movaps [esp + nb234_dyOO], xmm1 movaps [esp + nb234_dzOO], xmm2 movaps [esp + nb234_dxMM], xmm3 movaps [esp + nb234_dyMM], xmm4 movaps [esp + nb234_dzMM], 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 ;# Save data movaps [esp + nb234_rsqOO], xmm0 movaps [esp + nb234_rsqMM], xmm4 ;# do 1/x for O rsqrtps xmm1, xmm0 movaps xmm2, xmm1 mulps xmm1, xmm1 movaps xmm3, [esp + nb234_three] mulps xmm1, xmm0 ;# rsq*lu*lu subps xmm3, xmm1 ;# constant 30-rsq*lu*lu mulps xmm3, xmm2 ;# lu*(3-rsq*lu*lu) mulps xmm3, [esp + nb234_half] movaps [esp + nb234_rinvOO], xmm3 ;# rinvH2 ;# 1/sqrt(x) for M rsqrtps xmm5, xmm4 movaps xmm6, xmm5 mulps xmm5, xmm5 movaps xmm7, [esp + nb234_three] mulps xmm5, xmm4 subps xmm7, xmm5 mulps xmm7, xmm6 mulps xmm7, [esp + nb234_half] ;# rinv iH1 - j water movaps [esp + nb234_rinvMM], xmm7 ;# LJ table interaction movaps xmm0, [esp + nb234_rinvOO] movss xmm1, xmm0 mulss xmm1, [esp + nb234_rsqOO] ;# xmm1=r mulss xmm1, [esp + nb234_tsc] cvttps2pi mm6, xmm1 cvtpi2ps xmm3, mm6 subss xmm1, xmm3 ;# xmm1=eps movss xmm2, xmm1 mulss xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 3 movd mm0, eax mov esi, [ebp + nb234_VFtab] movd eax, mm6 ;# dispersion movlps xmm5, [esi + eax*4] movaps xmm4, xmm5 shufps xmm4, xmm7, 136 ;# constant 10001000 shufps xmm5, xmm7, 221 ;# constant 11011101 movlps xmm7, [esi + eax*4 + 8] movaps xmm6, xmm7 shufps xmm6, xmm3, 136 ;# constant 10001000 shufps xmm7, xmm3, 221 ;# constant 11011101 ;# dispersion table ready, in xmm4-xmm7 mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm2 ;# xmm7=Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp mulss xmm7, [esp + nb234_two] ;# two*Heps2 addss xmm7, xmm6 addss xmm7, xmm5 ;# xmm7=FF mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV movss xmm4, [esp + nb234_c6] mulss xmm7, xmm4 ;# fijD mulss xmm5, xmm4 ;# Vvdw6 xorps xmm3, xmm3 mulps xmm7, [esp + nb234_tsc] subss xmm3, xmm7 movss [esp + nb234_fstmp], xmm3 addss xmm5, [esp + nb234_Vvdwtot] movss [esp + nb234_Vvdwtot], xmm5 ;# repulsion movlps xmm5, [esi + eax*4 + 16] movaps xmm4, xmm5 shufps xmm4, xmm7, 136 ;# constant 10001000 shufps xmm5, xmm7, 221 ;# constant 11011101 movlps xmm7, [esi + eax*4 + 24] movaps xmm6, xmm7 shufps xmm6, xmm3, 136 ;# constant 10001000 shufps xmm7, xmm3, 221 ;# constant 11011101 ;# table ready, in xmm4-xmm7 mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm2 ;# xmm7=Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp mulss xmm7, [esp + nb234_two] ;# two*Heps2 addss xmm7, xmm6 addss xmm7, xmm5 ;# xmm7=FF mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV movss xmm4, [esp + nb234_c12] mulss xmm7, xmm4 ;# fijR mulss xmm5, xmm4 ;# Vvdw12 movaps xmm3, [esp + nb234_fstmp] mulss xmm7, [esp + nb234_tsc] subss xmm3, xmm7 addss xmm5, [esp + nb234_Vvdwtot] movss [esp + nb234_Vvdwtot], xmm5 mulss xmm0, xmm3 movaps xmm1, xmm0 movaps xmm2, xmm0 movd eax, mm0 mulss xmm0, [esp + nb234_dxOO] mulss xmm1, [esp + nb234_dyOO] mulss xmm2, [esp + nb234_dzOO] xorps xmm3, xmm3 xorps xmm4, xmm4 xorps xmm5, xmm5 subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movaps [esp + nb234_fjxO], xmm3 movaps [esp + nb234_fjyO], xmm4 movaps [esp + nb234_fjzO], xmm5 addss xmm0, [esp + nb234_fixO] addss xmm1, [esp + nb234_fiyO] addss xmm2, [esp + nb234_fizO] movss [esp + nb234_fixO], xmm0 movss [esp + nb234_fiyO], xmm1 movss [esp + nb234_fizO], xmm2 ;# do M coulomb interaction movaps xmm0, [esp + nb234_rinvMM] movaps xmm7, xmm0 ;# xmm7=rinv movaps xmm5, [esp + nb234_krf] mulps xmm0, xmm0 ;# xmm0=rinvsq ;# fetch charges to xmm3 (temporary) xorps xmm3, xmm3 movss xmm3, [esp + nb234_qqMH] movhps xmm3, [esp + nb234_qqMM] shufps xmm3, xmm3, 193 ;# constant 11000001 mulps xmm5, [esp + nb234_rsqMM] ;# xmm5=krsq movaps xmm6, xmm5 addps xmm6, xmm7 ;# xmm6=rinv+ krsq subps xmm6, [esp + nb234_crf] mulps xmm6, xmm3 ;# xmm6=voul=qq*(rinv+ krsq-crf) mulps xmm5, [esp + nb234_two] subps xmm7, xmm5 ;# xmm7=rinv-2*krsq mulps xmm7, xmm3 ;# xmm7 = coul part of fscal addps xmm6, [esp + nb234_vctot] movaps [esp + nb234_vctot], xmm6 mulps xmm0, xmm7 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [esp + nb234_dxMM] mulps xmm1, [esp + nb234_dyMM] mulps xmm2, [esp + nb234_dzMM] ;# update forces M - j water movaps xmm3, [esp + nb234_fjxO] movaps xmm4, [esp + nb234_fjyO] movaps xmm5, [esp + nb234_fjzO] subps xmm3, xmm0 subps xmm4, xmm1 subps xmm5, xmm2 movaps [esp + nb234_fjxO], xmm3 movaps [esp + nb234_fjyO], xmm4 movaps [esp + nb234_fjzO], xmm5 addps xmm0, [esp + nb234_fixM] addps xmm1, [esp + nb234_fiyM] addps xmm2, [esp + nb234_fizM] movaps [esp + nb234_fixM], xmm0 movaps [esp + nb234_fiyM], xmm1 movaps [esp + nb234_fizM], xmm2 ;# i H1 & H2 simultaneously first get i particle coords: movaps xmm0, [esp + nb234_ixH1] movaps xmm1, [esp + nb234_iyH1] movaps xmm2, [esp + nb234_izH1] movaps xmm3, [esp + nb234_ixH2] movaps xmm4, [esp + nb234_iyH2] movaps xmm5, [esp + nb234_izH2] subps xmm0, [esp + nb234_jxO] subps xmm1, [esp + nb234_jyO] subps xmm2, [esp + nb234_jzO] subps xmm3, [esp + nb234_jxO] subps xmm4, [esp + nb234_jyO] subps xmm5, [esp + nb234_jzO] movaps [esp + nb234_dxH1H1], xmm0 movaps [esp + nb234_dyH1H1], xmm1 movaps [esp + nb234_dzH1H1], xmm2 movaps [esp + nb234_dxH2H2], xmm3 movaps [esp + nb234_dyH2H2], xmm4 movaps [esp + nb234_dzH2H2], 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 rsqH1 in xmm0 addps xmm4, xmm5 ;# have rsqH2 in xmm4 movaps [esp + nb234_rsqH1H1], xmm0 movaps [esp + nb234_rsqH2H2], xmm4 ;# start doing invsqrt use rsq values in xmm0, xmm4 rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [esp + nb234_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 + nb234_half] ;# rinvH1H1 mulps xmm7, [esp + nb234_half] ;# rinvH2H2 movaps [esp + nb234_rinvH1H1], xmm3 movaps [esp + nb234_rinvH2H2], xmm7 ;# Do H1 coulomb interaction movaps xmm0, [esp + nb234_rinvH1H1] movaps xmm7, xmm0 ;# xmm7=rinv movaps xmm5, [esp + nb234_krf] mulps xmm0, xmm0 ;# xmm0=rinvsq ;# fetch charges to xmm3 (temporary) xorps xmm3, xmm3 movss xmm3, [esp + nb234_qqHH] movhps xmm3, [esp + nb234_qqMH] shufps xmm3, xmm3, 193 ;# constant 11000001 mulps xmm5, [esp + nb234_rsqH1H1] ;# xmm5=krsq movaps xmm6, xmm5 addps xmm6, xmm7 ;# xmm6=rinv+ krsq subps xmm6, [esp + nb234_crf] mulps xmm6, xmm3 ;# xmm6=voul=qq*(rinv+ krsq-crf) mulps xmm5, [esp + nb234_two] subps xmm7, xmm5 ;# xmm7=rinv-2*krsq mulps xmm7, xmm3 ;# xmm7 = coul part of fscal addps xmm6, [esp + nb234_vctot] movaps [esp + nb234_vctot], xmm6 mulps xmm0, xmm7 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [esp + nb234_dxH1H1] mulps xmm1, [esp + nb234_dyH1H1] mulps xmm2, [esp + nb234_dzH1H1] ;# update forces H1 - j water movaps xmm3, [esp + nb234_fjxO] movaps xmm4, [esp + nb234_fjyO] movaps xmm5, [esp + nb234_fjzO] subps xmm3, xmm0 subps xmm4, xmm1 subps xmm5, xmm2 movaps [esp + nb234_fjxO], xmm3 movaps [esp + nb234_fjyO], xmm4 movaps [esp + nb234_fjzO], xmm5 addps xmm0, [esp + nb234_fixH1]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?