⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nb_kernel110_ia32_3dnow.intel_syntax.s

📁 最著名最快的分子模拟软件
💻 S
📖 第 1 页 / 共 2 页
字号:
	movq mm0,  [esp + nb110_fix]	movd mm1,  [esp + nb110_fiz]	pfadd mm0, mm2	pfadd mm1, mm3	movq [esp + nb110_fix], mm0	movd [esp + nb110_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! .nb110_updateouterdata:		mov   ecx, [esp + nb110_ii3]	movq  mm6, [edi + ecx*4]       ;# increment i force 	movd  mm7, [edi + ecx*4 + 8]		pfadd mm6, [esp + nb110_fix]	pfadd mm7, [esp + nb110_fiz]	movq  [edi + ecx*4],    mm6	movd  [edi + ecx*4 +8], mm7	mov   ebx, [ebp + nb110_fshift]    ;# increment fshift force 	mov   edx, [esp + nb110_is3]	movq  mm6, [ebx + edx*4]		movd  mm7, [ebx + edx*4 + 8]		pfadd mm6, [esp + nb110_fix]	pfadd mm7, [esp + nb110_fiz]	movq  [ebx + edx*4],     mm6	movd  [ebx + edx*4 + 8], mm7	;# get n from stack	mov esi, [esp + nb110_n]        ;# get group index for i particle         mov   edx, [ebp + nb110_gid]      	;# base of gid[]        mov   edx, [edx + esi*4]		;# ggid=gid[n]	movq  mm7, [esp + nb110_vctot]     	pfacc mm7,mm7	          ;# get and sum the two parts of total potential 		mov   eax, [ebp + nb110_Vc]	movd  mm6, [eax + edx*4] 	pfadd mm6, mm7	movd  [eax + edx*4], mm6          ;# increment vc[gid] 	movq  mm7, [esp + nb110_Vvdwtot]     	pfacc mm7,mm7	          ;# get and sum the two parts of total potential 		mov   eax, [ebp + nb110_Vvdw]	movd  mm6, [eax + edx*4] 	pfadd mm6, mm7	movd  [eax + edx*4], mm6          ;# increment Vvdw[gid]        ;# finish if last         mov ecx, [esp + nb110_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jecxz .nb110_outerend        ;# not last, iterate outer loop once more!          mov [esp + nb110_n], esi        jmp .nb110_outer.nb110_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [esp + nb110_nri]	;# esi already loaded with n above        sub   ecx, esi        jecxz .nb110_end        ;# non-zero, do one more workunit        jmp   .nb110_threadloop.nb110_end:	femms	mov eax, [esp + nb110_nouter] 		mov ebx, [esp + nb110_ninner]	mov ecx, [ebp + nb110_outeriter]	mov edx, [ebp + nb110_inneriter]	mov [ecx], eax	mov [edx], ebx		add esp, 152	pop edi	pop esi    	pop edx    	pop ecx    	pop ebx    	pop eax	leave	ret.globl nb_kernel110nf_ia32_3dnow.globl _nb_kernel110nf_ia32_3dnownb_kernel110nf_ia32_3dnow:	_nb_kernel110nf_ia32_3dnow:	.equiv		nb110nf_p_nri,		8.equiv		nb110nf_iinr,		12.equiv		nb110nf_jindex,		16.equiv		nb110nf_jjnr,		20.equiv		nb110nf_shift,		24.equiv		nb110nf_shiftvec,	28.equiv		nb110nf_fshift,		32.equiv		nb110nf_gid,		36.equiv		nb110nf_pos,		40		.equiv		nb110nf_faction,	44.equiv		nb110nf_charge,		48.equiv		nb110nf_p_facel,	52.equiv		nb110nf_p_krf,		56	.equiv		nb110nf_p_crf,		60	.equiv		nb110nf_Vc,		64	.equiv		nb110nf_type,		68.equiv		nb110nf_p_ntype,	72.equiv		nb110nf_vdwparam,	76	.equiv		nb110nf_Vvdw,		80	.equiv		nb110nf_p_tabscale,	84	.equiv		nb110nf_VFtab,		88.equiv		nb110nf_invsqrta,	92	.equiv		nb110nf_dvda,		96.equiv          nb110nf_p_gbtabscale,   100.equiv          nb110nf_GBtab,          104.equiv          nb110nf_p_nthreads,     108.equiv          nb110nf_count,          112.equiv          nb110nf_mtx,            116.equiv          nb110nf_outeriter,      120.equiv          nb110nf_inneriter,      124.equiv          nb110nf_work,           128	;# stack offsets for local variables .equiv		nb110nf_is3,		0.equiv		nb110nf_ii3,		4.equiv		nb110nf_ix,		8.equiv		nb110nf_iy,		12.equiv		nb110nf_iz,		16.equiv		nb110nf_iq,		20 .equiv		nb110nf_vctot,		28 .equiv		nb110nf_Vvdwtot,	36 .equiv		nb110nf_c6,		44 .equiv		nb110nf_c12,		52.equiv		nb110nf_ntia,		60.equiv		nb110nf_innerjjnr,	64.equiv		nb110nf_innerk,		68					.equiv          nb110nf_n,              72 ;# idx for outer loop.equiv          nb110nf_nn1,            76 ;# number of outer iterations.equiv          nb110nf_nri,              80.equiv          nb110nf_facel,            84.equiv          nb110nf_ntype,            88.equiv          nb110nf_nouter,           92.equiv          nb110nf_ninner,           96	push ebp	mov ebp,esp	    	push eax    	push ebx    	push ecx    	push edx	push esi	push edi	sub esp, 100		;# local stack space 	femms	mov ecx, [ebp + nb110nf_p_nri]	mov edx, [ebp + nb110nf_p_ntype]	mov esi, [ebp + nb110nf_p_facel]	mov ecx, [ecx]	mov edx, [edx]	mov esi, [esi]	mov [esp + nb110nf_nri], ecx	mov [esp + nb110nf_ntype], edx	mov [esp + nb110nf_facel], esi	;# zero iteration counters	mov eax, 0	mov [esp + nb110nf_nouter], eax	mov [esp + nb110nf_ninner], eax.nb110nf_threadloop:        mov   esi, [ebp + nb110nf_count]          ;# pointer to sync counter        mov   eax, [esi].nb110nf_spinlock:        mov   ebx, eax                          ;# ebx=*count=nn0        add   ebx, 1                           ;# ebx=nn1=nn0+10        lock        cmpxchg [esi], ebx                      ;# write nn1 to *counter,                                                ;# if it hasnt changed.                                                ;# or reread *counter to eax.        pause                                   ;# -> better p4 performance        jnz .nb110nf_spinlock        ;# if(nn1>nri) nn1=nri        mov ecx, [esp + nb110nf_nri]        mov edx, ecx        sub ecx, ebx        cmovle ebx, edx                         ;# if(nn1>nri) nn1=nri        ;# Cleared the spinlock if we got here.        ;# eax contains nn0, ebx contains nn1.        mov [esp + nb110nf_n], eax        mov [esp + nb110nf_nn1], ebx        sub ebx, eax                            ;# calc number of outer lists	mov esi, eax				;# copy n to esi        jg  .nb110nf_outerstart        jmp .nb110nf_end.nb110nf_outerstart:		;# ebx contains number of outer iterations	add ebx, [esp + nb110nf_nouter]        mov [esp + nb110nf_nouter], ebx	.nb110nf_outer:	mov   eax, [ebp + nb110nf_shift]      ;# eax = pointer into shift[] 	mov   ebx, [eax + esi*4]		;# ebx=shift[n] 		lea   ebx, [ebx + ebx*2]    ;# ebx=3*is 	mov   [esp + nb110nf_is3],ebx    	;# store is3 	mov   eax, [ebp + nb110nf_shiftvec]   ;# eax = base of shiftvec[] 		movq  mm0, [eax + ebx*4]	;# move shX/shY to mm0 and shZ to mm1 	movd  mm1, [eax + ebx*4 + 8]	mov   ecx, [ebp + nb110nf_iinr]       ;# ecx = pointer into iinr[] 		mov   ebx, [ecx + esi*4]	    ;# ebx=ii 	mov   edx, [ebp + nb110nf_charge]	movd  mm2, [edx + ebx*4]    ;# mm2=charge[ii] 	pfmul mm2, [esp + nb110nf_facel]	punpckldq mm2,mm2	    ;# spread to both halves 	movq  [esp + nb110nf_iq], mm2	    ;# iq =facel*charge[ii] 	mov   edx, [ebp + nb110nf_type] 		mov   edx, [edx + ebx*4]		imul  edx, [esp + nb110nf_ntype]	shl   edx, 1	mov   [esp + nb110nf_ntia], edx	lea   ebx, [ebx + ebx*2]	;# ebx = 3*ii=ii3 	mov   eax, [ebp + nb110nf_pos]    ;# eax = base of pos[] 		pfadd mm0, [eax + ebx*4]    ;# ix = shX + posX (and iy too) 	movd  mm3, [eax + ebx*4 + 8]    ;# cant use direct memory add for 4 bytes (iz) 	mov   [esp + nb110nf_ii3], ebx	pfadd mm1, mm3	movq  [esp + nb110nf_ix], mm0		movd  [esp + nb110nf_iz], mm1						;# clear total potential and i forces 	pxor  mm7,mm7	movq  [esp + nb110nf_vctot],  mm7	movq  [esp + nb110nf_Vvdwtot], mm7	mov   eax, [ebp + nb110nf_jindex]	mov   ecx, [eax + esi*4]	     ;# jindex[n] 	mov   edx, [eax + esi*4 + 4]	     ;# jindex[n+1] 	sub   edx, ecx               ;# number of innerloop atoms 	mov   esi, [ebp + nb110nf_pos]	mov   eax, [ebp + nb110nf_jjnr]	shl   ecx, 2	add   eax, ecx	mov   [esp + nb110nf_innerjjnr], eax     ;# pointer to jjnr[nj0] 	mov   ecx, edx	sub   edx,  2	add   ecx, [esp + nb110nf_ninner]	mov   [esp + nb110nf_ninner], ecx	mov   [esp + nb110nf_innerk], edx    ;# number of innerloop atoms 	add   edx, 0	jge   .nb110nf_unroll_loop	jmp   .nb110nf_finish_inner.nb110nf_unroll_loop:	;# paired innerloop starts here 	mov   ecx, [esp + nb110nf_innerjjnr]     ;# pointer to jjnr[k] 	mov   eax, [ecx]		mov   ebx, [ecx + 4]         ;# eax/ebx=jnr 	add dword ptr [esp + nb110nf_innerjjnr],  8 ;# advance pointer (unrolled 2) 	prefetch [ecx + 16]	     ;# prefetch data - trial and error says 16 is best 		mov ecx, [ebp + nb110nf_charge]    ;# base of charge[] 	movq mm5, [esp + nb110nf_iq]	movd mm3, [ecx + eax*4]	     ;# charge[jnr1]         punpckldq mm3, [ecx + ebx*4]     ;# move charge 2 to high part of mm3 	pfmul mm3,mm5		     ;# mm3 now has qq for both particles 	mov ecx, [ebp + nb110nf_type]	mov edx, [ecx + eax*4]        	 ;# type [jnr1] 	mov ecx, [ecx + ebx*4]       ;# type [jnr2] 	mov esi, [ebp + nb110nf_vdwparam]		;# base of vdwparam  	shl edx, 1	shl ecx, 1	add edx, [esp + nb110nf_ntia]	     ;# tja = ntia + 2*type 	add ecx, [esp + nb110nf_ntia]	movq mm5, [esi + edx*4]		;# mm5 = 1st c6 / c12 			movq mm7, [esi + ecx*4]		;# mm7 = 2nd c6 / c12 		movq mm6,mm5				punpckldq mm5,mm7		;# mm5 = 1st c6 / 2nd c6 	punpckhdq mm6,mm7		;# mm6 = 1st c12 / 2nd c12 	movq [esp + nb110nf_c6], mm5	movq [esp + nb110nf_c12], mm6	lea   eax, [eax + eax*2]     ;# replace jnr with j3 	lea   ebx, [ebx + ebx*2]			mov   esi, [ebp + nb110nf_pos]	movq  mm0, [esp + nb110nf_ix]	movd  mm1, [esp + nb110nf_iz]	 		movq  mm4, [esi + eax*4]     ;# fetch first j coordinates 	movd  mm5, [esi + eax*4 + 8]			pfsubr mm4,mm0		     ;# dr = ir - jr  	pfsubr mm5,mm1	pfmul mm4,mm4	             ;# square dx,dy,dz 		         	pfmul mm5,mm5			pfacc mm4, mm5               ;# accumulate to get dx*dx+ dy*dy+ dz*dz 	pfacc mm4, mm5		     ;# first rsq in lower mm4 	movq  mm6, [esi + ebx*4]     ;# fetch second j coordinates  	movd  mm7, [esi + ebx*4 + 8]		pfsubr mm6,mm0	             ;# dr = ir - jr  	pfsubr mm7,mm1	pfmul mm6,mm6	             ;# square dx,dy,dz 	pfmul mm7,mm7	pfacc mm6, mm7		     ;# accumulate to get dx*dx+ dy*dy+ dz*dz 	pfacc mm6, mm7	             ;# second rsq in lower mm6     pfrsqrt mm0, mm4	     ;# lookup inverse square root seed     pfrsqrt mm1, mm6 	punpckldq mm0,mm1	punpckldq mm4,mm6        	;# now 4 has rsq and 0 the seed for both pairs     movq mm2,mm0	        	;# amd 3dnow N-R iteration to get full precision 	pfmul mm0,mm0    pfrsqit1 mm0,mm4				    pfrcpit2 mm0,mm2		movq mm1,mm0	pfmul mm0,mm0	;# mm0 now contains invsq, and mm1 invsqrt 	;# do potential and fscal 	movq mm4, mm0	pfmul mm4, mm0	pfmul mm4, mm0             	;# mm4=rinvsix 	movq  mm5, mm4		pfmul mm5, mm5	            ;# mm5=rinvtwelve 	pfmul mm3, mm1		;# mm3 has vcoul for both interactions 	pfmul mm5, [esp + nb110nf_c12]	pfmul mm4, [esp + nb110nf_c6]		movq mm6, mm5	;# mm6 is Vvdw12-Vvdw6  	pfsub mm6, mm4	;# update vctot 	pfadd mm3, [esp + nb110nf_vctot]      ;# add the earlier value 	movq [esp + nb110nf_vctot], mm3       ;# store the sum       	;# update Vvdwtot 	pfadd mm6, [esp + nb110nf_Vvdwtot]      ;# add the earlier value 	movq [esp + nb110nf_Vvdwtot], mm6       ;# store the sum       		;# should we do one more iteration? 	sub dword ptr [esp + nb110nf_innerk],  2	jl    .nb110nf_finish_inner	jmp   .nb110nf_unroll_loop.nb110nf_finish_inner:		and dword ptr [esp + nb110nf_innerk],  1	jnz  .nb110nf_single_inner	jmp  .nb110nf_updateouterdata		.nb110nf_single_inner:	;# a single j particle iteration here - compare with the unrolled code for comments 	mov   eax, [esp + nb110nf_innerjjnr]	mov   eax, [eax]	;# eax=jnr offset 	mov ecx, [ebp + nb110nf_charge]	movd mm5, [esp + nb110nf_iq]	movd mm3, [ecx + eax*4]	pfmul mm3, mm5	  	;# mm3=qq 	mov esi, [ebp + nb110nf_vdwparam]	mov ecx, [ebp + nb110nf_type]	mov edx, [ecx + eax*4]        	 ;# type [jnr1] 	shl edx, 1	add edx, [esp + nb110nf_ntia]	     ;# tja = ntia + 2*type 	movd mm5, [esi + edx*4]		;# mm5 = 1st c6  			movq [esp + nb110nf_c6], mm5	movd mm5, [esi + edx*4 + 4]	;# mm5 = 1st c12  			movq [esp + nb110nf_c12], mm5	mov   esi, [ebp + nb110nf_pos]	lea   eax, [eax + eax*2]	movq  mm0, [esp + nb110nf_ix]	movd  mm1, [esp + nb110nf_iz]	movq  mm4, [esi + eax*4]	movd  mm5, [esi + eax*4 + 8]	pfsubr mm4, mm0	pfsubr mm5, mm1	pfmul mm4,mm4	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 	movq  mm1, mm0	pfmul mm0, mm0		;# mm0=invsq 	;# calculate potentials and scalar force 	movq mm4, mm0	pfmul mm4, mm0	pfmul mm4, mm0             	;# mm4=rinvsix 	movq  mm5, mm4		pfmul mm5, mm5	            ;# mm5=rinvtwelve 	pfmul mm3, mm1		;# mm3 has vcoul for both interactions 	pfmul mm5, [esp + nb110nf_c12]	pfmul mm4, [esp + nb110nf_c6]		movq mm6, mm5	;# mm6 is Vvdw12-Vvdw6  	pfsub mm6, mm4	;# update vctot 	pfadd mm3, [esp + nb110nf_vctot]	movq [esp + nb110nf_vctot], mm3	;# update Vvdwtot 	pfadd mm6, [esp + nb110nf_Vvdwtot]      ;# add the earlier value 	movq [esp + nb110nf_Vvdwtot], mm6       ;# store the sum       .nb110nf_updateouterdata:		;# get n from stack	mov esi, [esp + nb110nf_n]        ;# get group index for i particle         mov   edx, [ebp + nb110nf_gid]      	;# base of gid[]        mov   edx, [edx + esi*4]		;# ggid=gid[n]	movq  mm7, [esp + nb110nf_vctot]     	pfacc mm7,mm7	          ;# get and sum the two parts of total potential 		mov   eax, [ebp + nb110nf_Vc]	movd  mm6, [eax + edx*4] 	pfadd mm6, mm7	movd  [eax + edx*4], mm6          ;# increment vc[gid] 	movq  mm7, [esp + nb110nf_Vvdwtot]     	pfacc mm7,mm7	          ;# get and sum the two parts of total potential 		mov   eax, [ebp + nb110nf_Vvdw]	movd  mm6, [eax + edx*4] 	pfadd mm6, mm7	movd  [eax + edx*4], mm6          ;# increment Vvdw[gid]        	;# finish if last         mov ecx, [esp + nb110nf_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jecxz .nb110nf_outerend        ;# not last, iterate outer loop once more!          mov [esp + nb110nf_n], esi        jmp .nb110nf_outer.nb110nf_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [esp + nb110nf_nri]	;# esi already loaded with n above        sub   ecx, esi        jecxz .nb110nf_end        ;# non-zero, do one more workunit        jmp   .nb110nf_threadloop.nb110nf_end:	femms	mov eax, [esp + nb110nf_nouter] 		mov ebx, [esp + nb110nf_ninner]	mov ecx, [ebp + nb110nf_outeriter]	mov edx, [ebp + nb110nf_inneriter]	mov [ecx], eax	mov [edx], ebx	add esp, 100	pop edi	pop esi    	pop edx    	pop ecx    	pop ebx    	pop eax	leave	ret

⌨️ 快捷键说明

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