nb_kernel400_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 1,664 行 · 第 1/3 页
S
1,664 行
mulps xmm1, [rsp + nb400_gbtsc] movaps [rsp + nb400_gbscale], xmm1 mov rsi, [rbp + nb400_charge] ;# base of charge[] mulps xmm2, [rsp + nb400_iq] movss xmm3, [rsi + rax*4] movss xmm6, [rsi + rbx*4] unpcklps xmm3, xmm6 mulps xmm3, xmm2 movaps [rsp + nb400_qq], xmm3 mov rsi, [rbp + nb400_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 + nb400_ix] subps xmm5, [rsp + nb400_iy] subps xmm6, [rsp + nb400_iz] ;# store dr movaps xmm9, xmm4 movaps xmm10, xmm5 movaps xmm11, 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 + nb400_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb400_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r movaps [rsp + nb400_r], xmm4 mulps xmm4, [rsp + nb400_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 + nb400_GBtab] ;# load table data movlps xmm4, [rsi + r12*4] movlps xmm5, [rsi + r13*4] unpcklps xmm4, xmm5 movhlps xmm5, xmm4 movlps xmm6, [rsi + r12*4 + 8] movlps xmm7, [rsi + r13*4 + 8] unpcklps xmm6, xmm7 movhlps xmm7, xmm6 ;# 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 + nb400_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 ;# zero upper part of vcoul xorps xmm2, xmm2 movlhps xmm5, xmm2 mov rsi, [rbp + nb400_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulps xmm3, [rsp + nb400_gbscale] movaps xmm6, xmm3 mulps xmm6, [rsp + nb400_r] addps xmm6, xmm5 ;# 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, xmm2 ;# update dvdasum addps xmm7, [rsp + nb400_dvdasum] movaps [rsp + nb400_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 xmm4, xmm4 mulps xmm3, xmm0 subps xmm4, xmm3 mulps xmm9, xmm4 mulps xmm10, xmm4 mulps xmm11, xmm4 movlhps xmm9, xmm2 movlhps xmm10, xmm2 movlhps xmm11, xmm2 ;# accumulate i forces addps xmm13, xmm9 addps xmm14, xmm10 addps xmm15, xmm11 mov rsi, [rbp + nb400_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.nb400_checksingle: mov edx, [rsp + nb400_innerk] and edx, 1 jnz .nb400_dosingle jmp .nb400_updateouterdata.nb400_dosingle: mov rcx, [rsp + nb400_innerjjnr] mov eax, [rcx] ;# load isaj mov rsi, [rbp + nb400_invsqrta] movss xmm2, [rsi + rax*4] mulss xmm2, [rsp + nb400_isai] movss [rsp + nb400_isaprod], xmm2 movaps xmm1, xmm2 mulss xmm1, [rsp + nb400_gbtsc] movss [rsp + nb400_gbscale], xmm1 mov rsi, [rbp + nb400_charge] ;# base of charge[] mulss xmm2, [rsp + nb400_iq] movss xmm3, [rsi + rax*4] mulss xmm3, xmm2 movss [rsp + nb400_qq], xmm3 mov rsi, [rbp + nb400_pos] ;# base of pos[] lea r8, [rax + rax*2] ;# j3=3*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 + nb400_ix] subss xmm5, [rsp + nb400_iy] subss xmm6, [rsp + nb400_iz] ;# store dr movaps xmm9, xmm4 movaps xmm10, xmm5 movaps xmm11, 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 + nb400_three] mulss xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb400_half] subss xmm1, xmm5 ;# 30-rsq*lu*lu mulss xmm1, xmm2 mulss xmm0, xmm1 ;# xmm0=rinv mulss xmm4, xmm0 ;# xmm4=r movaps [rsp + nb400_r], xmm4 mulss xmm4, [rsp + nb400_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 + nb400_GBtab] ;# 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 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 + nb400_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 mov rsi, [rbp + nb400_dvda] ;# Calculate dVda xorps xmm7, xmm7 mulss xmm3, [rsp + nb400_gbscale] movaps xmm6, xmm3 mulss xmm6, [rsp + nb400_r] addss xmm6, xmm5 ;# increment vctot (sum in xmm12) addss xmm12, xmm5 ;# xmm6=(vcoul+fijC*r) subss xmm7, xmm6 movaps xmm6, xmm7 ;# update dvdasum addss xmm7, [rsp + nb400_dvdasum] movss [rsp + nb400_dvdasum], xmm7 ;# update j atoms dvdaj addss xmm6, [rsi + rax*4] movss [rsi + rax*4], xmm6 xorps xmm4, xmm4 mulss xmm3, xmm0 subss xmm4, xmm3 mulss xmm9, xmm4 mulss xmm10, xmm4 mulss xmm11, xmm4 ;# accumulate i forces addss xmm13, xmm9 addss xmm14, xmm10 addss xmm15, xmm11 mov rsi, [rbp + nb400_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 .nb400_updateouterdata: mov ecx, [rsp + nb400_ii3] mov rdi, [rbp + nb400_faction] mov rsi, [rbp + nb400_fshift] mov edx, [rsp + nb400_is3] ;# accumulate i forces in xmm13, xmm14, xmm15 movhlps xmm0, xmm13 movhlps xmm1, xmm14 movhlps xmm2, xmm15 addps xmm0, xmm13 addps xmm1, xmm14 addps xmm2, xmm15 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 + nb400_n] ;# get group index for i particle mov rdx, [rbp + nb400_gid] ;# base of gid[] mov edx, [rdx + rsi*4] ;# ggid=gid[n] ;# accumulate total potential energy and update it ;# accumulate movhlps xmm6, xmm12 addps xmm12, xmm6 ;# pos 0-1 in xmm12 have the sum now movaps xmm6, xmm12 shufps xmm6, xmm6, 1 addss xmm12, xmm6 ;# add earlier value from mem mov rax, [rbp + nb400_Vc] addss xmm12, [rax + rdx*4] ;# move back to mem movss [rax + rdx*4], xmm12 ;# accumulate dVda and update it movaps xmm7, [rsp + nb400_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 + nb400_ii] mov rax, [rbp + nb400_dvda] addss xmm7, [rax + rdx*4] movss [rax + rdx*4], xmm7 ;# finish if last mov ecx, [rsp + nb400_nn1] ;# esi already loaded with n inc esi sub ecx, esi jz .nb400_outerend ;# not last, iterate outer loop once more! mov [rsp + nb400_n], esi jmp .nb400_outer.nb400_outerend: ;# check if more outer neighborlists remain mov ecx, [rsp + nb400_nri] ;# esi already loaded with n above sub ecx, esi jz .nb400_end ;# non-zero, do one more workunit jmp .nb400_threadloop.nb400_end: mov eax, [rsp + nb400_nouter] mov ebx, [rsp + nb400_ninner] mov rcx, [rbp + nb400_outeriter] mov rdx, [rbp + nb400_inneriter] mov [rcx], eax mov [rdx], ebx add rsp, 456 emms pop r15 pop r14 pop r13 pop r12 pop rbx pop rbp ret .globl nb_kernel400nf_x86_64_sse.globl _nb_kernel400nf_x86_64_ssenb_kernel400nf_x86_64_sse: _nb_kernel400nf_x86_64_sse: .equiv nb400nf_fshift, 16.equiv nb400nf_gid, 24.equiv nb400nf_pos, 32.equiv nb400nf_faction, 40.equiv nb400nf_charge, 48.equiv nb400nf_p_facel, 56.equiv nb400nf_argkrf, 64.equiv nb400nf_argcrf, 72.equiv nb400nf_Vc, 80.equiv nb400nf_type, 88.equiv nb400nf_p_ntype, 96.equiv nb400nf_vdwparam, 104.equiv nb400nf_Vvdw, 112.equiv nb400nf_p_tabscale, 120.equiv nb400nf_VFtab, 128.equiv nb400nf_invsqrta, 136.equiv nb400nf_dvda, 144.equiv nb400nf_p_gbtabscale, 152.equiv nb400nf_GBtab, 160.equiv nb400nf_p_nthreads, 168.equiv nb400nf_count, 176.equiv nb400nf_mtx, 184.equiv nb400nf_outeriter, 192.equiv nb400nf_inneriter, 200.equiv nb400nf_work, 208 ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb400nf_ix, 0.equiv nb400nf_iy, 16.equiv nb400nf_iz, 32.equiv nb400nf_iq, 48.equiv nb400nf_gbtsc, 64.equiv nb400nf_qq, 80.equiv nb400nf_vctot, 96.equiv nb400nf_half, 112.equiv nb400nf_three, 128.equiv nb400nf_isai, 144.equiv nb400nf_isaprod, 160.equiv nb400nf_gbscale, 176.equiv nb400nf_nri, 192.equiv nb400nf_iinr, 200.equiv nb400nf_jindex, 208.equiv nb400nf_jjnr, 216.equiv nb400nf_shift, 224.equiv nb400nf_shiftvec, 232.equiv nb400nf_facel, 240.equiv nb400nf_innerjjnr, 248.equiv nb400nf_is3, 256.equiv nb400nf_ii3, 260.equiv nb400nf_innerk, 264.equiv nb400nf_n, 268.equiv nb400nf_nn1, 272.equiv nb400nf_nouter, 276.equiv nb400nf_ninner, 280 push rbp mov rbp, rsp push rbx emms push r12 push r13 push r14 push r15 sub rsp, 296 ;# local variable stack space (n*16+8) ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb400nf_nouter], eax mov [rsp + nb400nf_ninner], eax mov edi, [rdi] mov [rsp + nb400nf_nri], edi mov [rsp + nb400nf_iinr], rsi mov [rsp + nb400nf_jindex], rdx mov [rsp + nb400nf_jjnr], rcx mov [rsp + nb400nf_shift], r8 mov [rsp + nb400nf_shiftvec], r9 mov rsi, [rbp + nb400nf_p_facel] movss xmm0, [rsi] movss [rsp + nb400nf_facel], xmm0 mov rbx, [rbp + nb400nf_p_gbtabscale] movss xmm4, [rbx] shufps xmm4, xmm4, 0 movaps [rsp + nb400nf_gbtsc], xmm4 ;# create constant floating-point factors on stack mov eax, 0x3f000000 ;# half in IEEE (hex) mov [rsp + nb400nf_half], eax movss xmm1, [rsp + nb400nf_half] shufps xmm1, xmm1, 0 ;# splat to all elements movaps xmm2, xmm1 addps xmm2, xmm2 ;# one
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?