nb_kernel430_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,332 行 · 第 1/5 页
S
2,332 行
.equiv nb430nf_c6, 112.equiv nb430nf_c12, 128.equiv nb430nf_vctot, 144.equiv nb430nf_Vvdwtot, 160.equiv nb430nf_half, 176.equiv nb430nf_three, 192.equiv nb430nf_isai, 208.equiv nb430nf_isaprod, 224.equiv nb430nf_gbscale, 240.equiv nb430nf_r, 256.equiv nb430nf_nri, 272.equiv nb430nf_iinr, 280.equiv nb430nf_jindex, 288.equiv nb430nf_jjnr, 296.equiv nb430nf_shift, 304.equiv nb430nf_shiftvec, 312.equiv nb430nf_facel, 320.equiv nb430nf_innerjjnr, 328.equiv nb430nf_is3, 336.equiv nb430nf_ii3, 340.equiv nb430nf_ntia, 344.equiv nb430nf_innerk, 348.equiv nb430nf_n, 352.equiv nb430nf_nn1, 356.equiv nb430nf_ntype, 360.equiv nb430nf_nouter, 364.equiv nb430nf_ninner, 368 push rbp mov rbp, rsp push rbx emms push r12 push r13 push r14 push r15 sub rsp, 392 ;# local variable stack space (n*16+8) ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb430nf_nouter], eax mov [rsp + nb430nf_ninner], eax mov edi, [rdi] mov [rsp + nb430nf_nri], edi mov [rsp + nb430nf_iinr], rsi mov [rsp + nb430nf_jindex], rdx mov [rsp + nb430nf_jjnr], rcx mov [rsp + nb430nf_shift], r8 mov [rsp + nb430nf_shiftvec], r9 mov rdi, [rbp + nb430nf_p_ntype] mov edi, [rdi] mov [rsp + nb430nf_ntype], edi mov rsi, [rbp + nb430nf_p_facel] movss xmm0, [rsi] movss [rsp + nb430nf_facel], xmm0 mov rax, [rbp + nb430nf_p_tabscale] movss xmm3, [rax] shufps xmm3, xmm3, 0 movaps [rsp + nb430nf_tsc], xmm3 mov rbx, [rbp + nb430nf_p_gbtabscale] movss xmm4, [rbx] shufps xmm4, xmm4, 0 movaps [rsp + nb430nf_gbtsc], xmm4 ;# create constant floating-point factors on stack mov eax, 0x3f000000 ;# half in IEEE (hex) mov [rsp + nb430nf_half], eax movss xmm1, [rsp + nb430nf_half] shufps xmm1, xmm1, 0 ;# splat to all elements movaps xmm2, xmm1 addps xmm2, xmm2 ;# one movaps xmm3, xmm2 addps xmm2, xmm2 ;# two addps xmm3, xmm2 ;# three movaps [rsp + nb430nf_half], xmm1 movaps [rsp + nb430nf_three], xmm3.nb430nf_threadloop: mov rsi, [rbp + nb430nf_count] ;# pointer to sync counter mov eax, [rsi].nb430nf_spinlock: mov ebx, eax ;# ebx=*count=nn0 add ebx, 1 ;# ebx=nn1=nn0+10 lock cmpxchg [esi], ebx ;# write nn1 to *counter, ;# if it hasnt changed. ;# or reread *counter to eax. pause ;# -> better p4 performance jnz .nb430nf_spinlock ;# if(nn1>nri) nn1=nri mov ecx, [rsp + nb430nf_nri] mov edx, ecx sub ecx, ebx cmovle ebx, edx ;# if(nn1>nri) nn1=nri ;# Cleared the spinlock if we got here. ;# eax contains nn0, ebx contains nn1. mov [rsp + nb430nf_n], eax mov [rsp + nb430nf_nn1], ebx sub ebx, eax ;# calc number of outer lists mov esi, eax ;# copy n to esi jg .nb430nf_outerstart jmp .nb430nf_end.nb430nf_outerstart: ;# ebx contains number of outer iterations add ebx, [rsp + nb430nf_nouter] mov [rsp + nb430nf_nouter], ebx.nb430nf_outer: mov rax, [rsp + nb430nf_shift] ;# rax = pointer into shift[] mov ebx, [rax + rsi*4] ;# ebx=shift[n] lea rbx, [rbx + rbx*2] ;# rbx=3*is mov [rsp + nb430nf_is3],ebx ;# store is3 mov rax, [rsp + nb430nf_shiftvec] ;# rax = base of shiftvec[] movss xmm0, [rax + rbx*4] movss xmm1, [rax + rbx*4 + 4] movss xmm2, [rax + rbx*4 + 8] mov rcx, [rsp + nb430nf_iinr] ;# rcx = pointer into iinr[] mov ebx, [rcx + rsi*4] ;# ebx =ii mov rdx, [rbp + nb430nf_charge] movss xmm3, [rdx + rbx*4] mulss xmm3, [rsp + nb430nf_facel] shufps xmm3, xmm3, 0 mov rdx, [rbp + nb430nf_invsqrta] ;# load invsqrta[ii] movss xmm4, [rdx + rbx*4] shufps xmm4, xmm4, 0 mov rdx, [rbp + nb430nf_type] mov edx, [rdx + rbx*4] imul edx, [rsp + nb430nf_ntype] shl edx, 1 mov [rsp + nb430nf_ntia], edx lea rbx, [rbx + rbx*2] ;# rbx = 3*ii=ii3 mov rax, [rbp + nb430nf_pos] ;# rax = base of pos[] addss xmm0, [rax + rbx*4] addss xmm1, [rax + rbx*4 + 4] addss xmm2, [rax + rbx*4 + 8] movaps [rsp + nb430nf_iq], xmm3 movaps [rsp + nb430nf_isai], xmm4 shufps xmm0, xmm0, 0 shufps xmm1, xmm1, 0 shufps xmm2, xmm2, 0 movaps [rsp + nb430nf_ix], xmm0 movaps [rsp + nb430nf_iy], xmm1 movaps [rsp + nb430nf_iz], xmm2 mov [rsp + nb430nf_ii3], ebx ;# clear vctot xorps xmm4, xmm4 movaps [rsp + nb430nf_vctot], xmm4 movaps [rsp + nb430nf_Vvdwtot], xmm4 mov rax, [rsp + nb430nf_jindex] mov ecx, [rax + rsi*4] ;# jindex[n] mov edx, [rax + rsi*4 + 4] ;# jindex[n+1] sub edx, ecx ;# number of innerloop atoms mov rsi, [rbp + nb430nf_pos] mov rdi, [rbp + nb430nf_faction] mov rax, [rsp + nb430nf_jjnr] shl ecx, 2 add rax, rcx mov [rsp + nb430nf_innerjjnr], rax ;# pointer to jjnr[nj0] mov ecx, edx sub edx, 4 add ecx, [rsp + nb430nf_ninner] mov [rsp + nb430nf_ninner], ecx add edx, 0 mov [rsp + nb430nf_innerk], edx ;# number of innerloop atoms jge .nb430nf_unroll_loop jmp .nb430nf_finish_inner.nb430nf_unroll_loop: ;# quad-unroll innerloop here mov rdx, [rsp + nb430nf_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] mov ebx, [rdx + 4] mov ecx, [rdx + 8] mov edx, [rdx + 12] ;# eax-edx=jnr1-4 add qword ptr [rsp + nb430nf_innerjjnr], 16 ;# advance pointer (unrolled 4) ;# load isa2 mov rsi, [rbp + nb430nf_invsqrta] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] movaps xmm2, [rsp + nb430nf_isai] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm2, xmm3 movaps [rsp + nb430nf_isaprod], xmm2 movaps xmm1, xmm2 mulps xmm1, [rsp + nb430nf_gbtsc] movaps [rsp + nb430nf_gbscale], xmm1 mov rsi, [rbp + nb430nf_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] mulps xmm2, [rsp + nb430nf_iq] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 mulps xmm3, xmm2 movaps [rsp + nb430nf_qq], xmm3 movd mm0, eax ;# use mmx registers as temp storage movd mm1, ebx movd mm2, ecx movd mm3, edx mov rsi, [rbp + nb430nf_type] mov eax, [rsi + rax*4] mov ebx, [rsi + rbx*4] mov ecx, [rsi + rcx*4] mov edx, [rsi + rdx*4] mov rsi, [rbp + nb430nf_vdwparam] shl eax, 1 shl ebx, 1 shl ecx, 1 shl edx, 1 mov edi, [rsp + nb430nf_ntia] add eax, edi add ebx, edi add ecx, edi add edx, edi movlps xmm6, [rsi + rax*4] movlps xmm7, [rsi + rcx*4] movhps xmm6, [rsi + rbx*4] movhps xmm7, [rsi + rdx*4] movaps xmm4, xmm6 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm6, xmm7, 221 ;# 11011101 movd eax, mm0 movd ebx, mm1 movd ecx, mm2 movd edx, mm3 movaps [rsp + nb430nf_c6], xmm4 movaps [rsp + nb430nf_c12], xmm6 mov rsi, [rbp + nb430nf_pos] ;# base of pos[] lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] ;# replace jnr with j3 lea rdx, [rdx + rdx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm4, [rsi + rax*4] movlps xmm5, [rsi + rcx*4] movss xmm2, [rsi + rax*4 + 8] movss xmm6, [rsi + rcx*4 + 8] movhps xmm4, [rsi + rbx*4] movhps xmm5, [rsi + rdx*4] movss xmm0, [rsi + rbx*4 + 8] movss xmm1, [rsi + rdx*4 + 8] shufps xmm2, xmm0, 0 shufps xmm6, xmm1, 0 movaps xmm0, xmm4 movaps xmm1, xmm4 shufps xmm2, xmm6, 136 ;# 10001000 shufps xmm0, xmm5, 136 ;# 10001000 shufps xmm1, xmm5, 221 ;# 11011101 ;# move ix-iz to xmm4-xmm6 movaps xmm4, [rsp + nb430nf_ix] movaps xmm5, [rsp + nb430nf_iy] movaps xmm6, [rsp + nb430nf_iz] ;# calc dr subps xmm4, xmm0 subps xmm5, xmm1 subps xmm6, xmm2 ;# 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 + nb430nf_three] mulps xmm5, xmm4 ;# rsq*lu*lu movaps xmm0, [rsp + nb430nf_half] subps xmm1, xmm5 ;# 30-rsq*lu*lu mulps xmm1, xmm2 mulps xmm0, xmm1 ;# xmm0=rinv mulps xmm4, xmm0 ;# xmm4=r movaps [rsp + nb430nf_r], xmm4 mulps xmm4, [rsp + nb430nf_gbscale] movhlps xmm5, xmm4 cvttps2pi mm6, xmm4 cvttps2pi mm7, xmm5 ;# mm6/mm7 contain lu indices cvtpi2ps xmm6, mm6 cvtpi2ps xmm5, mm7 movlhps xmm6, xmm5 subps xmm4, xmm6 movaps xmm1, xmm4 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 2 pslld mm7, 2 movd mm0, eax movd mm1, ebx movd mm2, ecx movd mm3, edx mov rsi, [rbp + nb430nf_GBtab] movd eax, mm6 psrlq mm6, 32 movd ecx, mm7 psrlq mm7, 32 movd ebx, mm6 movd edx, mm7 ;# load coulomb table movaps xmm4, [rsi + rax*4] movaps xmm5, [rsi + rbx*4] movaps xmm6, [rsi + rcx*4] movaps xmm7, [rsi + rdx*4] ;# transpose, using xmm3 for scratch movaps xmm3, xmm6 shufps xmm3, xmm7, 0xEE shufps xmm6, xmm7, 0x44 movaps xmm7, xmm4 shufps xmm7, xmm5, 0xEE shufps xmm4, xmm5, 0x44 movaps xmm5, xmm4 shufps xmm5, xmm6, 0xDD shufps xmm4, xmm6, 0x88 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x88 shufps xmm7, xmm3, 0xDD ;# coulomb table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp movaps xmm3, [rsp + nb430nf_qq] mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, xmm3 ;# vcoul=qq*VV addps xmm5, [rsp + nb430nf_vctot] movaps [rsp + nb430nf_vctot], xmm5 movaps xmm4, [rsp + nb430nf_r] mulps xmm4, [rsp + nb430nf_tsc] movhlps xmm5, xmm4 cvttps2pi mm6, xmm4 cvttps2pi mm7, xmm5 ;# mm6/mm7 contain lu indices cvtpi2ps xmm6, mm6 cvtpi2ps xmm5, mm7 movlhps xmm6, xmm5 subps xmm4, xmm6 movaps xmm1, xmm4 ;# xmm1=eps movaps xmm2, xmm1 mulps xmm2, xmm2 ;# xmm2=eps2 pslld mm6, 3 pslld mm7, 3 mov rsi, [rbp + nb430nf_VFtab] movd eax, mm6 psrlq mm6, 32 movd ecx, mm7 psrlq mm7, 32 movd ebx, mm6 movd edx, mm7 ;# dispersion movaps xmm4, [rsi + rax*4] movaps xmm5, [rsi + rbx*4] movaps xmm6, [rsi + rcx*4] movaps xmm7, [rsi + rdx*4] ;# transpose, using xmm3 for scratch movaps xmm3, xmm6 shufps xmm3, xmm7, 0xEE shufps xmm6, xmm7, 0x44 movaps xmm7, xmm4 shufps xmm7, xmm5, 0xEE shufps xmm4, xmm5, 0x44 movaps xmm5, xmm4 shufps xmm5, xmm6, 0xDD shufps xmm4, xmm6, 0x88 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x88 shufps xmm7, xmm3, 0xDD ;# dispersion table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp mulps xmm5, xmm1 ;# xmm5=eps*Fp addps xmm5, xmm4 ;# xmm5=VV mulps xmm5, [rsp + nb430nf_c6] ;# Vvdw6 addps xmm5, [rsp + nb430nf_Vvdwtot] movaps [rsp + nb430nf_Vvdwtot], xmm5 ;# repulsion movaps xmm4, [rsi + rax*4 + 16] movaps xmm5, [rsi + rbx*4 + 16] movaps xmm6, [rsi + rcx*4 + 16] movaps xmm7, [rsi + rdx*4 + 16] ;# transpose, using xmm3 for scratch movaps xmm3, xmm6 shufps xmm3, xmm7, 0xEE shufps xmm6, xmm7, 0x44 movaps xmm7, xmm4 shufps xmm7, xmm5, 0xEE shufps xmm4, xmm5, 0x44 movaps xmm5, xmm4 shufps xmm5, xmm6, 0xDD shufps xmm4, xmm6, 0x88 movaps xmm6, xmm7 shufps xmm6, xmm3, 0x88 shufps xmm7, xmm3, 0xDD ;# table ready, in xmm4-xmm7 mulps xmm6, xmm1 ;# xmm6=Geps mulps xmm7, xmm2 ;# xmm7=Heps2 addps xmm5, xmm6 addps xmm5, xmm7 ;# xmm5=Fp
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?