nb_kernel304_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,305 行 · 第 1/5 页
S
2,305 行
;# table data ready in xmm0-xmm3 , xmm4-xmm7 , and xmm8-xmm11 movaps xmm12, [rsp + nb304_epsH1] movaps xmm13, [rsp + nb304_epsH2] movaps xmm14, [rsp + nb304_epsM] mulps xmm3, xmm12 ;# Heps mulps xmm7, xmm13 mulps xmm11, xmm14 mulps xmm2, xmm12 ;# Geps mulps xmm6, xmm13 mulps xmm10, xmm14 mulps xmm3, xmm12 ;# Heps2 mulps xmm7, xmm13 mulps xmm11, xmm14 addps xmm1, xmm2 ;# F+Geps addps xmm5, xmm6 addps xmm9, xmm10 addps xmm1, xmm3 ;# F+Geps+Heps2 = Fp addps xmm5, xmm7 addps xmm9, xmm11 addps xmm3, xmm3 ;# 2*Heps2 addps xmm7, xmm7 addps xmm11, xmm11 addps xmm3, xmm2 ;# 2*Heps2+Geps addps xmm7, xmm6 addps xmm11, xmm10 addps xmm3, xmm1 ;# FF = Fp + 2*Heps2 + Geps addps xmm7, xmm5 addps xmm11, xmm9 mulps xmm1, xmm12 ;# eps*Fp mulps xmm5, xmm13 mulps xmm9, xmm14 movaps xmm12, [rsp + nb304_qqMH] movaps xmm13, [rsp + nb304_qqMM] addps xmm1, xmm0 ;# VV addps xmm5, xmm4 addps xmm9, xmm8 mulps xmm1, xmm12 ;# VV*qq = vcoul mulps xmm5, xmm12 mulps xmm9, xmm13 mulps xmm3, xmm12 ;# FF*qq = fij mulps xmm7, xmm12 mulps xmm11, xmm13 ;# accumulate vctot addps xmm1, [rsp + nb304_vctot] addps xmm5, xmm9 addps xmm1, xmm5 movaps [rsp + nb304_vctot], xmm1 movaps xmm10, [rsp + nb304_tsc] mulps xmm3, xmm10 ;# fscal mulps xmm7, xmm10 mulps xmm10, xmm11 movd eax, mm0 ;# restore j3 from mm0-mm3 movd ebx, mm1 movd ecx, mm2 movd edx, mm3 ;# move j M forces to local temp variables movlps xmm11, [rdi + rax*4 + 36] ;# jxMa jyMa - - movlps xmm12, [rdi + rcx*4 + 36] ;# jxMc jyMc - - movhps xmm11, [rdi + rbx*4 + 36] ;# jxMa jyMa jxMb jyMb movhps xmm12, [rdi + rdx*4 + 36] ;# jxMc jyMc jxMd jyMd movss xmm13, [rdi + rax*4 + 44] ;# jzMa - - - movss xmm14, [rdi + rcx*4 + 44] ;# jzMc - - - movss xmm1, [rdi + rbx*4 + 44] ;# jzMb - - - movss xmm2, [rdi + rdx*4 + 44] ;# jzMd - - - movlhps xmm13, xmm1 ;# jzMa - jzMb - movlhps xmm14, xmm2 ;# jzMc - jzMd - shufps xmm13, xmm14, 136 ;# 10001000 => jzMa jzMb jzMc jzMd ;# xmm11: jxMa jyMa jxMb jyMb ;# xmm12: jxMc jyMc jxMd jyMd ;# xmm13: jzMa jzMb jzMc jzMd xorps xmm0, xmm0 xorps xmm4, xmm4 xorps xmm8, xmm8 mulps xmm3, [rsp + nb304_rinvH1M] mulps xmm7, [rsp + nb304_rinvH2M] mulps xmm10, [rsp + nb304_rinvMM] subps xmm0, xmm3 subps xmm4, xmm7 subps xmm8, xmm10 movaps xmm1, xmm0 movaps xmm2, xmm0 movaps xmm3, xmm4 movaps xmm5, xmm4 movaps xmm6, xmm8 movaps xmm7, xmm8 mulps xmm0, [rsp + nb304_dxH1M] mulps xmm1, [rsp + nb304_dyH1M] mulps xmm2, [rsp + nb304_dzH1M] mulps xmm3, [rsp + nb304_dxH2M] mulps xmm4, [rsp + nb304_dyH2M] mulps xmm5, [rsp + nb304_dzH2M] mulps xmm6, [rsp + nb304_dxMM] mulps xmm7, [rsp + nb304_dyMM] mulps xmm8, [rsp + nb304_dzMM] movaps xmm14, xmm0 movaps xmm15, xmm1 addps xmm13, xmm2 addps xmm0, [rsp + nb304_fixH1] addps xmm1, [rsp + nb304_fiyH1] addps xmm2, [rsp + nb304_fizH1] addps xmm14, xmm3 addps xmm15, xmm4 addps xmm13, xmm5 addps xmm3, [rsp + nb304_fixH2] addps xmm4, [rsp + nb304_fiyH2] addps xmm5, [rsp + nb304_fizH2] addps xmm14, xmm6 addps xmm15, xmm7 addps xmm13, xmm8 addps xmm6, [rsp + nb304_fixM] addps xmm7, [rsp + nb304_fiyM] addps xmm8, [rsp + nb304_fizM] movaps [rsp + nb304_fixH1], xmm0 movaps [rsp + nb304_fiyH1], xmm1 movaps [rsp + nb304_fizH1], xmm2 movaps [rsp + nb304_fixH2], xmm3 movaps [rsp + nb304_fiyH2], xmm4 movaps [rsp + nb304_fizH2], xmm5 movaps [rsp + nb304_fixM], xmm6 movaps [rsp + nb304_fiyM], xmm7 movaps [rsp + nb304_fizM], xmm8 ;# xmm14 = fMx ;# xmm15 = fMy ;# xmm13 = fMz movaps xmm0, xmm14 unpcklps xmm14, xmm15 unpckhps xmm0, xmm15 addps xmm11, xmm14 addps xmm12, xmm0 movhlps xmm14, xmm13 ;# fMzc fMzd movlps [rdi + rax*4 + 36], xmm11 movhps [rdi + rbx*4 + 36], xmm11 movlps [rdi + rcx*4 + 36], xmm12 movhps [rdi + rdx*4 + 36], xmm12 movss [rdi + rax*4 + 44], xmm13 movss [rdi + rcx*4 + 44], xmm14 shufps xmm13, xmm13, 1 shufps xmm14, xmm14, 1 movss [rdi + rbx*4 + 44], xmm13 movss [rdi + rdx*4 + 44], xmm14 ;# should we do one more iteration? sub dword ptr [rsp + nb304_innerk], 4 jl .nb304_single_check jmp .nb304_unroll_loop.nb304_single_check: add dword ptr [rsp + nb304_innerk], 4 jnz .nb304_single_loop jmp .nb304_updateouterdata.nb304_single_loop: mov rdx, [rsp + nb304_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] add qword ptr [rsp + nb304_innerjjnr], 4 mov rsi, [rbp + nb304_pos] lea rax, [rax + rax*2] ;# fetch j coordinates xorps xmm0, xmm0 xorps xmm1, xmm1 xorps xmm2, xmm2 movss xmm0, [rsi + rax*4 + 36] ;# jxM - - - movss xmm1, [rsi + rax*4 + 40] ;# jyM - - - movss xmm2, [rsi + rax*4 + 44] ;# jzM - - - movlps xmm6, [rsi + rax*4 + 12] ;# xmm6 = jxH1 jyH1 - - movss xmm7, [rsi + rax*4 + 20] ;# xmm7 = jzH1 - - - movhps xmm6, [rsi + rax*4 + 24] ;# xmm6 = jxH1 jyH1 jxH2 jyH2 movss xmm5, [rsi + rax*4 + 32] ;# xmm5 = jzH2 - - - ;# have all coords, time for some shuffling. shufps xmm6, xmm6, 216 ;# 11011000 ;# xmm6 = jxH1 jxH2 jyH1 jyH2 unpcklps xmm7, xmm5 ;# xmm7 = jzH1 jzH2 - - movlhps xmm0, xmm6 ;# xmm0 = jxM 0 jxH1 jxH2 shufps xmm1, xmm6, 228 ;# 11100100 ;# xmm1 = jyM 0 jyH1 jyH2 shufps xmm2, xmm7, 68 ;# 01000100 ;# xmm2 = jzM 0 jzH1 jzH2 ;# store all j coordinates in jM movaps [rsp + nb304_jxM], xmm0 movaps [rsp + nb304_jyM], xmm1 movaps [rsp + nb304_jzM], xmm2 subps xmm0, [rsp + nb304_ixM] subps xmm1, [rsp + nb304_iyM] subps xmm2, [rsp + nb304_izM] movaps [rsp + nb304_dxMM], xmm0 movaps [rsp + nb304_dyMM], xmm1 movaps [rsp + nb304_dzMM], xmm2 mulps xmm0, xmm0 mulps xmm1, xmm1 mulps xmm2, xmm2 addps xmm0, xmm1 addps xmm0, xmm2 ;# have rsq in xmm0 ;# do invsqrt rsqrtps xmm1, xmm0 movaps xmm2, xmm1 mulps xmm1, xmm1 movaps xmm3, [rsp + nb304_three] mulps xmm1, xmm0 subps xmm3, xmm1 mulps xmm3, xmm2 mulps xmm3, [rsp + nb304_half] ;# rinv iO - j water movaps xmm1, xmm3 ;# rinv mulps xmm1, xmm0 ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [rsp + nb304_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 movd ebx, mm6 movd ecx, mm7 psrlq mm7, 32 movd edx, mm7 ;# table indices in ebx,ecx,edx mov rsi, [rbp + nb304_VFtab] movlps xmm5, [rsi + rbx*4] movlps xmm7, [rsi + rcx*4] movhps xmm7, [rsi + rdx*4] ;# got half coulomb table movaps xmm4, xmm5 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm5, xmm7, 221 ;# 11011101 movlps xmm7, [rsi + rbx*4 + 8] movlps xmm3, [rsi + rcx*4 + 8] movhps xmm3, [rsi + rdx*4 + 8] ;# other half of coulomb table movaps xmm6, xmm7 shufps xmm6, xmm3, 136 ;# 10001000 shufps xmm7, xmm3, 221 ;# 11011101 ;# 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 + nb304_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [rsp + nb304_qqMM] movhps xmm3, [rsp + nb304_qqMH] 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 + nb304_vctot] movaps [rsp + nb304_vctot], xmm5 xorps xmm2, xmm2 mulps xmm3, [rsp + nb304_tsc] subps xmm2, xmm3 mulps xmm0, xmm2 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [rsp + nb304_dxMM] mulps xmm1, [rsp + nb304_dyMM] mulps xmm2, [rsp + nb304_dzMM] ;# initial update for j forces xorps xmm3, xmm3 xorps xmm4, xmm4 xorps xmm5, xmm5 addps xmm3, xmm0 addps xmm4, xmm1 addps xmm5, xmm2 movaps [rsp + nb304_fjxM], xmm3 movaps [rsp + nb304_fjyM], xmm4 movaps [rsp + nb304_fjzM], xmm5 addps xmm0, [rsp + nb304_fixM] addps xmm1, [rsp + nb304_fiyM] addps xmm2, [rsp + nb304_fizM] movaps [rsp + nb304_fixM], xmm0 movaps [rsp + nb304_fiyM], xmm1 movaps [rsp + nb304_fizM], xmm2 ;# done with i M Now do i H1 & H2 simultaneously first get i particle coords: movaps xmm0, [rsp + nb304_jxM] movaps xmm1, [rsp + nb304_jyM] movaps xmm2, [rsp + nb304_jzM] movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 subps xmm0, [rsp + nb304_ixH1] subps xmm1, [rsp + nb304_iyH1] subps xmm2, [rsp + nb304_izH1] subps xmm3, [rsp + nb304_ixH2] subps xmm4, [rsp + nb304_iyH2] subps xmm5, [rsp + nb304_izH2] movaps [rsp + nb304_dxH1M], xmm0 movaps [rsp + nb304_dyH1M], xmm1 movaps [rsp + nb304_dzH1M], xmm2 movaps [rsp + nb304_dxH2M], xmm3 movaps [rsp + nb304_dyH2M], xmm4 movaps [rsp + nb304_dzH2M], 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 ;# start with H1, save H2 data movaps [rsp + nb304_rsqH2M], xmm4 ;# do invsqrt rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [rsp + nb304_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 + nb304_half] ;# rinv H1 - j water mulps xmm7, [rsp + nb304_half] ;# rinv H2 - j water ;# start with H1, save H2 data movaps [rsp + nb304_rinvH2M], xmm7 movaps xmm1, xmm3 mulps xmm1, xmm0 ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [rsp + nb304_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 movd ebx, mm6 movd ecx, mm7 psrlq mm7, 32 movd edx, mm7 ;# table indices in ebx,ecx,edx movlps xmm5, [rsi + rbx*4] movlps xmm7, [rsi + rcx*4] movhps xmm7, [rsi + rdx*4] ;# got half coulomb table movaps xmm4, xmm5 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm5, xmm7, 221 ;# 11011101 movlps xmm7, [rsi + rbx*4 + 8] movlps xmm3, [rsi + rcx*4 + 8] movhps xmm3, [rsi + rdx*4 + 8] ;# other half of coulomb table movaps xmm6, xmm7 shufps xmm6, xmm3, 136 ;# 10001000 shufps xmm7, xmm3, 221 ;# 11011101 ;# 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 + nb304_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [rsp + nb304_qqMH] movhps xmm3, [rsp + nb304_qqHH] 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 + nb304_vctot] movaps [rsp + nb304_vctot], xmm5 xorps xmm1, xmm1 mulps xmm3, [rsp + nb304_tsc] mulps xmm3, xmm0 subps xmm1, xmm3 movaps xmm0, xmm1 movaps xmm2, xmm1 mulps xmm0, [rsp + nb304_dxH1M] mulps xmm1, [rsp + nb304_dyH1M] mulps xmm2, [rsp + nb304_dzH1M] ;# update forces H1 - j water movaps xmm3, [rsp + nb304_fjxM] movaps xmm4, [rsp + nb304_fjyM] movaps xmm5, [rsp + nb304_fjzM] addps xmm3, xmm0 addps xmm4, xmm1 addps xmm5, xmm2 movaps [rsp + nb304_fjxM], xmm3 movaps [rsp + nb304_fjyM], xmm4 movaps [rsp + nb304_fjzM], xmm5 addps xmm0, [rsp + nb304_fixH1] addps xmm1, [rsp + nb304_fiyH1] addps xmm2, [rsp + nb304_fizH1] movaps [rsp + nb304_fixH1], xmm0 movaps [rsp + nb304_fiyH1], xmm1 movaps [rsp + nb304_fizH1], xmm2 ;# do table for H2 - j water interaction movaps xmm0, [rsp + nb304_rinvH2M]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?