nb_kernel430_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,332 行 · 第 1/5 页
S
2,332 行
movd r15d, xmm11 ;# lj ;# GB indices: r8-r11 LJ indices: r12-r15 ;# calculate eps subps xmm4, xmm6 ;# gb subps xmm8, xmm10 ;# lj movaps [rsp + nb430_epsgb], xmm4 ;# gb eps movaps [rsp + nb430_eps], xmm8 ;# lj eps mov rsi, [rbp + nb430_GBtab] mov rdi, [rbp + nb430_VFtab] ;# load GB table data to xmm0-xmm3, disp to xmm4-xmm7, rep. to xmm8-xmm11 movlps xmm1, [rsi + r8*4] ;# Y1c F1c movlps xmm5, [rdi + r12*4] ;# Y1d F1d movlps xmm9, [rdi + r12*4 + 16] ;# Y1r F1r movlps xmm3, [rsi + r10*4] ;# Y3c F3c movlps xmm7, [rdi + r14*4] ;# Y3d F3d movlps xmm11, [rdi + r14*4 + 16] ;# Y3r F3r movhps xmm1, [rsi + r9*4] ;# Y1c F1c Y2c F2c movhps xmm5, [rdi + r13*4] ;# Y1d F1d Y2d F2d movhps xmm9, [rdi + r13*4 + 16] ;# Y1r F1r Y2r F2r movhps xmm3, [rsi + r11*4] ;# Y3c F3c Y4c F4c movhps xmm7, [rdi + r15*4] ;# Y3d F3d Y4d F4d movhps xmm11, [rdi + r15*4 + 16] ;# Y3r F3r Y4r F4r movaps xmm0, xmm1 movaps xmm4, xmm5 movaps xmm8, xmm9 shufps xmm0, xmm3, 136 ;# 10001000 => Y1c Y2c Y3c Y4c shufps xmm4, xmm7, 136 ;# 10001000 => Y1d Y2d Y3d Y4d shufps xmm8, xmm11, 136 ;# 10001000 => Y1r Y2r Y3r Y4r shufps xmm1, xmm3, 221 ;# 11011101 => F1c F2c F3c F4c shufps xmm5, xmm7, 221 ;# 11011101 => F1d F2d F3d F4d shufps xmm9, xmm11, 221 ;# 11011101 => F1r F2r F3r F4r movlps xmm3, [rsi + r8*4 + 8] ;# G1c H1c movlps xmm7, [rdi + r12*4 + 8] ;# G1d H1d movlps xmm11, [rdi + r12*4 + 24] ;# G1r H1r movlps xmm12, [rsi + r10*4 + 8] ;# G3c H3c movlps xmm13, [rdi + r14*4 + 8] ;# G3d H3d movlps xmm14, [rdi + r14*4 + 24] ;# G3r H3r movhps xmm3, [rsi + r9*4 + 8] ;# G1c H1c G2c H2c movhps xmm7, [rdi + r13*4 + 8] ;# G1d H1d G2d H2d movhps xmm11, [rdi + r13*4 + 24] ;# G1r H1r G2r H2r movhps xmm12, [rsi + r11*4 + 8] ;# G3c H3c G4c H4c movhps xmm13, [rdi + r15*4 + 8] ;# G3d H3d G4d H4d movhps xmm14, [rdi + r15*4 + 24] ;# G3r H3r G4r H4r movaps xmm2, xmm3 movaps xmm6, xmm7 movaps xmm10, xmm11 shufps xmm2, xmm12, 136 ;# 10001000 => G1c G2c G3c G4c shufps xmm6, xmm13, 136 ;# 10001000 => G1d G2d G3d G4d shufps xmm10, xmm14, 136 ;# 10001000 => G1r G2r G3r G4r shufps xmm3, xmm12, 221 ;# 11011101 => H1c H2c H3c H4c shufps xmm7, xmm13, 221 ;# 11011101 => H1d H2d H3d H4d shufps xmm11, xmm14, 221 ;# 11011101 => H1r H2r H3r H4r ;# table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11 movaps xmm12, [rsp + nb430_epsgb] movaps xmm13, [rsp + nb430_eps] mulps xmm3, xmm12 ;# Heps mulps xmm7, xmm13 mulps xmm11, xmm13 mulps xmm2, xmm12 ;# Geps mulps xmm6, xmm13 mulps xmm10, xmm13 mulps xmm3, xmm12 ;# Heps2 mulps xmm7, xmm13 mulps xmm11, xmm13 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, xmm13 addps xmm1, xmm0 ;# VV addps xmm5, xmm4 addps xmm9, xmm8 mulps xmm1, [rsp + nb430_qq] ;# VV*qq = vcoul mulps xmm5, [rsp + nb430_c6] ;# vnb6 mulps xmm9, [rsp + nb430_c12] ;# vnb12 mulps xmm3, [rsp + nb430_qq] ;# FF*qq = fij mulps xmm7, [rsp + nb430_c6] ;# fijD mulps xmm11, [rsp + nb430_c12] ;#fijR addps xmm11, xmm7 ;# fijD+fijR mulps xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale ;# accumulate Vvdwtot addps xmm5, [rsp + nb430_Vvdwtot] addps xmm5, xmm9 movaps [rsp + nb430_Vvdwtot], xmm5 mov rsi, [rbp + nb430_dvda] ;# Calculate dVda mulps xmm3, [rsp + nb430_gbscale] ;# fijC=qq*FF*gbscale movaps xmm6, xmm3 mulps xmm6, [rsp + nb430_r] addps xmm6, xmm1 ;# vcoul+fijC*r addps xmm3, xmm11 ;# fijC+fijD+fijR ;# increment vctot addps xmm1, [rsp + nb430_vctot] movaps [rsp + nb430_vctot], xmm1 ;# xmm6=(vcoul+fijC*r) xorps xmm7, xmm7 subps xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addps xmm7, [rsp + nb430_dvdasum] movaps [rsp + 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, [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 xorps xmm4, xmm4 mulps xmm3, [rsp + nb430_rinv] subps xmm4, xmm3 movd r8, mm0 ;# fetch j3 movd r9, mm1 movd r10, mm2 movd r11, mm3 movaps xmm9, xmm4 movaps xmm10, xmm4 movaps xmm11, xmm4 mulps xmm9, [rsp + nb430_dx] mulps xmm10, [rsp + nb430_dy] mulps xmm11, [rsp + nb430_dz] ;# accumulate i forces movaps xmm12, [rsp + nb430_fix] movaps xmm13, [rsp + nb430_fiy] movaps xmm14, [rsp + nb430_fiz] addps xmm12, xmm9 addps xmm13, xmm10 addps xmm14, xmm11 movaps [rsp + nb430_fix], xmm12 movaps [rsp + nb430_fiy], xmm13 movaps [rsp + nb430_fiz], xmm14 mov rsi, [rbp + nb430_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 + nb430_innerk], 4 jl .nb430_finish_inner jmp .nb430_unroll_loop.nb430_finish_inner: ;# check if at least two particles remain add dword ptr [rsp + nb430_innerk], 4 mov edx, [rsp + nb430_innerk] and edx, 2 jnz .nb430_dopair jmp .nb430_checksingle.nb430_dopair: mov rcx, [rsp + nb430_innerjjnr] mov eax, [rcx] mov ebx, [rcx + 4] add qword ptr [rsp + nb430_innerjjnr], 8 ;# load isaj mov rsi, [rbp + nb430_invsqrta] movss xmm3, [rsi + rax*4] movss xmm6, [rsi + rbx*4] movaps xmm2, [rsp + nb430_isai] unpcklps xmm3, xmm6 mulps xmm2, xmm3 movaps [rsp + nb430_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb430_gbtsc] movaps [rsp + nb430_gbscale], xmm1 mov rsi, [rbp + nb430_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm6, [rsi + rbx*4] unpcklps xmm3, xmm6 mulps xmm2, [rsp + nb430_iq] mulps xmm3, xmm2 movaps [rsp + nb430_qq], xmm3 ;# vdw parameters mov rsi, [rbp + nb430_type] mov r12d, [rsi + rax*4] mov r13d, [rsi + rbx*4] shl r12d, 1 shl r13d, 1 mov edi, [rsp + nb430_ntia] add r12d, edi add r13d, edi mov rsi, [rbp + nb430_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 + nb430_c6], xmm0 movaps [rsp + nb430_c12], xmm3 mov rsi, [rbp + nb430_pos] ;# base of pos[] lea r8, [rax + rax*2] ;# j3 lea r9, [rbx + rbx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm0, [rsi + r8*4] ;# x1 y1 - - movlps xmm1, [rsi + r9*4] ;# x2 y2 - - movss xmm2, [rsi + r8*4 + 8] ;# z1 - - - movss xmm7, [rsi + r9*4 + 8] ;# z2 - - - unpcklps xmm0, xmm1 ;# x1 x2 y1 y2 movhlps xmm1, xmm0 ;# y1 y2 - - unpcklps xmm2, xmm7 ;# z1 z2 - - ;# calc dr subps xmm0, [rsp + nb430_ix] subps xmm1, [rsp + nb430_iy] subps xmm2, [rsp + nb430_iz] ;# store dr movaps [rsp + nb430_dx], xmm0 movaps [rsp + nb430_dy], xmm1 movaps [rsp + nb430_dz], xmm2 ;# square it mulps xmm0,xmm0 mulps xmm1,xmm1 mulps xmm2,xmm2 addps xmm0, xmm1 addps xmm0, xmm2 movaps xmm4, xmm0 ;# rsq in xmm4 rsqrtps xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulps xmm5, xmm5 movaps xmm1, [rsp + nb430_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb430_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r movaps [rsp + nb430_r], xmm4 movaps [rsp + nb430_rinv], xmm0 movaps xmm8, xmm4 ;# r mulps xmm4, [rsp + nb430_gbscale] ;# rgbtab mulps xmm8, [rsp + nb430_tsc] ;# rtab ;# truncate and convert to integers cvttps2dq xmm5, xmm4 ;# gb cvttps2dq xmm9, xmm8 ;# lj ;# convert back to float cvtdq2ps xmm6, xmm5 ;# gb cvtdq2ps xmm10, xmm9 ;# lj ;# multiply by 4 and 8, respectively pslld xmm5, 2 ;# gb pslld xmm9, 3 ;# lj ;# move to integer registers movd r12d, xmm5 ;# gb movd r14d, xmm9 ;# lj pshufd xmm5, xmm5, 1 ;# gb pshufd xmm9, xmm9, 1 ;# lj movd r13d, xmm5 ;# gb movd r15d, xmm9 ;# lj ;# GB indices: r12-r13 LJ indices: r14-r15 ;# calculate eps subps xmm4, xmm6 ;# gb subps xmm8, xmm10 ;# lj movaps [rsp + nb430_epsgb], xmm4 ;# gb eps movaps [rsp + nb430_eps], xmm8 ;# lj eps mov rsi, [rbp + nb430_GBtab] mov rdi, [rbp + nb430_VFtab] ;# load GB table data to xmm0-xmm3, disp to xmm4-xmm7, rep. to xmm8-xmm11 movlps xmm0, [rsi + r12*4] ;# Y1c F1c movlps xmm1, [rsi + r13*4] ;# Y2c F2c movlps xmm4, [rdi + r14*4] ;# Y1d F1d movlps xmm5, [rdi + r15*4] ;# Y2d F2d movlps xmm8, [rdi + r14*4 + 16] ;# Y1r F1r movlps xmm9, [rdi + r15*4 + 16] ;# Y2r F2r unpcklps xmm0, xmm1 movhlps xmm1, xmm0 unpcklps xmm4, xmm5 movhlps xmm5, xmm4 unpcklps xmm8, xmm9 movhlps xmm9, xmm8 movlps xmm2, [rsi + r12*4 + 8] ;# G1c H1c movlps xmm3, [rsi + r13*4 + 8] ;# G2c H2c movlps xmm6, [rdi + r14*4 + 8] ;# G1d H1d movlps xmm7, [rdi + r15*4 + 8] ;# G2d H2d movlps xmm10, [rdi + r14*4 + 24] ;# G1r H1r movlps xmm11, [rdi + r15*4 + 24] ;# G2r H2r unpcklps xmm2, xmm3 movhlps xmm3, xmm2 unpcklps xmm6, xmm7 movhlps xmm7, xmm6 unpcklps xmm10, xmm11 movhlps xmm11, xmm10 ;# table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11 movaps xmm12, [rsp + nb430_epsgb] movaps xmm13, [rsp + nb430_eps] mulps xmm3, xmm12 ;# Heps mulps xmm7, xmm13 mulps xmm11, xmm13 mulps xmm2, xmm12 ;# Geps mulps xmm6, xmm13 mulps xmm10, xmm13 mulps xmm3, xmm12 ;# Heps2 mulps xmm7, xmm13 mulps xmm11, xmm13 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, xmm13 addps xmm1, xmm0 ;# VV addps xmm5, xmm4 addps xmm9, xmm8 mulps xmm1, [rsp + nb430_qq] ;# VV*qq = vcoul mulps xmm5, [rsp + nb430_c6] ;# vnb6 mulps xmm9, [rsp + nb430_c12] ;# vnb12 mulps xmm3, [rsp + nb430_qq] ;# FF*qq = fij mulps xmm7, [rsp + nb430_c6] ;# fijD mulps xmm11, [rsp + nb430_c12] ;#fijR addps xmm11, xmm7 ;# fijD+fijR mulps xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale ;# accumulate Vvdwtot addps xmm5, [rsp + nb430_Vvdwtot] addps xmm5, xmm9 movlps [rsp + nb430_Vvdwtot], xmm5 mov rsi, [rbp + nb430_dvda] ;# Calculate dVda mulps xmm3, [rsp + nb430_gbscale] ;# fijC=qq*FF*gbscale movaps xmm6, xmm3 mulps xmm6, [rsp + nb430_r] addps xmm6, xmm1 ;# vcoul+fijC*r addps xmm3, xmm11 ;# fijC+fijD+fijR ;# increment vctot addps xmm1, [rsp + nb430_vctot] movlps [rsp + nb430_vctot], xmm1 ;# xmm6=(vcoul+fijC*r) xorps xmm7, xmm7 subps xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addps xmm7, [rsp + nb430_dvdasum] movlps [rsp + nb430_dvdasum], xmm7 ;# update j atoms dvdaj movaps xmm5, xmm6 shufps xmm5, xmm5, 0x1 ;# xmm6=dvdaj1 xmm5=dvdaj2
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?