nb_kernel030_ia32_3dnow.intel_syntax.s

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

S
1,107
字号
	pfadd mm7, mm5	;# mm7=FF 	pfmul mm5, mm1  ;# mm5=eps*Fp 	pfadd mm5, mm4	;#  mm5= VV 	movq mm6, [esp + nb030_c12]	pfmul mm7, mm6	;# fijR 	pfmul mm5, mm6	;# Vvdw12 	pfadd mm3, mm7	;# total fscal fijD+ fijR 	;# change sign of mm3     pxor mm1,mm1	pfsub mm1, mm3		pfmul mm1, [esp + nb030_tsc] 	pfmul mm0, mm1    ;# mm0 is total fscal now 		prefetchw [esp + nb030_dx1]	;# prefetch i forces to cache 	;# spread fscalar to both positions 	movq mm1,mm0	punpckldq mm0,mm0	punpckhdq mm1,mm1	;# calc vector force 	prefetchw [edi + eax*4]	;# prefetch the 1st faction to cache 	movq mm2,  [esp + nb030_dx1]	;# fetch dr 	movd mm3,  [esp + nb030_dz1]	;# update Vvdwtot 	pfadd mm5, [esp + nb030_Vvdwtot]      ;# add the earlier value 	movq [esp + nb030_Vvdwtot], mm5       ;# store the sum       	prefetchw [edi + ebx*4]	;# prefetch the 2nd faction to cache 	pfmul mm2, mm0		;# mult by fs  	pfmul mm3, mm0	movq mm4,  [esp + nb030_dx2] 	;# fetch dr 	movd mm5,  [esp + nb030_dz2]	pfmul mm4, mm1   	;# mult by fs  	pfmul mm5, mm1	;# update i forces 	movq mm0,  [esp + nb030_fix]	movd mm1,  [esp + nb030_fiz]	pfadd mm0, mm2	pfadd mm1, mm3	pfadd mm0, mm4	pfadd mm1, mm5	movq [esp + nb030_fix], mm0	movd [esp + nb030_fiz], mm1	;# update j forces 	movq mm0,  [edi + eax*4]	movd mm1,  [edi + eax*4 + 8]	movq mm6,  [edi + ebx*4]	movd mm7,  [edi + ebx*4 + 8]		pfsub mm0, mm2	pfsub mm1, mm3	pfsub mm6, mm4	pfsub mm7, mm5		movq [edi + eax*4], mm0	movd [edi + eax*4 +8], mm1	movq [edi + ebx*4], mm6	movd [edi + ebx*4 + 8], mm7		;# should we do one more iteration? 	sub dword ptr [esp + nb030_innerk],  2	jl    .nb030_finish_inner	jmp   .nb030_unroll_loop.nb030_finish_inner:		and dword ptr [esp + nb030_innerk],  1	jnz  .nb030_single_inner	jmp  .nb030_updateouterdata		.nb030_single_inner:	;# a single j particle iteration here - compare with the unrolled code for comments 	mov   eax, [esp + nb030_innerjjnr]	mov   eax, [eax]	;# eax=jnr offset 	mov esi, [ebp + nb030_vdwparam]	mov ecx, [ebp + nb030_type]	mov edx, [ecx + eax*4]        	 ;# type [jnr1] 	shl edx, 1	add edx, [esp + nb030_ntia]	     ;# tja = ntia + 2*type 	movd mm5, [esi + edx*4]		;# mm5 = 1st c6  			movq [esp + nb030_c6], mm5	movd mm5, [esi + edx*4 + 4]	;# mm5 = 1st c12  			movq [esp + nb030_c12], mm5	mov   esi, [ebp + nb030_pos]	lea   eax, [eax + eax*2]	movq  mm0, [esp + nb030_ix]	movd  mm1, [esp + nb030_iz]	movq  mm4, [esi + eax*4]	movd  mm5, [esi + eax*4 + 8]	pfsubr mm4, mm0	pfsubr mm5, mm1	movq  [esp + nb030_dx1], mm4	pfmul mm4,mm4	movd  [esp + nb030_dz1], mm5		pfmul mm5,mm5	pfacc mm4, mm5	pfacc mm4, mm5		;# mm0=rsq 	    pfrsqrt mm0,mm4    movq mm2,mm0    pfmul mm0,mm0    pfrsqit1 mm0,mm4				    pfrcpit2 mm0,mm2	;# mm1=invsqrt 	pfmul mm4, mm0	movq mm1, mm4	;# mm0 is invsqrt, and mm1 r 	;# calculate potentials and scalar force 	pfmul mm1, [esp + nb030_tsc]	;# mm1=rt 	pf2iw mm4,mm1	movd [esp + nb030_n1], mm4	pi2fd mm4,mm4	pfsub mm1, mm4               ;# now mm1 is eps and mm4 is n0 	movq mm2,mm1	pfmul mm2,mm2	;# mm1 is eps, mm2 is eps2 		mov edx, [ebp + nb030_VFtab]	mov ecx, [esp + nb030_n1]	shl ecx, 3	;# dispersion table 	;# load all the table values we need 	movd mm4, [edx + ecx*4]	movd mm5, [edx + ecx*4 + 4]	movd mm6, [edx + ecx*4 + 8]	movd mm7, [edx + ecx*4 + 12]	pfmul mm6, mm1  ;# mm6 = Geps 			pfmul mm7, mm2	;# mm7 = Heps2 	pfadd mm5, mm6	pfadd mm5, mm7	;# mm5 = Fp 	pfmul mm7, [esp + nb030_two]	;# two*Heps2 	pfadd mm7, mm6	pfadd mm7, mm5	;# mm7=FF 	pfmul mm5, mm1  ;# mm5=eps*Fp 	pfadd mm5, mm4	;#  mm5= VV 		movq mm4, [esp + nb030_c6]	pfmul mm7, mm4	;# fijD 	pfmul mm5, mm4	;# Vvdw6            	movq mm3, mm7	;# add to fscal 	;# update Vvdwtot to release mm5! 	pfadd mm5, [esp + nb030_Vvdwtot]      ;# add the earlier value 	movq [esp + nb030_Vvdwtot], mm5       ;# store the sum       	;# repulsion table 	;# load all the table values we need 	movd mm4, [edx + ecx*4 + 16]	movd mm5, [edx + ecx*4 + 20]	movd mm6, [edx + ecx*4 + 24]	movd mm7, [edx + ecx*4 + 28]	pfmul mm6, mm1  ;# mm6 = Geps 			pfmul mm7, mm2	;# mm7 = Heps2 	pfadd mm5, mm6	pfadd mm5, mm7	;# mm5 = Fp 	pfmul mm7, [esp + nb030_two]	;# two*Heps2 	pfadd mm7, mm6	pfadd mm7, mm5	;# mm7=FF 	pfmul mm5, mm1  ;# mm5=eps*Fp 	pfadd mm5, mm4	;#  mm5= VV 	movq mm6, [esp + nb030_c12]	pfmul mm7, mm6	;# fijR 	pfmul mm5, mm6	;# Vvdw12 	pfadd mm3, mm7	;# total fscal fijC+ fijD+ fijR 	;# change sign of mm3     pxor mm1,mm1	pfsub mm1, mm3		pfmul mm0, [esp + nb030_tsc] 	pfmul mm0, mm1    ;# mm0 is total fscal now 		;# update Vvdwtot 	pfadd mm5, [esp + nb030_Vvdwtot]      ;# add the earlier value 	movq [esp + nb030_Vvdwtot], mm5       ;# store the sum       	;# spread fscalar to both positions 	punpckldq mm0,mm0	;# calc vectorial force 	prefetchw [edi + eax*4]	;# prefetch faction to cache  	movq mm2,  [esp + nb030_dx1]	movd mm3,  [esp + nb030_dz1]	pfmul mm2, mm0	pfmul mm3, mm0	;# update i particle force 	movq mm0,  [esp + nb030_fix]	movd mm1,  [esp + nb030_fiz]	pfadd mm0, mm2	pfadd mm1, mm3	movq [esp + nb030_fix], mm0	movd [esp + nb030_fiz], mm1	;# update j particle force 	movq mm0,  [edi + eax*4]	movd mm1,  [edi + eax*4 + 8]	pfsub mm0, mm2	pfsub mm1, mm3	movq [edi + eax*4], mm0	movd [edi + eax*4 +8], mm1	;# done! .nb030_updateouterdata:		mov   ecx, [esp + nb030_ii3]	movq  mm6, [edi + ecx*4]       ;# increment i force 	movd  mm7, [edi + ecx*4 + 8]		pfadd mm6, [esp + nb030_fix]	pfadd mm7, [esp + nb030_fiz]	movq  [edi + ecx*4],    mm6	movd  [edi + ecx*4 +8], mm7	mov   ebx, [ebp + nb030_fshift]    ;# increment fshift force 	mov   edx, [esp + nb030_is3]	movq  mm6, [ebx + edx*4]		movd  mm7, [ebx + edx*4 + 8]		pfadd mm6, [esp + nb030_fix]	pfadd mm7, [esp + nb030_fiz]	movq  [ebx + edx*4],     mm6	movd  [ebx + edx*4 + 8], mm7	;# get n from stack	mov esi, [esp + nb030_n]        ;# get group index for i particle         mov   edx, [ebp + nb030_gid]      	;# base of gid[]        mov   edx, [edx + esi*4]		;# ggid=gid[n]	movq  mm7, [esp + nb030_Vvdwtot]     	pfacc mm7,mm7	          ;# get and sum the two parts of total potential 		mov   eax, [ebp + nb030_Vvdw]	movd  mm6, [eax + edx*4] 	pfadd mm6, mm7	movd  [eax + edx*4], mm6          ;# increment Vvdw[gid]        ;# finish if last         mov ecx, [esp + nb030_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jecxz .nb030_outerend        ;# not last, iterate outer loop once more!          mov [esp + nb030_n], esi        jmp .nb030_outer.nb030_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [esp + nb030_nri]	;# esi already loaded with n above        sub   ecx, esi        jecxz .nb030_end        ;# non-zero, do one more workunit        jmp   .nb030_threadloop.nb030_end:	femms	mov eax, [esp + nb030_nouter] 		mov ebx, [esp + nb030_ninner]	mov ecx, [ebp + nb030_outeriter]	mov edx, [ebp + nb030_inneriter]	mov [ecx], eax	mov [edx], ebx		add esp, 140	pop edi	pop esi    	pop edx    	pop ecx    	pop ebx    	pop eax	leave	ret				.globl nb_kernel030nf_ia32_3dnow.globl _nb_kernel030nf_ia32_3dnownb_kernel030nf_ia32_3dnow:	_nb_kernel030nf_ia32_3dnow:	.equiv		nb030nf_p_nri,		8.equiv		nb030nf_iinr,		12.equiv		nb030nf_jindex,		16.equiv		nb030nf_jjnr,		20.equiv		nb030nf_shift,		24.equiv		nb030nf_shiftvec,	28.equiv		nb030nf_fshift,		32.equiv		nb030nf_gid,		36.equiv		nb030nf_pos,		40		.equiv		nb030nf_faction,	44.equiv		nb030nf_charge,		48.equiv		nb030nf_p_facel,	52.equiv		nb030nf_p_krf,		56	.equiv		nb030nf_p_crf,		60	.equiv		nb030nf_Vc,		64	.equiv		nb030nf_type,		68.equiv		nb030nf_p_ntype,	72.equiv		nb030nf_vdwparam,	76	.equiv		nb030nf_Vvdw,		80	.equiv		nb030nf_p_tabscale,	84	.equiv		nb030nf_VFtab,		88.equiv		nb030nf_invsqrta,	92	.equiv		nb030nf_dvda,		96.equiv          nb030nf_p_gbtabscale,   100.equiv          nb030nf_GBtab,          104.equiv          nb030nf_p_nthreads,     108.equiv          nb030nf_count,          112.equiv          nb030nf_mtx,            116.equiv          nb030nf_outeriter,      120.equiv          nb030nf_inneriter,      124.equiv          nb030nf_work,           128	;# stack offsets for local variables .equiv		nb030nf_is3,		0.equiv		nb030nf_ii3,		4.equiv		nb030nf_ix,		8.equiv		nb030nf_iy,		12.equiv		nb030nf_iz,		16.equiv		nb030nf_Vvdwtot,	20 .equiv		nb030nf_c6,		28 .equiv		nb030nf_c12,		36.equiv		nb030nf_n1,		44 .equiv		nb030nf_tsc,		52 .equiv		nb030nf_ntia,		60.equiv		nb030nf_innerjjnr,	64.equiv		nb030nf_innerk,		68.equiv          nb030nf_n,              72 ;# idx for outer loop.equiv          nb030nf_nn1,            76 ;# number of outer iterations.equiv		nb030nf_nri,		80.equiv		nb030nf_ntype,		84.equiv		nb030nf_nouter,		88.equiv		nb030nf_ninner,		92    	push ebp    	mov ebp,esp    	push eax    	push ebx    	push ecx    	push edx	push esi	push edi	sub esp, 96		;# local stack space 	femms	;# move data to local stack  	mov ecx, [ebp + nb030nf_p_nri]	mov edx, [ebp + nb030nf_p_ntype]	mov esi, [ebp + nb030nf_p_tabscale]	mov ecx, [ecx]	mov edx, [edx]	mov [esp + nb030nf_nri], ecx	mov [esp + nb030nf_ntype], edx	movd  mm3, [esi]	punpckldq mm3,mm3	movq  [esp + nb030nf_tsc], mm3		;# zero iteration counters	mov eax, 0	mov [esp + nb030nf_nouter], eax

⌨️ 快捷键说明

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