nb_kernel410_x86_64_sse.intel_syntax.s

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

S
2,011
字号
	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    ;# LJ forces    mulps  xmm10, [rsp + nb410_six]    mulps  xmm9, [rsp + nb410_twelve]    subps  xmm9, xmm10    mulps  xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv	mov rsi, [rbp + nb410_dvda]		;# Calculate dVda	xorps  xmm7, xmm7	mulps xmm3, [rsp + nb410_gbscale]	movaps xmm6, xmm3	mulps  xmm6, [rsp + nb410_r]	addps  xmm6, xmm5        ;# increment vctot (sum in xmm12)	addps  xmm12, xmm5	;# xmm6=(vcoul+fijC*r)	subps  xmm7, xmm6	movaps xmm6, xmm7	    ;# update dvdasum    addps  xmm7, [rsp + nb410_dvdasum]    movaps [rsp + nb410_dvdasum], xmm7 	;# update j atoms dvdaj	movhlps xmm7, xmm6	movaps  xmm5, xmm6	movaps  xmm4, xmm7	shufps  xmm5, xmm5, 0x1	shufps  xmm4, xmm4, 0x1	;# xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4	addss  xmm6, [rsi + rax*4]	addss  xmm5, [rsi + rbx*4]	addss  xmm7, [rsi + rcx*4]	addss  xmm4, [rsi + rdx*4]	movss  [rsi + rax*4], xmm6	movss  [rsi + rbx*4], xmm5	movss  [rsi + rcx*4], xmm7	movss  [rsi + rdx*4], xmm4    subps  xmm9, xmm3    mulps  xmm9, xmm0 ;# fscal    movaps  xmm10, xmm9    movaps  xmm11, xmm9    mulps   xmm9, [rsp + nb410_dx]    mulps   xmm10, [rsp + nb410_dy]    mulps   xmm11, [rsp + nb410_dz]    	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb410_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + r8*4] ;# x1 y1 - -	movlps xmm1, [rsi + r10*4] ;# x3 y3 - -	movhps xmm0, [rsi + r9*4] ;# x1 y1 x2 y2	movhps xmm1, [rsi + r11*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 + r8*4], xmm0	movlps [rsi + r10*4], xmm1	movhps [rsi + r9*4], xmm0	movhps [rsi + r11*4], xmm1        ;# xmm11: fjz1 fjz2 fjz3 fjz4    pshufd  xmm10, xmm11, 1  ;# fjz2 - - -    movhlps xmm9,  xmm11     ;# fjz3 - - -    pshufd  xmm8,  xmm11, 3  ;# fjz4 - - -    	addss  xmm11, [rsi + r8*4 + 8]	addss  xmm10, [rsi + r9*4 + 8]	addss  xmm9,  [rsi + r10*4 + 8]	addss  xmm8,  [rsi + r11*4 + 8]    	movss  [rsi + r8*4 + 8], xmm11	movss  [rsi + r9*4 + 8], xmm10	movss  [rsi + r10*4 + 8], xmm9	movss  [rsi + r11*4 + 8], xmm8		;# should we do one more iteration? 	sub dword ptr [rsp + nb410_innerk],  4	jl    .nb410_finish_inner	jmp   .nb410_unroll_loop.nb410_finish_inner:	;# check if at least two particles remain 	add dword ptr [rsp + nb410_innerk],  4	mov   edx, [rsp + nb410_innerk]	and   edx, 2	jnz   .nb410_dopair	jmp   .nb410_checksingle.nb410_dopair:		mov   rcx, [rsp + nb410_innerjjnr]		mov   eax, [rcx]		mov   ebx, [rcx + 4]              	add qword ptr [rsp + nb410_innerjjnr],  8	;# load isaj	mov rsi, [rbp + nb410_invsqrta]	movss xmm2, [rsi + rax*4]	movss xmm6, [rsi + rbx*4]    unpcklps xmm2, xmm6	mulps  xmm2, [rsp + nb410_isai]		movaps [rsp + nb410_isaprod], xmm2		movaps xmm1, xmm2	mulps xmm1, [rsp + nb410_gbtsc]	movaps [rsp + nb410_gbscale], xmm1	    mulps xmm2, [rsp + nb410_iq]	mov rsi, [rbp + nb410_charge]    ;# base of charge[] 	movss xmm3, [rsi + rax*4]	movss xmm6, [rsi + rbx*4]    unpcklps xmm3, xmm6    	mulps xmm3, xmm2	movaps [rsp + nb410_qq], xmm3		     ;# vdw parameters	mov rsi, [rbp + nb410_type]	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb410_ntia]	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb410_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 + nb410_c6], xmm0    movaps [rsp + nb410_c12], xmm3	mov rsi, [rbp + nb410_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 + nb410_ix]	subps xmm5, [rsp + nb410_iy]	subps xmm6, [rsp + nb410_iz]	;# store dr 	movaps [rsp + nb410_dx], xmm4	movaps [rsp + nb410_dy], xmm5	movaps [rsp + nb410_dz], 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 + nb410_three]	mulps xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb410_half]	subps xmm1, xmm5	;# 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm0, xmm1	;# xmm0=rinv 	mulps xmm4, xmm0	;# xmm4=r	movaps [rsp + nb410_r], xmm4	mulps xmm4, [rsp + nb410_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 + nb410_GBtab]    movaps xmm9, xmm0 ;# rinv    mulps  xmm9, xmm9 ;# rinvsq    movaps xmm10, xmm9 ;# rinvsq    mulps  xmm10, xmm10 ;# rinv4    mulps  xmm10, xmm9 ;# rinv6    movaps xmm11, xmm10     mulps  xmm11, xmm11 ;# rinv12    ;# load table data   	movlps xmm4, [rsi + r12*4]  ;# Y1 F1	movlps xmm5, [rsi + r13*4]  ;# Y2 F2    unpcklps xmm4, xmm5         ;# Y1 Y2 F1 F2    movhlps  xmm5, xmm4         ;# F1 F2        mulps  xmm10, [rsp + nb410_c6]    ;# vvdw6=c6*rinv6	mulps  xmm11, [rsp + nb410_c12]   ;# vvdw12=c12*rinv12     	movaps xmm9, xmm11	subps  xmm11, xmm10	;# Vvdw=Vvdw12-Vvdw6    ;# add potential to vvdwtot 	addps  xmm11, [rsp + nb410_Vvdwtot]    movlps [rsp + nb410_Vvdwtot], xmm11       	movlps xmm6, [rsi + r12*4 + 8]   ;# G1 H1	movlps xmm7, [rsi + r13*4 + 8]   ;# G2 H2    unpcklps xmm6, xmm7              ;# G1 G2    movhlps  xmm7, xmm6              ;# H1 H2    ;# 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 + nb410_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    ;# LJ forces    mulps  xmm10, [rsp + nb410_six]    mulps  xmm9,  [rsp + nb410_twelve]    subps  xmm9, xmm10    mulps  xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv    ;# zero upper part of vcoul     xorps xmm2, xmm2    movlhps xmm5, xmm2    	mov rsi, [rbp + nb410_dvda]		;# Calculate dVda	xorps  xmm7, xmm7	mulps xmm3, [rsp + nb410_gbscale]	movaps xmm6, xmm3	mulps  xmm6, [rsp + nb410_r]	addps  xmm6, xmm5        xorps  xmm4, xmm4    ;# 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, xmm4        ;# update dvdasum    addps  xmm7, [rsp + nb410_dvdasum]    movaps [rsp + nb410_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 xmm7, xmm7        subps  xmm9, xmm3    mulps  xmm9, xmm0 ;# fscal    movaps  xmm10, xmm9    movaps  xmm11, xmm9    mulps   xmm9, [rsp + nb410_dx]    mulps   xmm10, [rsp + nb410_dy]    mulps   xmm11, [rsp + nb410_dz]    movlhps  xmm9, xmm7    movlhps  xmm10, xmm7    movlhps  xmm11, xmm7    	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb410_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.nb410_checksingle:					mov   edx, [rsp + nb410_innerk]	and   edx, 1	jnz    .nb410_dosingle	jmp    .nb410_updateouterdata.nb410_dosingle:	mov rsi, [rbp + nb410_charge]	mov rdx, [rbp + nb410_invsqrta]	mov rdi, [rbp + nb410_pos]	mov   rcx, [rsp + nb410_innerjjnr]	mov   eax, [rcx]		;# load isaj	mov rsi, [rbp + nb410_invsqrta]	movss xmm3, [rsi + rax*4]	movaps xmm2, [rsp + nb410_isai]	mulss  xmm2, xmm3		movss [rsp + nb410_isaprod], xmm2		movaps xmm1, xmm2	mulss xmm1, [rsp + nb410_gbtsc]	movss [rsp + nb410_gbscale], xmm1	    mulss xmm2, [rsp + nb410_iq]	mov rsi, [rbp + nb410_charge]    ;# base of charge[] 	movss xmm3, [rsi + rax*4]	mulss xmm3, xmm2	movss [rsp + nb410_qq], xmm3		    ;# vdw parameters	mov rsi, [rbp + nb410_type]	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb410_ntia]	add r12d, edi	mov rsi, [rbp + nb410_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb410_c6], xmm0    movaps [rsp + nb410_c12], xmm3	mov rsi, [rbp + nb410_pos]       ;# base of pos[] 		lea   r8, [rax + rax*2]     ;# 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 + nb410_ix]	subss xmm5, [rsp + nb410_iy]	subss xmm6, [rsp + nb410_iz]	;# store dr 	movaps [rsp + nb410_dx], xmm4	movaps [rsp + nb410_dy], xmm5	movaps [rsp + nb410_dz], 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 + nb410_three]	mulss xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb410_half]	subss xmm1, xmm5	;# 30-rsq*lu*lu 	mulss xmm1, xmm2		mulss xmm0, xmm1	;# xmm0=rinv 	mulss xmm4, xmm0	;# xmm4=r	movaps [rsp + nb410_r], xmm4	mulss xmm4, [rsp + nb410_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 + nb410_GBtab]    movaps xmm9, xmm0 ;# rinv    mulss  xmm9, xmm9 ;# rinvsq    movaps xmm10, xmm9 ;# rinvsq    mulss  xmm10, xmm10 ;# rinv4    mulss  xmm10, xmm9 ;# rinv6    movaps xmm11, xmm10     mulss  xmm11, xmm11 ;# rinv12    ;# 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  xmm10, [rsp + nb410_c6]    ;# vvdw6=c6*rinv6	mulss  xmm11, [rsp + nb410_c12]   ;# vvdw12=c12*rinv12     	movaps xmm9, xmm11	subss  xmm11, xmm10	;# Vvdw=Vvdw12-Vvdw6    ;# add potential to vvdwtot 	addss  xmm11, [rsp + nb410_Vvdwtot]    movss [rsp + nb410_Vvdwtot], xmm11        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 + nb410_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    ;# LJ forces    mulss  xmm10, [rsp + nb410_six]    mulss  xmm9,  [rsp + nb410_twelve]    subss  xmm9, xmm10

⌨️ 快捷键说明

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