nb_kernel130_x86_64_sse.intel_syntax.s

来自「最著名最快的分子模拟软件」· S 代码 · 共 1,919 行 · 第 1/4 页

S
1,919
字号
    addps  xmm5, xmm4 ;# VV    addps  xmm9, xmm8    mulps  xmm5, xmm12  ;# VV*c6 = vnb6    mulps  xmm9, xmm13  ;# VV*c12 = vnb12    addps  xmm5, xmm9    addps  xmm5, [rsp + nb130_Vvdwtot]    movaps [rsp + nb130_Vvdwtot], xmm5            mulps  xmm7, xmm12   ;# FF*c6 = fnb6    mulps  xmm11, xmm13   ;# FF*c12  = fnb12    addps  xmm7, xmm11        mulps  xmm7, [rsp + nb130_tsc]    subps  xmm3, xmm7    mulps  xmm3, xmm0   ;# fscal    movaps xmm9, xmm3    movaps xmm10, xmm3    movaps xmm11, xmm3        movaps xmm12, [rsp + nb130_fix]    movaps xmm13, [rsp + nb130_fiy]    movaps xmm14, [rsp + nb130_fiz]        mulps  xmm9,  [rsp + nb130_dx]    mulps  xmm10, [rsp + nb130_dy]    mulps  xmm11, [rsp + nb130_dz]    ;# accumulate i forces    addps xmm12, xmm9    addps xmm13, xmm10    addps xmm14, xmm11    movaps [rsp + nb130_fix], xmm12    movaps [rsp + nb130_fiy], xmm13    movaps [rsp + nb130_fiz], xmm14    	mov rsi, [rbp + nb130_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + rax*4] ;# x1 y1 - -	movlps xmm1, [rsi + rcx*4] ;# x3 y3 - -	movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2	movhps xmm1, [rsi + rdx*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 + rax*4], xmm0	movlps [rsi + rcx*4], xmm1	movhps [rsi + rbx*4], xmm0	movhps [rsi + rdx*4], xmm1        ;# xmm11: fjz1 fjz2 fjz3 fjz4    pshufd  xmm10, xmm11, 1  ;# fjz2 - - -    movhlps xmm9,  xmm11     ;# fjz3 - - -    pshufd  xmm8,  xmm11, 3  ;# fjz4 - - -    	addss  xmm11, [rsi + rax*4 + 8]	addss  xmm10, [rsi + rbx*4 + 8]	addss  xmm9,  [rsi + rcx*4 + 8]	addss  xmm8,  [rsi + rdx*4 + 8]    	movss  [rsi + rax*4 + 8], xmm11	movss  [rsi + rbx*4 + 8], xmm10	movss  [rsi + rcx*4 + 8], xmm9	movss  [rsi + rdx*4 + 8], xmm8		;# should we do one more iteration? 	sub dword ptr [rsp + nb130_innerk],  4	jl    .nb130_finish_inner	jmp   .nb130_unroll_loop.nb130_finish_inner:	;# check if at least two particles remain 	add dword ptr [rsp + nb130_innerk],  4	mov   edx, [rsp + nb130_innerk]	and   edx, 2	jnz   .nb130_dopair	jmp   .nb130_checksingle.nb130_dopair:	    mov   rcx, [rsp + nb130_innerjjnr]		mov   eax, [rcx]		mov   ebx, [rcx + 4]              	add qword ptr [rsp + nb130_innerjjnr],  8		mov rsi, [rbp + nb130_charge]	movss xmm0, [rsi + rax*4]	movss xmm2, [rsi + rbx*4]    unpcklps xmm0, xmm2  ;# jqa jqb 	mulps xmm0, [rsp + nb130_iq]     movaps [rsp + nb130_qq], xmm0	mov rsi, [rbp + nb130_type]    ;# vdw parameters	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb130_ntia]	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb130_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 + nb130_c6], xmm0    movaps [rsp + nb130_c12], xmm3    	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		;# load coordinates	mov rdi, [rbp + nb130_pos]    	movlps xmm1, [rdi + rax*4]	;# x1 y1 - - 	movlps xmm2, [rdi + rbx*4]	;# x2 y2 - - 	movss xmm5, [rdi + rax*4 + 8]	;# z1 - - - 	movss xmm6, [rdi + rbx*4 + 8]	;# z2 - - -     unpcklps xmm1, xmm2 ;# x1 x2 y1 y2    movhlps  xmm2, xmm1 ;# y1 y2 -  -    unpcklps xmm5, xmm6 ;# z1 z2 -  -	;# calc dr  	subps xmm1, [rsp + nb130_ix]	subps xmm2, [rsp + nb130_iy]	subps xmm5, [rsp + nb130_iz]	;# store dr    movaps [rsp + nb130_dx], xmm1    movaps [rsp + nb130_dy], xmm2    movaps [rsp + nb130_dz], xmm5    	;# square it 	mulps xmm1,xmm1	mulps xmm2,xmm2	mulps xmm5,xmm5	addps xmm1, xmm2	addps xmm1, xmm5	;# rsq in xmm1        ;# calculate rinv=1/sqrt(rsq)	rsqrtps xmm5, xmm1	movaps xmm2, xmm5	mulps xmm5, xmm5	movaps xmm4, [rsp + nb130_three]	mulps xmm5, xmm1	;# rsq*lu*lu 	    subps xmm4, xmm5	;# 30-rsq*lu*lu 	mulps xmm4, xmm2		mulps xmm4, [rsp + nb130_half]		movaps xmm2, xmm4	mulps  xmm1, xmm4	    ;# xmm2=rinv    ;# xmm1=r    mulps xmm1, [rsp + nb130_tsc] ;# rtab    ;# truncate and convert to integers    cvttps2dq xmm5, xmm1        ;# convert back to float    cvtdq2ps  xmm4, xmm5        ;# multiply by 8    pslld   xmm5, 3    ;# calculate eps    subps     xmm1, xmm4    ;# move to integer registers    movd    r8d, xmm5    pshufd  xmm5, xmm5, 1    movd    r9d, xmm5    ;# xmm1=eps    ;# xmm2=rinv    	mov rsi, [rbp + nb130_VFtab]    ;# calculate LJ table    movlps xmm4, [rsi + r8*4]    	movlps xmm5, [rsi + r9*4]     unpcklps xmm4, xmm5     movhlps  xmm5, xmm4         movlps xmm6, [rsi + r8*4 + 8]    	movlps xmm7, [rsi + r9*4 + 8]     movaps  xmm0, xmm2             ;# rinv    mulps   xmm2, [rsp + nb130_qq] ;# vcoul=rinv*qq    movaps  xmm3, xmm2             ;# copy of vcoul (to calc fscal)    mulps   xmm3, xmm0             ;# vcoul*rinv        unpcklps xmm6, xmm7     movhlps  xmm7, xmm6         movlps xmm8, [rsi + r8*4 + 16]    	movlps xmm9, [rsi + r9*4 + 16]     unpcklps xmm8, xmm9     movhlps  xmm9, xmm8         addps   xmm2, [rsp + nb130_vctot]    movlps  [rsp + nb130_vctot], xmm2        movlps xmm10, [rsi + r8*4 + 24]    	movlps xmm11, [rsi + r9*4 + 24]     unpcklps xmm10, xmm11    movhlps  xmm11, xmm10    ;# dispersion table in xmm4-xmm7, repulsion table in xmm8-xmm11        mulps  xmm7, xmm1    ;# Heps    mulps  xmm11, xmm1     mulps  xmm6, xmm1   ;# Geps    mulps  xmm10, xmm1     mulps  xmm7, xmm1   ;# Heps2    mulps  xmm11, xmm1     addps  xmm5, xmm6  ;# F+Geps    addps  xmm9, xmm10     addps  xmm5, xmm7   ;# F+Geps+Heps2 = Fp    addps  xmm9, xmm11     addps  xmm7, xmm7    ;# 2*Heps2    addps  xmm11, xmm11    addps  xmm7, xmm6   ;# 2*Heps2+Geps    addps  xmm11, xmm10        addps  xmm7, xmm5  ;# FF = Fp + 2*Heps2 + Geps    addps  xmm11, xmm9    mulps  xmm5, xmm1  ;# eps*Fp    mulps  xmm9, xmm1    movaps xmm12, [rsp + nb130_c6]    movaps xmm13, [rsp + nb130_c12]    addps  xmm5, xmm4 ;# VV    addps  xmm9, xmm8    mulps  xmm5, xmm12  ;# VV*c6 = vnb6    mulps  xmm9, xmm13  ;# VV*c12 = vnb12    addps  xmm5, xmm9    addps  xmm5, [rsp + nb130_Vvdwtot]    movlps [rsp + nb130_Vvdwtot], xmm5            mulps  xmm7, xmm12   ;# FF*c6 = fnb6    mulps  xmm11, xmm13   ;# FF*c12  = fnb12    addps  xmm7, xmm11        mulps  xmm7, [rsp + nb130_tsc]    subps  xmm3, xmm7    mulps  xmm3, xmm0   ;# fscal    movaps xmm9, xmm3    movaps xmm10, xmm3    movaps xmm11, xmm3        xorps  xmm8, xmm8    movaps xmm12, [rsp + nb130_fix]    movaps xmm13, [rsp + nb130_fiy]    movaps xmm14, [rsp + nb130_fiz]        mulps  xmm9,  [rsp + nb130_dx]    mulps  xmm10, [rsp + nb130_dy]    mulps  xmm11, [rsp + nb130_dz]    movlhps xmm9, xmm8    movlhps xmm10, xmm8    movlhps xmm11, xmm8        ;# accumulate i forces    addps xmm12, xmm9    addps xmm13, xmm10    addps xmm14, xmm11    movaps [rsp + nb130_fix], xmm12    movaps [rsp + nb130_fiy], xmm13    movaps [rsp + nb130_fiz], xmm14    	mov rsi, [rbp + nb130_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + rax*4] ;# x1 y1 - -	movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2    unpcklps xmm9, xmm10  ;# x1 y1 x2 y2    addps    xmm0, xmm9	movlps [rsi + rax*4], xmm0	movhps [rsi + rbx*4], xmm0        ;# z forces    pshufd xmm8, xmm11, 1    addss  xmm11, [rsi + rax*4 + 8]     addss  xmm8,  [rsi + rbx*4 + 8]    movss  [rsi + rax*4 + 8], xmm11    movss  [rsi + rbx*4 + 8], xmm8	.nb130_checksingle:					mov   edx, [rsp + nb130_innerk]	and   edx, 1	jnz    .nb130_dosingle	jmp    .nb130_updateouterdata.nb130_dosingle:	mov rdi, [rbp + nb130_pos]	mov   rcx, [rsp + nb130_innerjjnr]	mov   eax, [rcx]		mov rsi, [rbp + nb130_charge]	movss xmm0, [rsi + rax*4]	mulss xmm0, [rsp + nb130_iq]     movaps [rsp + nb130_qq], xmm0	mov rsi, [rbp + nb130_type]    ;# vdw parameters	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb130_ntia]	add r12d, edi	mov rsi, [rbp + nb130_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb130_c6], xmm0    movaps [rsp + nb130_c12], xmm3    	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	mov rdi, [rbp + nb130_pos]	;# load coordinates	movss xmm1, [rdi + rax*4]		movss xmm2, [rdi + rax*4 + 4]	movss xmm5, [rdi + rax*4 + 8]	;# calc dr  	subss xmm1, [rsp + nb130_ix]	subss xmm2, [rsp + nb130_iy]	subss xmm5, [rsp + nb130_iz]	;# store dr    movaps [rsp + nb130_dx], xmm1    movaps [rsp + nb130_dy], xmm2    movaps [rsp + nb130_dz], xmm5    	;# square it 	mulss xmm1,xmm1	mulss xmm2,xmm2	mulss xmm5,xmm5	addss xmm1, xmm2	addss xmm1, xmm5	;# rsq in xmm1        ;# calculate rinv=1/sqrt(rsq)	rsqrtss xmm5, xmm1	movaps xmm2, xmm5	mulss xmm5, xmm5	movaps xmm4, [rsp + nb130_three]	mulss xmm5, xmm1	;# rsq*lu*lu 	    subss xmm4, xmm5	;# 30-rsq*lu*lu 	mulss xmm4, xmm2		mulss xmm4, [rsp + nb130_half]		movaps xmm2, xmm4	mulss  xmm1, xmm4	    ;# xmm2=rinv    ;# xmm1=r    mulss xmm1, [rsp + nb130_tsc] ;# rtab    ;# truncate and convert to integers    cvttss2si r8d, xmm1        ;# convert back to float    cvtsi2ss  xmm4, r8d        ;# multiply by 8    shl      r8d, 3    ;# calculate eps    subss     xmm1, xmm4    ;# xmm1=eps    ;# xmm2=rinv    	mov rsi, [rbp + nb130_VFtab]    ;# calculate LJ table    movss xmm4, [rsi + r8*4]    	movss xmm5, [rsi + r8*4 + 4]     movss xmm6, [rsi + r8*4 + 8]    	movss xmm7, [rsi + r8*4 + 12]     movss xmm8, [rsi + r8*4 + 16]    	movss xmm9, [rsi + r8*4 + 20]     movss xmm10, [rsi + r8*4 + 24]     	movss xmm11, [rsi + r8*4 + 28]     ;# dispersion table in xmm4-xmm7, repulsion table in xmm8-xmm11    ;# coulomb interaction    movaps  xmm0, xmm2             ;# rinv    mulss   xmm2, [rsp + nb130_qq] ;# vcoul=rinv*qq    movaps  xmm3, xmm2             ;# copy of vcoul (to calc fscal)    mulss   xmm3, xmm0             ;# vcoul*rinv        addss   xmm2, [rsp + nb130_vctot]    movss   [rsp + nb130_vctot], xmm2        ;# calculate table interaction    mulss  xmm7, xmm1    ;# Heps    mulss  xmm11, xmm1     mulss  xmm6, xmm1   ;# Geps    mulss  xmm10, xmm1     mulss  xmm7, xmm1   ;# Heps2    mulss  xmm11, xmm1     addss  xmm5, xmm6  ;# F+Geps    addss  xmm9, xmm10     addss  xmm5, xmm7   ;# F+Geps+Heps2 = Fp    addss  xmm9, xmm11     addss  xmm7, xmm7    ;# 2*Heps2    addss  xmm11, xmm11    addss  xmm7, xmm6   ;# 2*Heps2+Geps    addss  xmm11, xmm10        addss  xmm7, xmm5  ;# FF = Fp + 2*Heps2 + Geps    addss  xmm11, xmm9    mulss  xmm5, xmm1  ;# eps*Fp    mulss  xmm9, xmm1    movaps xmm12, [rsp + nb130_c6]    movaps xmm13, [rsp + nb130_c12]    addss  xmm5, xmm4 ;# VV    addss  xmm9, xmm8    mulss  xmm5, xmm12  ;# VV*c6 = vnb6    mulss  xmm9, xmm13  ;# VV*c12 = vnb12    addss  xmm5, xmm9    addss  xmm5, [rsp + nb130_Vvdwtot]    movss  [rsp + nb130_Vvdwtot], xmm5            mulss  xmm7, xmm12   ;# FF*c6 = fnb6    mulss  xmm11, xmm13   ;# FF*c12  = fnb12    addss  xmm7, xmm11        mulss  xmm7, [rsp + nb130_tsc]    subss  xmm3, xmm7    mulss  xmm3, xmm0   ;# fscal    movaps xmm9, xmm3    movaps xmm10, xmm3    movaps xmm11, xmm3        movaps xmm12, [rsp + nb130_fix]    movaps xmm13, [rsp + nb130_fiy]    movaps xmm14, [rsp + nb130_fiz]        mulss  xmm9,  [rsp + nb130_dx]    mulss  xmm10, [rsp + nb130_dy]    mulss  xmm11, [rsp + nb130_dz]        ;# accumulate i forces    addss xmm12, xmm9    addss xmm13, xmm10    addss xmm14, xmm11    movaps [rsp + nb130_fix], xmm12    movaps [rsp + nb130_fiy], xmm13    movaps [rsp + nb130_fiz], xmm14    	mov rsi, [rbp + nb130_faction]    ;# add to j forces    addss  xmm9,  [rsi + rax*4]    addss  xmm10, [rsi + rax*4 + 4]    addss  xmm11, [rsi + rax*4 + 8]

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?