nb_kernel330_x86_64_sse.intel_syntax.s

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

S
2,051
字号
    mulps  xmm3, [rsp + nb330_qq]    ;# FF*qq = fij    mulps  xmm7, [rsp + nb330_c6]   ;# fijD    mulps  xmm11, [rsp + nb330_c12]   ;#fijR    ;# accumulate vctot    addps  xmm1, [rsp + nb330_vctot]    ;# accumulate Vvdwtot    addps  xmm5, [rsp + nb330_Vvdwtot]    addps  xmm5, xmm9    xorps  xmm9, xmm9    movaps [rsp + nb330_vctot], xmm1    movaps [rsp + nb330_Vvdwtot], xmm5    	mov rsi, [rbp + nb330_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 - -    addps  xmm3, xmm7    addps  xmm3, xmm11    mulps  xmm3, xmm15    mulps  xmm3, [rsp + nb330_tsc]  ;# fscal        subps  xmm9, xmm3    movaps xmm10, xmm9    movaps xmm11, xmm9    	movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2	movhps xmm1, [rsi + rdx*4] ;# x3 y3 x4 y4    movaps xmm12, [rsp + nb330_fix]    movaps xmm13, [rsp + nb330_fiy]    movaps xmm14, [rsp + nb330_fiz]        mulps  xmm9,  [rsp + nb330_dx]    mulps  xmm10, [rsp + nb330_dy]    mulps  xmm11, [rsp + nb330_dz]    ;# accumulate i forces    addps xmm12, xmm9    addps xmm13, xmm10    addps xmm14, xmm11    movaps [rsp + nb330_fix], xmm12    movaps [rsp + nb330_fiy], xmm13    movaps [rsp + nb330_fiz], xmm14        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 + nb330_innerk],  4	jl    .nb330_finish_inner	jmp   .nb330_unroll_loop.nb330_finish_inner:	;# check if at least two particles remain 	add dword ptr [rsp + nb330_innerk],  4	mov   edx, [rsp + nb330_innerk]	and   edx, 2	jnz   .nb330_dopair	jmp   .nb330_checksingle.nb330_dopair:	    mov   rcx, [rsp + nb330_innerjjnr]		mov   eax, [rcx]		mov   ebx, [rcx + 4]              	add qword ptr [rsp + nb330_innerjjnr],  8		mov rsi, [rbp + nb330_charge]	movss xmm0, [rsi + rax*4]	movss xmm2, [rsi + rbx*4]    unpcklps xmm0, xmm2  ;# jqa jqb 	mulps xmm0, [rsp + nb330_iq]     movaps [rsp + nb330_qq], xmm0	mov rsi, [rbp + nb330_type]    ;# vdw parameters	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb330_ntia]	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb330_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 + nb330_c6], xmm0    movaps [rsp + nb330_c12], xmm3    	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		;# load coordinates	mov rdi, [rbp + nb330_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 + nb330_ix]	subps xmm2, [rsp + nb330_iy]	subps xmm5, [rsp + nb330_iz]	;# store dr    movaps [rsp + nb330_dx], xmm1    movaps [rsp + nb330_dy], xmm2    movaps [rsp + nb330_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 + nb330_three]	mulps xmm5, xmm1	;# rsq*lu*lu 	    subps xmm4, xmm5	;# 30-rsq*lu*lu 	mulps xmm4, xmm2		mulps xmm4, [rsp + nb330_half]		movaps xmm15, xmm4	mulps  xmm1, xmm4	    ;# xmm15=rinv    ;# xmm1=r    mulps xmm1, [rsp + nb330_tsc] ;# rtab    ;# truncate and convert to integers    cvttps2dq xmm5, xmm1        ;# convert back to float    cvtdq2ps  xmm4, xmm5        ;# multiply by 4    pslld   xmm5, 2    ;# multiply by three (copy, mult. by two, add back)    movaps  xmm6, xmm5    pslld   xmm5, 1    paddd   xmm5, xmm6    ;# calculate eps    subps     xmm1, xmm4    ;# move to integer registers    movd    r8d, xmm5    pshufd  xmm5, xmm5, 1    movd    r9d, xmm5    movaps [rsp + nb330_eps], xmm1    ;# xmm15=rinv    	mov rsi, [rbp + nb330_VFtab]    ;# load Coulomb and LJ table data in parallel   	movlps xmm0, [rsi + r8*4]        ;# Y1c F1c    	movlps xmm4, [rsi + r8*4 + 16]   ;# Y1d F1d    	movlps xmm8, [rsi + r8*4 + 32]   ;# Y1r F1r 	movlps xmm1, [rsi + r9*4]        ;# Y2c F2c	movlps xmm5, [rsi + r9*4 + 16]   ;# Y2d F2d	movlps xmm9, [rsi + r9*4 + 32]  ;# Y2r F2r    unpcklps xmm0, xmm1 ;# Y1c Y2c F1c F2c    unpcklps xmm4, xmm5 ;# Y1d Y2d F1d F2d    unpcklps xmm8, xmm9 ;# Y1r Y2r F1r F2r    movhlps  xmm1, xmm0 ;# F1c F2c    movhlps  xmm5, xmm4 ;# F1d F2d    movhlps  xmm9, xmm8 ;# F1r F2r       	movlps xmm2, [rsi + r8*4 + 8]    ;# G1c H1c    	movlps xmm6, [rsi + r8*4 + 24]   ;# G1d H1d    	movlps xmm10, [rsi + r8*4 + 40]  ;# G1r H1r 	movlps xmm3, [rsi + r9*4 + 8]    ;# G2c H2c	movlps xmm7, [rsi + r9*4 + 24]   ;# G2d H2d	movlps xmm11, [rsi + r9*4 + 40]  ;# G2r H2r    unpcklps xmm2, xmm3   ;# G1c G2c H1c H2c    unpcklps xmm6, xmm7   ;# G1d G2d H1d H2d    unpcklps xmm10, xmm11 ;# G1r G2r H1r H2r    movhlps  xmm3, xmm2   ;# H1c H2c    movhlps  xmm7, xmm6   ;# H1d H2d    movhlps  xmm11, xmm10 ;# H1r H2r    ;# table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11    movaps xmm12, [rsp + nb330_eps]        mulps  xmm3, xmm12   ;# Heps    mulps  xmm7, xmm12    mulps  xmm11, xmm12    mulps  xmm2, xmm12     ;# Geps    mulps  xmm6, xmm12    mulps  xmm10, xmm12    mulps  xmm3, xmm12   ;# Heps2    mulps  xmm7, xmm12    mulps  xmm11, xmm12    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, xmm12    mulps  xmm9, xmm12    addps  xmm1, xmm0     ;# VV    addps  xmm5, xmm4    addps  xmm9, xmm8    mulps  xmm1, [rsp + nb330_qq]   ;# VV*qq = vcoul    mulps  xmm5, [rsp + nb330_c6]   ;# vnb6    mulps  xmm9, [rsp + nb330_c12]   ;# vnb12    mulps  xmm3, [rsp + nb330_qq]    ;# FF*qq = fij    mulps  xmm7, [rsp + nb330_c6]   ;# fijD    mulps  xmm11, [rsp + nb330_c12]   ;#fijR    ;# accumulate vctot    addps  xmm1, [rsp + nb330_vctot]    movlps [rsp + nb330_vctot], xmm1    ;# accumulate Vvdwtot    addps  xmm5, [rsp + nb330_Vvdwtot]    addps  xmm5, xmm9    movlps [rsp + nb330_Vvdwtot], xmm5    xorps  xmm9, xmm9        addps  xmm3, xmm7    addps  xmm3, xmm11    mulps  xmm3, xmm15    mulps  xmm3, [rsp + nb330_tsc]  ;# fscal        subps  xmm9, xmm3    movaps xmm10, xmm9    movaps xmm11, xmm9        movaps xmm12, [rsp + nb330_fix]    movaps xmm13, [rsp + nb330_fiy]    movaps xmm14, [rsp + nb330_fiz]        mulps  xmm9,  [rsp + nb330_dx]    mulps  xmm10, [rsp + nb330_dy]    mulps  xmm11, [rsp + nb330_dz]    ;# accumulate i forces    addps xmm12, xmm9    addps xmm13, xmm10    addps xmm14, xmm11    movlps [rsp + nb330_fix], xmm12    movlps [rsp + nb330_fiy], xmm13    movlps [rsp + nb330_fiz], xmm14    	mov rsi, [rbp + nb330_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	.nb330_checksingle:					mov   edx, [rsp + nb330_innerk]	and   edx, 1	jnz    .nb330_dosingle	jmp    .nb330_updateouterdata.nb330_dosingle:	mov rdi, [rbp + nb330_pos]	mov   rcx, [rsp + nb330_innerjjnr]	mov   eax, [rcx]		mov rsi, [rbp + nb330_charge]	movss xmm0, [rsi + rax*4]	mulss xmm0, [rsp + nb330_iq]     movaps [rsp + nb330_qq], xmm0    ;# vdw parameters	mov rsi, [rbp + nb330_type]	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb330_ntia]	add r12d, edi	mov rsi, [rbp + nb330_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb330_c6], xmm0    movaps [rsp + nb330_c12], xmm3    	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	mov rdi, [rbp + nb330_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 + nb330_ix]	subss xmm2, [rsp + nb330_iy]	subss xmm5, [rsp + nb330_iz]	;# store dr    movaps [rsp + nb330_dx], xmm1    movaps [rsp + nb330_dy], xmm2    movaps [rsp + nb330_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 + nb330_three]	mulss xmm5, xmm1	;# rsq*lu*lu 	    subss xmm4, xmm5	;# 30-rsq*lu*lu 	mulss xmm4, xmm2		mulss xmm4, [rsp + nb330_half]		movaps xmm15, xmm4	mulss  xmm1, xmm4	    ;# xmm15=rinv    ;# xmm1=r    mulss xmm1, [rsp + nb330_tsc] ;# rtab    ;# truncate and convert to integers    cvttss2si r8d, xmm1        ;# convert back to float    cvtsi2ss  xmm4, r8d        ;# multiply by 4    shl       r8d, 2    ;# calculate eps    subss     xmm1, xmm4    ;# mult. by 3	lea   r8, [r8 + r8*2]      movaps [rsp + nb330_eps], xmm1    ;# xmm15=rinv    	mov rsi, [rbp + nb330_VFtab]    ;# load Coulomb and LJ table data in parallel    movss  xmm0,  [rsi + r8*4]    movss  xmm1,  [rsi + r8*4 + 4]    movss  xmm2,  [rsi + r8*4 + 8]    movss  xmm3,  [rsi + r8*4 + 12]    movss  xmm4,  [rsi + r8*4 + 16]    movss  xmm5,  [rsi + r8*4 + 20]    movss  xmm6,  [rsi + r8*4 + 24]    movss  xmm7,  [rsi + r8*4 + 28]    movss  xmm8,  [rsi + r8*4 + 32]    movss  xmm9,  [rsi + r8*4 + 36]    movss  xmm10, [rsi + r8*4 + 40]    movss  xmm11, [rsi + r8*4 + 44]    ;# table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11    movaps xmm12, [rsp + nb330_eps]        mulps  xmm3, xmm12   ;# Heps    mulps  xmm7, xmm12    mulps  xmm11, xmm12    mulps  xmm2, xmm12     ;# Geps    mulps  xmm6, xmm12    mulps  xmm10, xmm12    mulps  xmm3, xmm12   ;# Heps2    mulps  xmm7, xmm12    mulps  xmm11, xmm12    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, [rsp + nb330_eps]   ;# eps*Fp    mulps  xmm5, [rsp + nb330_eps]    mulps  xmm9, [rsp + nb330_eps]    addps  xmm1, xmm0     ;# VV    addps  xmm5, xmm4    addps  xmm9, xmm8    mulps  xmm1, [rsp + nb330_qq]   ;# VV*qq = vcoul    mulps  xmm5, [rsp + nb330_c6]   ;# vnb6    mulps  xmm9, [rsp + nb330_c12]   ;# vnb12    mulps  xmm3, [rsp + nb330_qq]    ;# FF*qq = fij    mulps  xmm7, [rsp + nb330_c6]   ;# fijD    mulps  xmm11, [rsp + nb330_c12]   ;#fijR    ;# accumulate vctot    addps  xmm1, [rsp + nb330_vctot]    movaps [rsp + nb330_vctot], xmm1    ;# accumulate Vvdwtot    addps  xmm5, [rsp + nb330_Vvdwtot]    addps  xmm5, xmm9    movaps [rsp + nb330_Vvdwtot], xmm5    xorps  xmm9, xmm9        addps  xmm3, xmm7    addps  xmm3, xmm11    mulss  xmm3, xmm15    mulps  xmm3, [rsp + nb330_tsc]  ;# fscal        subps  xmm9, xmm3    movaps xmm10, xmm9    movaps xmm11, xmm9        movaps xmm12, [rsp + nb330_fix]    movaps xmm13, [rsp + nb330_fiy]    movaps xmm14, [rsp + nb330_fiz]        mulss  xmm9,  [rsp + nb330_dx]    mulss  xmm10, [rsp + nb330_dy]    mulss  xmm11, [rsp + nb330_dz]        ;# accumulate i forces    addss xmm12, xmm9    addss xmm13, xmm10    addss xmm14, xmm11    movaps [rsp + nb330_fix], xmm12    movaps [rsp + nb330_fiy], xmm13    movaps [rsp + nb330_fiz], xmm14    	mov rsi, [rbp + nb330_faction]    ;# add to j forces    addss  xmm9,  [rsi + rax*4]    addss  xmm10, [rsi + rax*4 + 4]

⌨️ 快捷键说明

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