nb_kernel312_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,294 行 · 第 1/5 页
S
2,294 行
movlps xmm9, [rsi + r12*4] movlps xmm3, [rsi + rcx*4] movlps xmm7, [rsi + r10*4] movlps xmm11, [rsi + r14*4] movhps xmm1, [rsi + rbx*4] movhps xmm5, [rsi + r9*4] movhps xmm9, [rsi + r13*4] movhps xmm3, [rsi + rdx*4] movhps xmm7, [rsi + r11*4] movhps xmm11, [rsi + r15*4] movaps xmm0, xmm1 movaps xmm4, xmm5 movaps xmm8, xmm9 shufps xmm0, xmm3, 136 ;# 10001000 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm8, xmm11, 136 ;# 10001000 shufps xmm1, xmm3, 221 ;# 11011101 shufps xmm5, xmm7, 221 ;# 11011101 shufps xmm9, xmm11, 221 ;# 11011101 movlps xmm3, [rsi + rax*4 + 8] movlps xmm7, [rsi + r8*4 + 8] movlps xmm11, [rsi + r12*4 + 8] movlps xmm12, [rsi + rcx*4 + 8] movlps xmm13, [rsi + r10*4 + 8] movlps xmm14, [rsi + r14*4 + 8] movhps xmm3, [rsi + rbx*4 + 8] movhps xmm7, [rsi + r9*4 + 8] movhps xmm11, [rsi + r13*4 + 8] movhps xmm12, [rsi + rdx*4 + 8] movhps xmm13, [rsi + r11*4 + 8] movhps xmm14, [rsi + r15*4 + 8] movaps xmm2, xmm3 movaps xmm6, xmm7 movaps xmm10, xmm11 shufps xmm2, xmm12, 136 ;# 10001000 shufps xmm6, xmm13, 136 ;# 10001000 shufps xmm10, xmm14, 136 ;# 10001000 shufps xmm3, xmm12, 221 ;# 11011101 shufps xmm7, xmm13, 221 ;# 11011101 shufps xmm11, xmm14, 221 ;# 11011101 ;# table data ready in xmm0-xmm3 , xmm4-xmm7 , and xmm8-xmm11 movaps xmm12, [rsp + nb312_epsO] movaps xmm13, [rsp + nb312_epsH1] movaps xmm14, [rsp + nb312_epsH2] 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 + nb312_qqOH] movaps xmm13, [rsp + nb312_qqHH] addps xmm1, xmm0 ;# VV addps xmm5, xmm4 addps xmm9, xmm8 mulps xmm1, xmm12 ;# VV*qq = vcoul mulps xmm5, xmm13 mulps xmm9, xmm13 mulps xmm3, xmm12 ;# FF*qq = fij mulps xmm7, xmm13 mulps xmm11, xmm13 movd eax, mm0 ;# restore j3 from mm0-mm3 movd ebx, mm1 movd ecx, mm2 movd edx, mm3 ;# accumulate vctot addps xmm1, [rsp + nb312_vctot] addps xmm5, xmm9 addps xmm1, xmm5 movaps [rsp + nb312_vctot], xmm1 movaps xmm10, [rsp + nb312_tsc] mulps xmm3, xmm10 ;# fscal mulps xmm7, xmm10 mulps xmm10, xmm11 ;# move j H2 forces to local temp variables movlps xmm11, [rdi + rax*4 + 24] ;# jxH2a jyH2a - - movlps xmm12, [rdi + rcx*4 + 24] ;# jxH2c jyH2c - - ;# xmm11: jxH2a jyH2a jxH2b jyH2b ;# xmm12: jxH2c jyH2c jxH2d jyH2d ;# xmm13: jzH2a jzH2b jzH2c jzH2d xorps xmm0, xmm0 xorps xmm4, xmm4 xorps xmm8, xmm8 movhps xmm11, [rdi + rbx*4 + 24] ;# jxH2a jyH2a jxH2b jyH2b movhps xmm12, [rdi + rdx*4 + 24] ;# jxH2c jyH2c jxH2d jyH2d mulps xmm3, [rsp + nb312_rinvOH2] mulps xmm7, [rsp + nb312_rinvH1H2] mulps xmm10, [rsp + nb312_rinvH2H2] subps xmm0, xmm3 subps xmm4, xmm7 subps xmm8, xmm10 movss xmm13, [rdi + rax*4 + 32] ;# jzH2a - - - movss xmm14, [rdi + rcx*4 + 32] ;# jzH2c - - - movaps xmm1, xmm0 movaps xmm2, xmm0 movaps xmm3, xmm4 movaps xmm5, xmm4 movaps xmm6, xmm8 movaps xmm7, xmm8 movss xmm15, [rdi + rbx*4 + 32] ;# jzH2b - - - movss xmm9, [rdi + rdx*4 + 32] ;# jzH2d - - - movlhps xmm13, xmm15 ;# jzH2a - jzH2b - movlhps xmm14, xmm9 ;# jzH2c - jzH2d - shufps xmm13, xmm14, 136 ;# 10001000 => jzH2a jzH2b jzH2c jzH2d mulps xmm0, [rsp + nb312_dxOH2] mulps xmm1, [rsp + nb312_dyOH2] mulps xmm2, [rsp + nb312_dzOH2] mulps xmm3, [rsp + nb312_dxH1H2] mulps xmm4, [rsp + nb312_dyH1H2] mulps xmm5, [rsp + nb312_dzH1H2] mulps xmm6, [rsp + nb312_dxH2H2] mulps xmm7, [rsp + nb312_dyH2H2] mulps xmm8, [rsp + nb312_dzH2H2] movaps xmm14, xmm0 movaps xmm15, xmm1 addps xmm13, xmm2 addps xmm0, [rsp + nb312_fixO] addps xmm1, [rsp + nb312_fiyO] addps xmm2, [rsp + nb312_fizO] addps xmm14, xmm3 addps xmm15, xmm4 addps xmm13, xmm5 addps xmm3, [rsp + nb312_fixH1] addps xmm4, [rsp + nb312_fiyH1] addps xmm5, [rsp + nb312_fizH1] addps xmm14, xmm6 addps xmm15, xmm7 addps xmm13, xmm8 addps xmm6, [rsp + nb312_fixH2] addps xmm7, [rsp + nb312_fiyH2] addps xmm8, [rsp + nb312_fizH2] movaps [rsp + nb312_fixO], xmm0 movaps [rsp + nb312_fiyO], xmm1 movaps [rsp + nb312_fizO], xmm2 movaps [rsp + nb312_fixH1], xmm3 movaps [rsp + nb312_fiyH1], xmm4 movaps [rsp + nb312_fizH1], xmm5 movaps [rsp + nb312_fixH2], xmm6 movaps [rsp + nb312_fiyH2], xmm7 movaps [rsp + nb312_fizH2], xmm8 ;# xmm11 = fH2x ;# xmm12 = fH2y ;# xmm13 = fH2z movaps xmm0, xmm14 unpcklps xmm14, xmm15 unpckhps xmm0, xmm15 addps xmm11, xmm14 addps xmm12, xmm0 movhlps xmm14, xmm13 ;# fH2zc fH2zd pshufd xmm3, xmm13, 1 pshufd xmm4, xmm13, 3 movlps [rdi + rax*4 + 24], xmm11 movhps [rdi + rbx*4 + 24], xmm11 movlps [rdi + rcx*4 + 24], xmm12 movhps [rdi + rdx*4 + 24], xmm12 movss [rdi + rax*4 + 32], xmm13 movss [rdi + rcx*4 + 32], xmm14 movss [rdi + rbx*4 + 32], xmm3 movss [rdi + rdx*4 + 32], xmm4 ;# should we do one more iteration? sub dword ptr [rsp + nb312_innerk], 4 jl .nb312_single_check jmp .nb312_unroll_loop.nb312_single_check: add dword ptr [rsp + nb312_innerk], 4 jnz .nb312_single_loop jmp .nb312_updateouterdata.nb312_single_loop: mov rdx, [rsp + nb312_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] add qword ptr [rsp + nb312_innerjjnr], 4 mov rsi, [rbp + nb312_pos] lea rax, [rax + rax*2] ;# fetch j coordinates xorps xmm0, xmm0 xorps xmm1, xmm1 xorps xmm2, xmm2 movss xmm0, [rsi + rax*4] ;# jxO - - - movss xmm1, [rsi + rax*4 + 4] ;# jyO - - - movss xmm2, [rsi + rax*4 + 8] ;# jzO - - - 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 = jxO 0 jxH1 jxH2 shufps xmm1, xmm6, 228 ;# 11100100 ;# xmm1 = jyO 0 jyH1 jyH2 shufps xmm2, xmm7, 68 ;# 01000100 ;# xmm2 = jzO 0 jzH1 jzH2 ;# store all j coordinates in jO movaps [rsp + nb312_jxO], xmm0 movaps [rsp + nb312_jyO], xmm1 movaps [rsp + nb312_jzO], xmm2 subps xmm0, [rsp + nb312_ixO] subps xmm1, [rsp + nb312_iyO] subps xmm2, [rsp + nb312_izO] movaps [rsp + nb312_dxOO], xmm0 movaps [rsp + nb312_dyOO], xmm1 movaps [rsp + nb312_dzOO], 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 + nb312_three] mulps xmm1, xmm0 subps xmm3, xmm1 mulps xmm3, xmm2 mulps xmm3, [rsp + nb312_half] ;# rinv iO - j water movaps xmm1, xmm3 mulps xmm1, xmm0 ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [rsp + nb312_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 + nb312_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 + nb312_two] ;# two*Heps2 xorps xmm3, xmm3 ;# fetch charges to xmm3 (temporary) movss xmm3, [rsp + nb312_qqOO] movhps xmm3, [rsp + nb312_qqOH] 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 + nb312_vctot] movaps [rsp + nb312_vctot], xmm5 mulps xmm3, [rsp + nb312_tsc] ;# start doing lj xorps xmm2, xmm2 movss xmm2, xmm0 mulss xmm2, xmm2 movaps xmm1, xmm2 mulss xmm1, xmm2 mulss xmm1, xmm2 ;# xmm1=rinvsix movaps xmm2, xmm1 mulss xmm2, xmm2 ;# xmm2=rinvtwelve mulss xmm1, [rsp + nb312_c6] mulss xmm2, [rsp + nb312_c12] movaps xmm4, xmm2 subss xmm4, xmm1 addps xmm4, [rsp + nb312_Vvdwtot] mulss xmm1, [rsp + nb312_six] mulss xmm2, [rsp + nb312_twelve] movaps [rsp + nb312_Vvdwtot], xmm4 subss xmm2, xmm1 mulss xmm2, xmm0 subps xmm2, xmm3 mulps xmm0, xmm2 movaps xmm1, xmm0 movaps xmm2, xmm0 mulps xmm0, [rsp + nb312_dxOO] mulps xmm1, [rsp + nb312_dyOO] mulps xmm2, [rsp + nb312_dzOO] ;# 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 + nb312_fjxO], xmm3 movaps [rsp + nb312_fjyO], xmm4 movaps [rsp + nb312_fjzO], xmm5 addps xmm0, [rsp + nb312_fixO] addps xmm1, [rsp + nb312_fiyO] addps xmm2, [rsp + nb312_fizO] movaps [rsp + nb312_fixO], xmm0 movaps [rsp + nb312_fiyO], xmm1 movaps [rsp + nb312_fizO], xmm2 ;# done with i O Now do i H1 & H2 simultaneously first get i particle coords: movaps xmm0, [rsp + nb312_jxO] movaps xmm1, [rsp + nb312_jyO] movaps xmm2, [rsp + nb312_jzO] movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 subps xmm0, [rsp + nb312_ixH1] subps xmm1, [rsp + nb312_iyH1] subps xmm2, [rsp + nb312_izH1] subps xmm3, [rsp + nb312_ixH2] subps xmm4, [rsp + nb312_iyH2] subps xmm5, [rsp + nb312_izH2] movaps [rsp + nb312_dxH1O], xmm0 movaps [rsp + nb312_dyH1O], xmm1 movaps [rsp + nb312_dzH1O], xmm2 movaps [rsp + nb312_dxH2O], xmm3 movaps [rsp + nb312_dyH2O], xmm4 movaps [rsp + nb312_dzH2O], 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 + nb312_rsqH2O], xmm4 ;# do invsqrt rsqrtps xmm1, xmm0 rsqrtps xmm5, xmm4 movaps xmm2, xmm1 movaps xmm6, xmm5 mulps xmm1, xmm1 mulps xmm5, xmm5 movaps xmm3, [rsp + nb312_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 + nb312_half] ;# rinv H1 - j water mulps xmm7, [rsp + nb312_half] ;# rinv H2 - j water ;# start with H1, save H2 data movaps [rsp + nb312_rinvH2O], xmm7 movaps xmm1, xmm3 mulps xmm1, xmm0 ;# xmm1=r movaps xmm0, xmm3 ;# xmm0=rinv mulps xmm1, [rsp + nb312_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
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?