nb_kernel410_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,011 行 · 第 1/4 页
S
2,011 行
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 ;# LJ forces mulps xmm10, [rsp + nb410_six] mulps xmm9, [rsp + nb410_twelve] subps xmm9, xmm10 mulps xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv mov rsi, [rbp + nb410_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulps xmm3, [rsp + nb410_gbscale] movaps xmm6, xmm3 mulps xmm6, [rsp + nb410_r] addps xmm6, xmm5 ;# increment vctot (sum in xmm12) addps xmm12, xmm5 ;# xmm6=(vcoul+fijC*r) subps xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addps xmm7, [rsp + nb410_dvdasum] movaps [rsp + nb410_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, [rsi + rax*4] addss xmm5, [rsi + rbx*4] addss xmm7, [rsi + rcx*4] addss xmm4, [rsi + rdx*4] movss [rsi + rax*4], xmm6 movss [rsi + rbx*4], xmm5 movss [rsi + rcx*4], xmm7 movss [rsi + rdx*4], xmm4 subps xmm9, xmm3 mulps xmm9, xmm0 ;# fscal movaps xmm10, xmm9 movaps xmm11, xmm9 mulps xmm9, [rsp + nb410_dx] mulps xmm10, [rsp + nb410_dy] mulps xmm11, [rsp + nb410_dz] ;# accumulate i forces addps xmm13, xmm9 addps xmm14, xmm10 addps xmm15, xmm11 mov rsi, [rbp + nb410_faction] ;# the fj's - start by accumulating x & y forces from memory movlps xmm0, [rsi + r8*4] ;# x1 y1 - - movlps xmm1, [rsi + r10*4] ;# x3 y3 - - movhps xmm0, [rsi + r9*4] ;# x1 y1 x2 y2 movhps xmm1, [rsi + r11*4] ;# x3 y3 x4 y4 movaps xmm8, xmm9 unpcklps xmm9, xmm10 ;# x1 y1 x2 y2 unpckhps xmm8, xmm10 ;# x3 y3 x4 y4 ;# update fjx and fjy addps xmm0, xmm9 addps xmm1, xmm8 movlps [rsi + r8*4], xmm0 movlps [rsi + r10*4], xmm1 movhps [rsi + r9*4], xmm0 movhps [rsi + r11*4], xmm1 ;# xmm11: fjz1 fjz2 fjz3 fjz4 pshufd xmm10, xmm11, 1 ;# fjz2 - - - movhlps xmm9, xmm11 ;# fjz3 - - - pshufd xmm8, xmm11, 3 ;# fjz4 - - - addss xmm11, [rsi + r8*4 + 8] addss xmm10, [rsi + r9*4 + 8] addss xmm9, [rsi + r10*4 + 8] addss xmm8, [rsi + r11*4 + 8] movss [rsi + r8*4 + 8], xmm11 movss [rsi + r9*4 + 8], xmm10 movss [rsi + r10*4 + 8], xmm9 movss [rsi + r11*4 + 8], xmm8 ;# should we do one more iteration? sub dword ptr [rsp + nb410_innerk], 4 jl .nb410_finish_inner jmp .nb410_unroll_loop.nb410_finish_inner: ;# check if at least two particles remain add dword ptr [rsp + nb410_innerk], 4 mov edx, [rsp + nb410_innerk] and edx, 2 jnz .nb410_dopair jmp .nb410_checksingle.nb410_dopair: mov rcx, [rsp + nb410_innerjjnr] mov eax, [rcx] mov ebx, [rcx + 4] add qword ptr [rsp + nb410_innerjjnr], 8 ;# load isaj mov rsi, [rbp + nb410_invsqrta] movss xmm2, [rsi + rax*4] movss xmm6, [rsi + rbx*4] unpcklps xmm2, xmm6 mulps xmm2, [rsp + nb410_isai] movaps [rsp + nb410_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb410_gbtsc] movaps [rsp + nb410_gbscale], xmm1 mulps xmm2, [rsp + nb410_iq] mov rsi, [rbp + nb410_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm6, [rsi + rbx*4] unpcklps xmm3, xmm6 mulps xmm3, xmm2 movaps [rsp + nb410_qq], xmm3 ;# vdw parameters mov rsi, [rbp + nb410_type] mov r12d, [rsi + rax*4] mov r13d, [rsi + rbx*4] shl r12d, 1 shl r13d, 1 mov edi, [rsp + nb410_ntia] add r12d, edi add r13d, edi mov rsi, [rbp + nb410_vdwparam] movlps xmm3, [rsi + r12*4] movhps xmm3, [rsi + r13*4] xorps xmm7, xmm7 movaps xmm0, xmm3 shufps xmm0, xmm7, 136 ;# 10001000 shufps xmm3, xmm7, 221 ;# 11011101 movaps [rsp + nb410_c6], xmm0 movaps [rsp + nb410_c12], xmm3 mov rsi, [rbp + nb410_pos] ;# base of pos[] lea r8, [rax + rax*2] ;# j3 lea r9, [rbx + rbx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm4, [rsi + r8*4] ;# x1 y1 - - movlps xmm5, [rsi + r9*4] ;# x2 y2 - - movss xmm6, [rsi + r8*4 + 8] ;# z1 - - - movss xmm7, [rsi + r9*4 + 8] ;# z2 - - - unpcklps xmm4, xmm5 ;# x1 x2 y1 y2 movhlps xmm5, xmm4 ;# y1 y2 - - unpcklps xmm6, xmm7 ;# z1 z2 - - ;# calc dr subps xmm4, [rsp + nb410_ix] subps xmm5, [rsp + nb410_iy] subps xmm6, [rsp + nb410_iz] ;# store dr movaps [rsp + nb410_dx], xmm4 movaps [rsp + nb410_dy], xmm5 movaps [rsp + nb410_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, [rsp + nb410_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb410_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r movaps [rsp + nb410_r], xmm4 mulps xmm4, [rsp + nb410_gbscale] ;# truncate and convert to integers cvttps2dq xmm5, xmm4 ;# convert back to float cvtdq2ps xmm6, xmm5 ;# multiply by 4 pslld xmm5, 2 ;# move to integer registers movd r12d, xmm5 pshufd xmm5, xmm5, 1 movd r13d, xmm5 ;# calculate eps subps xmm4, xmm6 movaps xmm1, xmm4 ;#eps mov rsi, [rbp + nb410_GBtab] movaps xmm9, xmm0 ;# rinv mulps xmm9, xmm9 ;# rinvsq movaps xmm10, xmm9 ;# rinvsq mulps xmm10, xmm10 ;# rinv4 mulps xmm10, xmm9 ;# rinv6 movaps xmm11, xmm10 mulps xmm11, xmm11 ;# rinv12 ;# load table data movlps xmm4, [rsi + r12*4] ;# Y1 F1 movlps xmm5, [rsi + r13*4] ;# Y2 F2 unpcklps xmm4, xmm5 ;# Y1 Y2 F1 F2 movhlps xmm5, xmm4 ;# F1 F2 mulps xmm10, [rsp + nb410_c6] ;# vvdw6=c6*rinv6 mulps xmm11, [rsp + nb410_c12] ;# vvdw12=c12*rinv12 movaps xmm9, xmm11 subps xmm11, xmm10 ;# Vvdw=Vvdw12-Vvdw6 ;# add potential to vvdwtot addps xmm11, [rsp + nb410_Vvdwtot] movlps [rsp + nb410_Vvdwtot], xmm11 movlps xmm6, [rsi + r12*4 + 8] ;# G1 H1 movlps xmm7, [rsi + r13*4 + 8] ;# G2 H2 unpcklps xmm6, xmm7 ;# G1 G2 movhlps xmm7, xmm6 ;# H1 H2 ;# table data ready in xmm4-xmm7 mulps xmm7, xmm1 ;# Heps mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm1 ;# Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp addps xmm7, xmm7 ;# two*Heps2 movaps xmm3, [rsp + nb410_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 ;# at this point xmm5 contains vcoul and xmm3 fijC ;# LJ forces mulps xmm10, [rsp + nb410_six] mulps xmm9, [rsp + nb410_twelve] subps xmm9, xmm10 mulps xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv ;# zero upper part of vcoul xorps xmm2, xmm2 movlhps xmm5, xmm2 mov rsi, [rbp + nb410_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulps xmm3, [rsp + nb410_gbscale] movaps xmm6, xmm3 mulps xmm6, [rsp + nb410_r] addps xmm6, xmm5 xorps xmm4, xmm4 ;# increment vctot (sum in xmm12) addps xmm12, xmm5 ;# xmm6=(vcoul+fijC*r) subps xmm7, xmm6 movaps xmm6, xmm7 ;# zero upper half of dvda movlhps xmm7, xmm4 ;# update dvdasum addps xmm7, [rsp + nb410_dvdasum] movaps [rsp + nb410_dvdasum], xmm7 ;# update j atoms dvdaj movaps xmm5, xmm6 shufps xmm5, xmm5, 0x1 ;# xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4 addss xmm6, [rsi + rax*4] addss xmm5, [rsi + rbx*4] movss [rsi + rax*4], xmm6 movss [rsi + rbx*4], xmm5 xorps xmm7, xmm7 subps xmm9, xmm3 mulps xmm9, xmm0 ;# fscal movaps xmm10, xmm9 movaps xmm11, xmm9 mulps xmm9, [rsp + nb410_dx] mulps xmm10, [rsp + nb410_dy] mulps xmm11, [rsp + nb410_dz] movlhps xmm9, xmm7 movlhps xmm10, xmm7 movlhps xmm11, xmm7 ;# accumulate i forces addps xmm13, xmm9 addps xmm14, xmm10 addps xmm15, xmm11 mov rsi, [rbp + nb410_faction] ;# the fj's - start by accumulating x & y forces from memory movlps xmm0, [rsi + r8*4] ;# x1 y1 - - movhps xmm0, [rsi + r9*4] ;# x1 y1 x2 y2 unpcklps xmm9, xmm10 ;# x1 y1 x2 y2 addps xmm0, xmm9 movlps [rsi + r8*4], xmm0 movhps [rsi + r9*4], xmm0 ;# z forces pshufd xmm8, xmm11, 1 addss xmm11, [rsi + r8*4 + 8] addss xmm8, [rsi + r9*4 + 8] movss [rsi + r8*4 + 8], xmm11 movss [rsi + r9*4 + 8], xmm8.nb410_checksingle: mov edx, [rsp + nb410_innerk] and edx, 1 jnz .nb410_dosingle jmp .nb410_updateouterdata.nb410_dosingle: mov rsi, [rbp + nb410_charge] mov rdx, [rbp + nb410_invsqrta] mov rdi, [rbp + nb410_pos] mov rcx, [rsp + nb410_innerjjnr] mov eax, [rcx] ;# load isaj mov rsi, [rbp + nb410_invsqrta] movss xmm3, [rsi + rax*4] movaps xmm2, [rsp + nb410_isai] mulss xmm2, xmm3 movss [rsp + nb410_isaprod], xmm2 movaps xmm1, xmm2 mulss xmm1, [rsp + nb410_gbtsc] movss [rsp + nb410_gbscale], xmm1 mulss xmm2, [rsp + nb410_iq] mov rsi, [rbp + nb410_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] mulss xmm3, xmm2 movss [rsp + nb410_qq], xmm3 ;# vdw parameters mov rsi, [rbp + nb410_type] mov r12d, [rsi + rax*4] shl r12d, 1 mov edi, [rsp + nb410_ntia] add r12d, edi mov rsi, [rbp + nb410_vdwparam] movss xmm0, [rsi + r12*4] movss xmm3, [rsi + r12*4 + 4] movaps [rsp + nb410_c6], xmm0 movaps [rsp + nb410_c12], xmm3 mov rsi, [rbp + nb410_pos] ;# base of pos[] lea r8, [rax + rax*2] ;# jnr ;# move four coordinates to xmm0-xmm2 movss xmm4, [rsi + r8*4] movss xmm5, [rsi + r8*4 + 4] movss xmm6, [rsi + r8*4 + 8] ;# calc dr subss xmm4, [rsp + nb410_ix] subss xmm5, [rsp + nb410_iy] subss xmm6, [rsp + nb410_iz] ;# store dr movaps [rsp + nb410_dx], xmm4 movaps [rsp + nb410_dy], xmm5 movaps [rsp + nb410_dz], xmm6 ;# square it mulss xmm4,xmm4 mulss xmm5,xmm5 mulss xmm6,xmm6 addss xmm4, xmm5 addss xmm4, xmm6 ;# rsq in xmm4 rsqrtss xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulss xmm5, xmm5 movaps xmm1, [rsp + nb410_three] mulss xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb410_half] subss xmm1, xmm5 ;# 30-rsq*lu*lu mulss xmm1, xmm2 mulss xmm0, xmm1 ;# xmm0=rinv mulss xmm4, xmm0 ;# xmm4=r movaps [rsp + nb410_r], xmm4 mulss xmm4, [rsp + nb410_gbscale] ;# truncate and convert to integers cvttss2si r12d, xmm4 ;# convert back to float cvtsi2ss xmm6, r12d ;# multiply by 4 shl r12d, 2 ;# calculate eps subss xmm4, xmm6 movaps xmm1, xmm4 ;#eps mov rsi, [rbp + nb410_GBtab] movaps xmm9, xmm0 ;# rinv mulss xmm9, xmm9 ;# rinvsq movaps xmm10, xmm9 ;# rinvsq mulss xmm10, xmm10 ;# rinv4 mulss xmm10, xmm9 ;# rinv6 movaps xmm11, xmm10 mulss xmm11, xmm11 ;# rinv12 ;# load table data movss xmm4, [rsi + r12*4] movss xmm5, [rsi + r12*4 + 4] movss xmm6, [rsi + r12*4 + 8] movss xmm7, [rsi + r12*4 + 12] ;# table data ready in xmm4-xmm7 mulss xmm10, [rsp + nb410_c6] ;# vvdw6=c6*rinv6 mulss xmm11, [rsp + nb410_c12] ;# vvdw12=c12*rinv12 movaps xmm9, xmm11 subss xmm11, xmm10 ;# Vvdw=Vvdw12-Vvdw6 ;# add potential to vvdwtot addss xmm11, [rsp + nb410_Vvdwtot] movss [rsp + nb410_Vvdwtot], xmm11 mulss xmm7, xmm1 ;# Heps mulss xmm6, xmm1 ;# xmm6=Geps mulss xmm7, xmm1 ;# Heps2 addss xmm5, xmm6 addss xmm5, xmm7 ;# xmm5=Fp addss xmm7, xmm7 ;# two*Heps2 movss xmm3, [rsp + nb410_qq] addss xmm7, xmm6 addss xmm7, xmm5 ;# xmm7=FF mulss xmm5, xmm1 ;# xmm5=eps*Fp addss xmm5, xmm4 ;# xmm5=VV mulss xmm5, xmm3 ;# vcoul=qq*VV mulss xmm3, xmm7 ;# fijC=FF*qq ;# at this point xmm5 contains vcoul and xmm3 fijC ;# LJ forces mulss xmm10, [rsp + nb410_six] mulss xmm9, [rsp + nb410_twelve] subss xmm9, xmm10
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?