nb_kernel430_ia32_sse.intel_syntax.s

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

S
2,411
字号
	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 		mulps  xmm7, [esp + nb430_two]	;# two*Heps2 	movaps xmm3, [esp + nb430_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 	;# get jnr from stack	mov eax, [esp + nb430_jnra]	mov ebx, [esp + nb430_jnrb]	mov ecx, [esp + nb430_jnrc]	mov edx, [esp + nb430_jnrd]		mov esi, [ebp + nb430_dvda]		;# Calculate dVda	xorps xmm7, xmm7	mulps xmm3, [esp + nb430_gbscale]	movaps xmm6, xmm3	mulps  xmm6, [esp + nb430_r]	addps  xmm6, xmm5	addps  xmm5, [esp + nb430_vctot]	movaps [esp + nb430_vctot], xmm5 	;# xmm6=(vcoul+fijC*r)	subps  xmm7, xmm6	movaps xmm6, xmm7		;# update dvdasum	addps  xmm7, [esp + nb430_dvdasum]	movaps [esp + nb430_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, [esi + eax*4]	addss  xmm5, [esi + ebx*4]	addss  xmm7, [esi + ecx*4]	addss  xmm4, [esi + edx*4]	movss  [esi + eax*4], xmm6	movss  [esi + ebx*4], xmm5	movss  [esi + ecx*4], xmm7	movss  [esi + edx*4], xmm4		;# put scalar force on stack temporarily 	movaps [esp + nb430_fscal], xmm3	movaps xmm4, [esp + nb430_r]	mulps xmm4, [esp + nb430_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  esi, [ebp + nb430_VFtab]	movd eax, mm6	psrlq mm6, 32	movd ecx, mm7	psrlq mm7, 32	movd ebx, mm6	movd edx, mm7			;# dispersion 	movaps xmm4, [esi + eax*4]	movaps xmm5, [esi + ebx*4]	movaps xmm6, [esi + ecx*4]	movaps xmm7, [esi + edx*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  xmm7, [esp + nb430_two]	;# two*Heps2 	addps  xmm7, xmm6	addps  xmm7, xmm5 ;# xmm7=FF 	mulps  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV 	movaps xmm4, [esp + nb430_c6]	mulps  xmm7, xmm4	 ;# fijD 	mulps  xmm5, xmm4	 ;# Vvdw6	mulps  xmm7, [esp + nb430_tsc]	addps  xmm7, [esp + nb430_fscal] ;# add to fscal 	;# put scalar force on stack Update Vvdwtot directly 	addps  xmm5, [esp + nb430_Vvdwtot]	movaps [esp + nb430_fscal], xmm7	movaps [esp + nb430_Vvdwtot], xmm5	;# repulsion 	movaps xmm4, [esi + eax*4 + 16]	movaps xmm5, [esi + ebx*4 + 16]	movaps xmm6, [esi + ecx*4 + 16]	movaps xmm7, [esi + edx*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 		mulps  xmm7, [esp + nb430_two]	;# two*Heps2 	addps  xmm7, xmm6	addps  xmm7, xmm5 ;# xmm7=FF 	mulps  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV  		movaps xmm4, [esp + nb430_c12]	mulps  xmm7, xmm4 ;# fijR 	mulps  xmm5, xmm4 ;# Vvdw12	mulps xmm7, [esp + nb430_tsc]	addps  xmm7, [esp + nb430_fscal] 		addps  xmm5, [esp + nb430_Vvdwtot]	movaps [esp + nb430_Vvdwtot], xmm5	xorps  xmm4, xmm4	mulps xmm7, xmm0	subps  xmm4, xmm7	movaps xmm0, [esp + nb430_dx]	movaps xmm1, [esp + nb430_dy]	movaps xmm2, [esp + nb430_dz]	movd eax, mm0		movd ebx, mm1	movd ecx, mm2	movd edx, mm3	mov    edi, [ebp + nb430_faction]	mulps  xmm0, xmm4	mulps  xmm1, xmm4	mulps  xmm2, xmm4	;# xmm0-xmm2 contains tx-tz (partial force) 	;# now update f_i 	movaps xmm3, [esp + nb430_fix]	movaps xmm4, [esp + nb430_fiy]	movaps xmm5, [esp + nb430_fiz]	addps  xmm3, xmm0	addps  xmm4, xmm1	addps  xmm5, xmm2	movaps [esp + nb430_fix], xmm3	movaps [esp + nb430_fiy], xmm4	movaps [esp + nb430_fiz], xmm5	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm4, [edi + eax*4]	movlps xmm6, [edi + ecx*4]	movhps xmm4, [edi + ebx*4]	movhps xmm6, [edi + edx*4]	movaps xmm3, xmm4	shufps xmm3, xmm6, 136  ;# constant 10001000	shufps xmm4, xmm6, 221  ;# constant 11011101			      	;# now xmm3-xmm5 contains fjx, fjy, fjz 	subps  xmm3, xmm0	subps  xmm4, xmm1		;# unpack them back so we can store them - first x & y in xmm3/xmm4 	movaps xmm6, xmm3	unpcklps xmm6, xmm4	unpckhps xmm3, xmm4		;# xmm6(l)=x & y for j1, (h) for j2 	;# xmm3(l)=x & y for j3, (h) for j4 	movlps [edi + eax*4], xmm6	movlps [edi + ecx*4], xmm3		movhps [edi + ebx*4], xmm6	movhps [edi + edx*4], xmm3	;# and the z forces 	movss  xmm4, [edi + eax*4 + 8]	movss  xmm5, [edi + ebx*4 + 8]	movss  xmm6, [edi + ecx*4 + 8]	movss  xmm7, [edi + edx*4 + 8]	subss  xmm4, xmm2	shufps xmm2, xmm2, 229  ;# constant 11100101	subss  xmm5, xmm2	shufps xmm2, xmm2, 234  ;# constant 11101010	subss  xmm6, xmm2	shufps xmm2, xmm2, 255  ;# constant 11111111	subss  xmm7, xmm2	movss  [edi + eax*4 + 8], xmm4	movss  [edi + ebx*4 + 8], xmm5	movss  [edi + ecx*4 + 8], xmm6	movss  [edi + edx*4 + 8], xmm7		;# should we do one more iteration? 	sub dword ptr [esp + nb430_innerk],  4	jl    .nb430_finish_inner	jmp   .nb430_unroll_loop.nb430_finish_inner:	;# check if at least two particles remain 	add dword ptr [esp + nb430_innerk],  4	mov   edx, [esp + nb430_innerk]	and   edx, 2	jnz   .nb430_dopair	jmp   .nb430_checksingle.nb430_dopair:		mov   ecx, [esp + nb430_innerjjnr]		mov   eax, [ecx]		mov   ebx, [ecx + 4]              	add dword ptr [esp + nb430_innerjjnr],  8		xorps xmm2, xmm2	movaps xmm6, xmm2		;# load isaj	mov esi, [ebp + nb430_invsqrta]	movss xmm2, [esi + eax*4]	movss xmm3, [esi + ebx*4]	unpcklps xmm2, xmm3	;# isaj in xmm3(0,1)	mulps  xmm2, [esp + nb430_isai]	movaps [esp + nb430_isaprod], xmm2		movaps xmm1, xmm2	mulps xmm1, [esp + nb430_gbtsc]	movaps [esp + nb430_gbscale], xmm1			mov esi, [ebp + nb430_charge]    ;# base of charge[] 		movss xmm3, [esi + eax*4]			movss xmm6, [esi + ebx*4]	unpcklps xmm3, xmm6 ;# constant 00001000 ;# xmm3(0,1) has the charges 	mulps  xmm2, [esp + nb430_iq]	mulps  xmm3, xmm2	movaps [esp + nb430_qq], xmm3	mov esi, [ebp + nb430_type]	mov   ecx, eax	mov   edx, ebx	mov ecx, [esi + ecx*4]	mov edx, [esi + edx*4]		mov esi, [ebp + nb430_vdwparam]	shl ecx, 1		shl edx, 1		mov edi, [esp + nb430_ntia]	add ecx, edi	add edx, edi	movlps xmm6, [esi + ecx*4]	movhps xmm6, [esi + edx*4]	mov edi, [ebp + nb430_pos]			movaps xmm4, xmm6	shufps xmm4, xmm4, 8 ;# constant 00001000 		shufps xmm6, xmm6, 13 ;# constant 00001101	movlhps xmm4, xmm7	movlhps xmm6, xmm7		movaps [esp + nb430_c6], xmm4	movaps [esp + nb430_c12], xmm6					movd  mm0, eax		;# copy jnr to mm0/mm1	movd  mm1, ebx			lea   eax, [eax + eax*2]	lea   ebx, [ebx + ebx*2]	;# move coordinates to xmm0-xmm2 	movlps xmm1, [edi + eax*4]	movss xmm2, [edi + eax*4 + 8]		movhps xmm1, [edi + ebx*4]	movss xmm0, [edi + ebx*4 + 8]		movlhps xmm3, xmm7		shufps xmm2, xmm0, 0		movaps xmm0, xmm1	shufps xmm2, xmm2, 136  ;# constant 10001000		shufps xmm0, xmm0, 136  ;# constant 10001000	shufps xmm1, xmm1, 221  ;# constant 11011101				mov    edi, [ebp + nb430_faction]	;# move ix-iz to xmm4-xmm6 	xorps   xmm7, xmm7		movaps xmm4, [esp + nb430_ix]	movaps xmm5, [esp + nb430_iy]	movaps xmm6, [esp + nb430_iz]	;# calc dr 	subps xmm4, xmm0	subps xmm5, xmm1	subps xmm6, xmm2	;# store dr 	movaps [esp + nb430_dx], xmm4	movaps [esp + nb430_dy], xmm5	movaps [esp + nb430_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, [esp + nb430_three]	mulps xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [esp + nb430_half]	subps xmm1, xmm5	;# constant 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm0, xmm1	;# xmm0=rinv 	mulps xmm4, xmm0	;# xmm4=r 	movaps [esp + nb430_r], xmm4	mulps xmm4, [esp + nb430_gbscale]	cvttps2pi mm6, xmm4     ;# mm6 contain lu indices 	cvtpi2ps xmm6, mm6	subps xmm4, xmm6		movaps xmm1, xmm4	;# xmm1=eps 	movaps xmm2, xmm1		mulps  xmm2, xmm2	;# xmm2=eps2 	pslld mm6, 2	mov  esi, [ebp + nb430_GBtab]	movd ecx, mm6	psrlq mm6, 32	movd edx, mm6	;# load coulomb table	movaps xmm4, [esi + ecx*4]	movaps xmm7, [esi + edx*4]	;# transpose, using xmm3 for scratch	movaps xmm6, xmm4	unpcklps xmm4, xmm7  	;# Y1 Y2 F1 F2 	unpckhps xmm6, xmm7     ;# G1 G2 H1 H2	movhlps  xmm5, xmm4    	;# F1 F2 	movhlps  xmm7, xmm6     ;# H1 H2	;# coulomb table ready, in xmm4-xmm7  		mulps  xmm6, xmm1	;# xmm6=Geps 	mulps  xmm7, xmm2	;# xmm7=Heps2 	addps  xmm5, xmm6	addps  xmm5, xmm7	;# xmm5=Fp 		mulps  xmm7, [esp + nb430_two]	;# two*Heps2 	movaps xmm3, [esp + nb430_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 	;# get jnr from mm0/mm1	movd ecx, mm0	movd edx, mm1	mov esi, [ebp + nb430_dvda]		;# Calculate dVda	xorps xmm7, xmm7	mulps xmm3, [esp + nb430_gbscale]	movaps xmm6, xmm3	mulps  xmm6, [esp + nb430_r]	addps  xmm6, xmm5	addps  xmm5, [esp + nb430_vctot]	movaps [esp + nb430_vctot], xmm5 	;# xmm6=(vcoul+fijC*r)	subps  xmm7, xmm6	movaps xmm6, xmm7		;# update dvdasum	addps  xmm7, [esp + nb430_dvdasum]	movaps [esp + nb430_dvdasum], xmm7 	;# update j atoms dvdaj	movaps xmm7, xmm6	shufps xmm7, xmm7, 0x1	addss  xmm6, [esi + ecx*4]	addss  xmm7, [esi + edx*4]	movss  [esi + ecx*4], xmm6	movss  [esi + edx*4], xmm7		;# put scalar force on stack temporarily 	movaps [esp + nb430_fscal], xmm3	movaps xmm4, [esp + nb430_r]	mulps xmm4, [esp + nb430_tsc]		cvttps2pi mm6, xmm4	cvtpi2ps xmm6, mm6	subps xmm4, xmm6		movaps xmm1, xmm4	;# xmm1=eps 	movaps xmm2, xmm1		mulps  xmm2, xmm2	;# xmm2=eps2 	pslld mm6, 3		mov  esi, [ebp + nb430_VFtab]	movd ecx, mm6	psrlq mm6, 32	movd edx, mm6				;# dispersion 	movaps xmm4, [esi + ecx*4]	movaps xmm7, [esi + edx*4]	;# transpose, using xmm3 for scratch	movaps xmm6, xmm4	unpcklps xmm4, xmm7  	;# Y1 Y2 F1 F2 	unpckhps xmm6, xmm7     ;# G1 G2 H1 H2	movhlps  xmm5, xmm4    	;# F1 F2 	movhlps  xmm7, xmm6     ;# H1 H2	;# 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  xmm7, [esp + nb430_two]	;# two*Heps2 	addps  xmm7, xmm6	addps  xmm7, xmm5 ;# xmm7=FF 	mulps  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV 	movaps xmm4, [esp + nb430_c6]	mulps  xmm7, xmm4	 ;# fijD 	mulps  xmm5, xmm4	 ;# Vvdw6 	mulps  xmm7, [esp + nb430_tsc]	addps  xmm7, [esp + nb430_fscal] ;# add to fscal 

⌨️ 快捷键说明

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