nb_kernel430_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,332 行 · 第 1/5 页
S
2,332 行
addss xmm6, [rsi + rax*4] addss xmm5, [rsi + rbx*4] movss [rsi + rax*4], xmm6 movss [rsi + rbx*4], xmm5 xorps xmm4, xmm4 mulps xmm3, [rsp + nb430_rinv] subps xmm4, xmm3 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 movlps [rsp + nb430_fix], xmm12 movlps [rsp + nb430_fiy], xmm13 movlps [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 - - 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.nb430_checksingle: mov edx, [rsp + nb430_innerk] and edx, 1 jnz .nb430_dosingle jmp .nb430_updateouterdata.nb430_dosingle: mov rsi, [rbp + nb430_charge] mov rdx, [rbp + nb430_invsqrta] mov rdi, [rbp + nb430_pos] mov rcx, [rsp + nb430_innerjjnr] mov eax, [rcx] ;# load isaj mov rsi, [rbp + nb430_invsqrta] movss xmm3, [rsi + rax*4] movaps xmm2, [rsp + nb430_isai] mulss xmm2, xmm3 movaps [rsp + nb430_isaprod], xmm2 movaps xmm1, xmm2 mulss xmm1, [rsp + nb430_gbtsc] movaps [rsp + nb430_gbscale], xmm1 mov rsi, [rbp + nb430_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] mulss xmm2, [rsp + nb430_iq] mulss xmm3, xmm2 movaps [rsp + nb430_qq], xmm3 ;# vdw parameters mov rsi, [rbp + nb430_type] mov r12d, [rsi + rax*4] shl r12d, 1 mov edi, [rsp + nb430_ntia] add r12d, edi mov rsi, [rbp + nb430_vdwparam] movss xmm0, [rsi + r12*4] movss xmm3, [rsi + r12*4 + 4] movaps [rsp + nb430_c6], xmm0 movaps [rsp + nb430_c12], xmm3 mov rsi, [rbp + nb430_pos] ;# base of pos[] lea r8, [rax + rax*2] ;# j3 ;# move four coordinates to xmm0-xmm2 movss xmm0, [rsi + r8*4] movss xmm1, [rsi + r8*4 + 4] movss xmm2, [rsi + r8*4 + 8] ;# calc dr subss xmm0, [rsp + nb430_ix] subss xmm1, [rsp + nb430_iy] subss xmm2, [rsp + nb430_iz] ;# store dr movaps [rsp + nb430_dx], xmm0 movaps [rsp + nb430_dy], xmm1 movaps [rsp + nb430_dz], xmm2 ;# square it mulss xmm0,xmm0 mulss xmm1,xmm1 mulss xmm2,xmm2 addss xmm0, xmm1 addss xmm0, xmm2 movaps xmm4, xmm0 ;# rsq in xmm4 rsqrtss xmm5, xmm4 ;# lookup seed in xmm5 movaps xmm2, xmm5 mulss xmm5, xmm5 movaps xmm1, [rsp + nb430_three] mulss xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb430_half] subss xmm1, xmm5 ;# 30-rsq*lu*lu mulss xmm1, xmm2 mulss xmm0, xmm1 ;# xmm0=rinv mulss xmm4, xmm0 ;# xmm4=r movaps [rsp + nb430_r], xmm4 movaps [rsp + nb430_rinv], xmm0 movaps xmm8, xmm4 ;# r mulss xmm4, [rsp + nb430_gbscale] ;# rgbtab mulss xmm8, [rsp + nb430_tsc] ;# rtab ;# truncate and convert to integers cvttss2si r12d, xmm4 ;# gb cvttss2si r14d, xmm8 ;# lj ;# convert back to float cvtsi2ss xmm6, r12d ;# gb cvtsi2ss xmm10, r14d ;# lj ;# multiply by 4 and 8, respectively shl r12d, 2 ;# gb shl r14d, 3 ;# lj ;# GB index: r12 LJ indices: r14 ;# calculate eps subss xmm4, xmm6 ;# gb subss 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 movss xmm0, [rsi + r12*4] movss xmm1, [rsi + r12*4 + 4] movss xmm2, [rsi + r12*4 + 8] movss xmm3, [rsi + r12*4 + 12] movss xmm4, [rdi + r14*4] movss xmm5, [rdi + r14*4 + 4] movss xmm6, [rdi + r14*4 + 8] movss xmm7, [rdi + r14*4 + 12] movss xmm8, [rdi + r14*4 + 16] movss xmm9, [rdi + r14*4 + 20] movss xmm10, [rdi + r14*4 + 24] movss xmm11, [rdi + r14*4 + 28] ;# 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] mulss xmm3, xmm12 ;# Heps mulss xmm7, xmm13 mulss xmm11, xmm13 mulss xmm2, xmm12 ;# Geps mulss xmm6, xmm13 mulss xmm10, xmm13 mulss xmm3, xmm12 ;# Heps2 mulss xmm7, xmm13 mulss xmm11, xmm13 addss xmm1, xmm2 ;# F+Geps addss xmm5, xmm6 addss xmm9, xmm10 addss xmm1, xmm3 ;# F+Geps+Heps2 = Fp addss xmm5, xmm7 addss xmm9, xmm11 addss xmm3, xmm3 ;# 2*Heps2 addss xmm7, xmm7 addss xmm11, xmm11 addss xmm3, xmm2 ;# 2*Heps2+Geps addss xmm7, xmm6 addss xmm11, xmm10 addss xmm3, xmm1 ;# FF = Fp + 2*Heps2 + Geps addss xmm7, xmm5 addss xmm11, xmm9 mulss xmm1, xmm12 ;# eps*Fp mulss xmm5, xmm13 mulss xmm9, xmm13 addss xmm1, xmm0 ;# VV addss xmm5, xmm4 addss xmm9, xmm8 mulss xmm1, [rsp + nb430_qq] ;# VV*qq = vcoul mulss xmm5, [rsp + nb430_c6] ;# vnb6 mulss xmm9, [rsp + nb430_c12] ;# vnb12 mulss xmm3, [rsp + nb430_qq] ;# FF*qq = fij mulss xmm7, [rsp + nb430_c6] ;# fijD mulss xmm11, [rsp + nb430_c12] ;#fijR addss xmm11, xmm7 ;# fijD+fijR mulss xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale ;# accumulate Vvdwtot addss xmm5, [rsp + nb430_Vvdwtot] addss xmm5, xmm9 movss [rsp + nb430_Vvdwtot], xmm5 mov rsi, [rbp + nb430_dvda] ;# Calculate dVda mulss xmm3, [rsp + nb430_gbscale] ;# fijC=qq*FF*gbscale movaps xmm6, xmm3 mulss xmm6, [rsp + nb430_r] addss xmm6, xmm1 ;# vcoul+fijC*r addss xmm3, xmm11 ;# fijC+fijD+fijR ;# increment vctot addss xmm1, [rsp + nb430_vctot] movss [rsp + nb430_vctot], xmm1 ;# xmm6=(vcoul+fijC*r) xorps xmm7, xmm7 subss xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addss xmm7, [rsp + nb430_dvdasum] movss [rsp + nb430_dvdasum], xmm7 ;# update j atoms dvdaj ;# xmm6=dvdaj1 addss xmm6, [rsi + rax*4] movss [rsi + rax*4], xmm6 xorps xmm4, xmm4 mulss xmm3, [rsp + nb430_rinv] subss xmm4, xmm3 movss xmm9, xmm4 movss xmm10, xmm4 movss xmm11, xmm4 mulss xmm9, [rsp + nb430_dx] mulss xmm10, [rsp + nb430_dy] mulss xmm11, [rsp + nb430_dz] ;# accumulate i forces movaps xmm12, [rsp + nb430_fix] movaps xmm13, [rsp + nb430_fiy] movaps xmm14, [rsp + nb430_fiz] addss xmm12, xmm9 addss xmm13, xmm10 addss xmm14, xmm11 movss [rsp + nb430_fix], xmm12 movss [rsp + nb430_fiy], xmm13 movss [rsp + nb430_fiz], xmm14 mov rsi, [rbp + nb430_faction] ;# add to j forces addss xmm9, [rsi + r8*4] addss xmm10, [rsi + r8*4 + 4] addss xmm11, [rsi + r8*4 + 8] movss [rsi + r8*4], xmm9 movss [rsi + r8*4 + 4], xmm10 movss [rsi + r8*4 + 8], xmm11 .nb430_updateouterdata: mov ecx, [rsp + nb430_ii3] mov rdi, [rbp + nb430_faction] mov rsi, [rbp + nb430_fshift] mov edx, [rsp + nb430_is3] ;# accumulate i forces in xmm0, xmm1, xmm2 movaps xmm0, [rsp + nb430_fix] movaps xmm1, [rsp + nb430_fiy] movaps xmm2, [rsp + nb430_fiz] movhlps xmm3, xmm0 movhlps xmm4, xmm1 movhlps xmm5, xmm2 addps xmm0, xmm3 addps xmm1, xmm4 addps xmm2, xmm5 ;# sum is in 1/2 in xmm0-xmm2 movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 shufps xmm3, xmm3, 1 shufps xmm4, xmm4, 1 shufps xmm5, xmm5, 1 addss xmm0, xmm3 addss xmm1, xmm4 addss xmm2, xmm5 ;# xmm0-xmm2 has single force in pos0 ;# increment i force movss xmm3, [rdi + rcx*4] movss xmm4, [rdi + rcx*4 + 4] movss xmm5, [rdi + rcx*4 + 8] subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movss [rdi + rcx*4], xmm3 movss [rdi + rcx*4 + 4], xmm4 movss [rdi + rcx*4 + 8], xmm5 ;# increment fshift force movss xmm3, [rsi + rdx*4] movss xmm4, [rsi + rdx*4 + 4] movss xmm5, [rsi + rdx*4 + 8] subss xmm3, xmm0 subss xmm4, xmm1 subss xmm5, xmm2 movss [rsi + rdx*4], xmm3 movss [rsi + rdx*4 + 4], xmm4 movss [rsi + rdx*4 + 8], xmm5 ;# get n from stack mov esi, [rsp + nb430_n] ;# get group index for i particle mov rdx, [rbp + nb430_gid] ;# base of gid[] mov edx, [rdx + rsi*4] ;# ggid=gid[n] ;# accumulate total potential energy and update it movaps xmm7, [rsp + nb430_vctot] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 ;# add earlier value from mem mov rax, [rbp + nb430_Vc] addss xmm7, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm7 ;# accumulate total lj energy and update it movaps xmm7, [rsp + nb430_Vvdwtot] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 ;# add earlier value from mem mov rax, [rbp + nb430_Vvdw] addss xmm7, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm7 ;# accumulate dVda and update it movaps xmm7, [rsp + nb430_dvdasum] ;# accumulate movhlps xmm6, xmm7 addps xmm7, xmm6 ;# pos 0-1 in xmm7 have the sum now movaps xmm6, xmm7 shufps xmm6, xmm6, 1 addss xmm7, xmm6 mov edx, [rsp + nb430_ii] mov rax, [rbp + nb430_dvda] addss xmm7, [rax + rdx*4] movss [rax + rdx*4], xmm7 ;# finish if last mov ecx, [rsp + nb430_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb430_outerend ;# not last, iterate outer loop once more! mov [rsp + nb430_n], esi jmp .nb430_outer.nb430_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb430_nri] ;# esi already loaded with n above sub ecx, esi jz .nb430_end ;# non-zero, do one more workunit jmp .nb430_threadloop.nb430_end: mov eax, [rsp + nb430_nouter] mov ebx, [rsp + nb430_ninner] mov rcx, [rbp + nb430_outeriter] mov rdx, [rbp + nb430_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 552 emms pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret.globl nb_kernel430nf_x86_64_sse.globl _nb_kernel430nf_x86_64_ssenb_kernel430nf_x86_64_sse: _nb_kernel430nf_x86_64_sse: ;# Room for return address and rbp (16 bytes).equiv nb430nf_fshift, 16.equiv nb430nf_gid, 24.equiv nb430nf_pos, 32.equiv nb430nf_faction, 40.equiv nb430nf_charge, 48.equiv nb430nf_p_facel, 56.equiv nb430nf_argkrf, 64.equiv nb430nf_argcrf, 72.equiv nb430nf_Vc, 80.equiv nb430nf_type, 88.equiv nb430nf_p_ntype, 96.equiv nb430nf_vdwparam, 104.equiv nb430nf_Vvdw, 112.equiv nb430nf_p_tabscale, 120.equiv nb430nf_VFtab, 128.equiv nb430nf_invsqrta, 136.equiv nb430nf_dvda, 144.equiv nb430nf_p_gbtabscale, 152.equiv nb430nf_GBtab, 160.equiv nb430nf_p_nthreads, 168.equiv nb430nf_count, 176.equiv nb430nf_mtx, 184.equiv nb430nf_outeriter, 192.equiv nb430nf_inneriter, 200.equiv nb430nf_work, 208 ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb430nf_ix, 0.equiv nb430nf_iy, 16.equiv nb430nf_iz, 32.equiv nb430nf_iq, 48.equiv nb430nf_gbtsc, 64.equiv nb430nf_tsc, 80.equiv nb430nf_qq, 96
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?