nb_kernel430_x86_64_sse.intel_syntax.s

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

S
2,332
字号
.equiv          nb430nf_c6,             112.equiv          nb430nf_c12,            128.equiv          nb430nf_vctot,          144.equiv          nb430nf_Vvdwtot,        160.equiv          nb430nf_half,           176.equiv          nb430nf_three,          192.equiv          nb430nf_isai,           208.equiv          nb430nf_isaprod,        224.equiv          nb430nf_gbscale,        240.equiv          nb430nf_r,              256.equiv          nb430nf_nri,            272.equiv          nb430nf_iinr,           280.equiv          nb430nf_jindex,         288.equiv          nb430nf_jjnr,           296.equiv          nb430nf_shift,          304.equiv          nb430nf_shiftvec,       312.equiv          nb430nf_facel,          320.equiv          nb430nf_innerjjnr,      328.equiv          nb430nf_is3,            336.equiv          nb430nf_ii3,            340.equiv          nb430nf_ntia,           344.equiv          nb430nf_innerk,         348.equiv          nb430nf_n,              352.equiv          nb430nf_nn1,            356.equiv          nb430nf_ntype,          360.equiv          nb430nf_nouter,         364.equiv          nb430nf_ninner,         368	push rbp	mov  rbp, rsp	push rbx		emms        push r12        push r13        push r14        push r15	sub rsp, 392		;# local variable stack space (n*16+8)	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb430nf_nouter], eax	mov [rsp + nb430nf_ninner], eax		mov edi, [rdi]	mov [rsp + nb430nf_nri], edi	mov [rsp + nb430nf_iinr], rsi	mov [rsp + nb430nf_jindex], rdx	mov [rsp + nb430nf_jjnr], rcx	mov [rsp + nb430nf_shift], r8	mov [rsp + nb430nf_shiftvec], r9	mov rdi, [rbp + nb430nf_p_ntype]	mov edi, [rdi]	mov [rsp + nb430nf_ntype], edi	mov rsi, [rbp + nb430nf_p_facel]	movss xmm0, [rsi]	movss [rsp + nb430nf_facel], xmm0	mov rax, [rbp + nb430nf_p_tabscale]	movss xmm3, [rax]	shufps xmm3, xmm3, 0	movaps [rsp + nb430nf_tsc], xmm3	mov rbx, [rbp + nb430nf_p_gbtabscale]	movss xmm4, [rbx]	shufps xmm4, xmm4, 0	movaps [rsp + nb430nf_gbtsc], xmm4	;# create constant floating-point factors on stack	mov eax, 0x3f000000     ;# half in IEEE (hex)	mov [rsp + nb430nf_half], eax	movss xmm1, [rsp + nb430nf_half]	shufps xmm1, xmm1, 0    ;# splat to all elements	movaps xmm2, xmm1       	addps  xmm2, xmm2	;# one	movaps xmm3, xmm2	addps  xmm2, xmm2	;# two	addps  xmm3, xmm2	;# three	movaps [rsp + nb430nf_half],  xmm1	movaps [rsp + nb430nf_three],  xmm3.nb430nf_threadloop:        mov   rsi, [rbp + nb430nf_count]          ;# pointer to sync counter        mov   eax, [rsi].nb430nf_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 .nb430nf_spinlock        ;# if(nn1>nri) nn1=nri        mov ecx, [rsp + nb430nf_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 [rsp + nb430nf_n], eax        mov [rsp + nb430nf_nn1], ebx        sub ebx, eax                            ;# calc number of outer lists	mov esi, eax				;# copy n to esi        jg  .nb430nf_outerstart        jmp .nb430nf_end.nb430nf_outerstart:	;# ebx contains number of outer iterations	add ebx, [rsp + nb430nf_nouter]	mov [rsp + nb430nf_nouter], ebx.nb430nf_outer:	mov   rax, [rsp + nb430nf_shift]      ;# rax = pointer into shift[] 	mov   ebx, [rax + rsi*4]		;# ebx=shift[n] 		lea   rbx, [rbx + rbx*2]    ;# rbx=3*is 	mov   [rsp + nb430nf_is3],ebx    	;# store is3 	mov   rax, [rsp + nb430nf_shiftvec]   ;# rax = base of shiftvec[] 	movss xmm0, [rax + rbx*4]	movss xmm1, [rax + rbx*4 + 4]	movss xmm2, [rax + rbx*4 + 8] 	mov   rcx, [rsp + nb430nf_iinr]       ;# rcx = pointer into iinr[] 		mov   ebx, [rcx + rsi*4]	    ;# ebx =ii 	mov   rdx, [rbp + nb430nf_charge]	movss xmm3, [rdx + rbx*4]		mulss xmm3, [rsp + nb430nf_facel]	shufps xmm3, xmm3, 0	mov   rdx, [rbp + nb430nf_invsqrta]	;# load invsqrta[ii]	movss xmm4, [rdx + rbx*4]	shufps xmm4, xmm4, 0    	mov   rdx, [rbp + nb430nf_type]     	mov   edx, [rdx + rbx*4]    	imul  edx, [rsp + nb430nf_ntype]    	shl   edx, 1    	mov   [rsp + nb430nf_ntia], edx		lea   rbx, [rbx + rbx*2]	;# rbx = 3*ii=ii3 	mov   rax, [rbp + nb430nf_pos]    ;# rax = base of pos[]  	addss xmm0, [rax + rbx*4]	addss xmm1, [rax + rbx*4 + 4]	addss xmm2, [rax + rbx*4 + 8]	movaps [rsp + nb430nf_iq], xmm3	movaps [rsp + nb430nf_isai], xmm4		shufps xmm0, xmm0, 0	shufps xmm1, xmm1, 0	shufps xmm2, xmm2, 0	movaps [rsp + nb430nf_ix], xmm0	movaps [rsp + nb430nf_iy], xmm1	movaps [rsp + nb430nf_iz], xmm2	mov   [rsp + nb430nf_ii3], ebx		;# clear vctot 	xorps xmm4, xmm4	movaps [rsp + nb430nf_vctot], xmm4	movaps [rsp + nb430nf_Vvdwtot], xmm4		mov   rax, [rsp + nb430nf_jindex]	mov   ecx, [rax + rsi*4]	     ;# jindex[n] 	mov   edx, [rax + rsi*4 + 4]	     ;# jindex[n+1] 	sub   edx, ecx               ;# number of innerloop atoms 	mov   rsi, [rbp + nb430nf_pos]	mov   rdi, [rbp + nb430nf_faction]		mov   rax, [rsp + nb430nf_jjnr]	shl   ecx, 2	add   rax, rcx	mov   [rsp + nb430nf_innerjjnr], rax     ;# pointer to jjnr[nj0] 	mov   ecx, edx	sub   edx,  4	add   ecx, [rsp + nb430nf_ninner]	mov   [rsp + nb430nf_ninner], ecx	add   edx, 0	mov   [rsp + nb430nf_innerk], edx    ;# number of innerloop atoms 	jge   .nb430nf_unroll_loop	jmp   .nb430nf_finish_inner.nb430nf_unroll_loop:		;# quad-unroll innerloop here 	mov   rdx, [rsp + nb430nf_innerjjnr]     ;# pointer to jjnr[k] 	mov   eax, [rdx]		mov   ebx, [rdx + 4]              	mov   ecx, [rdx + 8]            	mov   edx, [rdx + 12]         ;# eax-edx=jnr1-4 	add qword ptr [rsp + nb430nf_innerjjnr],  16 ;# advance pointer (unrolled 4) 	;# load isa2	mov rsi, [rbp + nb430nf_invsqrta]	movss xmm3, [rsi + rax*4]	movss xmm4, [rsi + rcx*4]	movss xmm6, [rsi + rbx*4]	movss xmm7, [rsi + rdx*4]	movaps xmm2, [rsp + nb430nf_isai]	shufps xmm3, xmm6, 0 	shufps xmm4, xmm7, 0 	shufps xmm3, xmm4, 136  ;# 10001000 ;# all charges in xmm3  	mulps  xmm2, xmm3		movaps [rsp + nb430nf_isaprod], xmm2	movaps xmm1, xmm2	mulps xmm1, [rsp + nb430nf_gbtsc]	movaps [rsp + nb430nf_gbscale], xmm1		mov rsi, [rbp + nb430nf_charge]    ;# base of charge[] 		movss xmm3, [rsi + rax*4]	movss xmm4, [rsi + rcx*4]	movss xmm6, [rsi + rbx*4]	movss xmm7, [rsi + rdx*4]	mulps xmm2, [rsp + nb430nf_iq]	shufps xmm3, xmm6, 0 	shufps xmm4, xmm7, 0 	shufps xmm3, xmm4, 136  ;# 10001000 ;# all charges in xmm3  	mulps  xmm3, xmm2	movaps [rsp + nb430nf_qq], xmm3		movd  mm0, eax		;# use mmx registers as temp storage 	movd  mm1, ebx	movd  mm2, ecx	movd  mm3, edx		mov rsi, [rbp + nb430nf_type]	mov eax, [rsi + rax*4]	mov ebx, [rsi + rbx*4]	mov ecx, [rsi + rcx*4]	mov edx, [rsi + rdx*4]	mov rsi, [rbp + nb430nf_vdwparam]	shl eax, 1		shl ebx, 1		shl ecx, 1		shl edx, 1		mov edi, [rsp + nb430nf_ntia]	add eax, edi	add ebx, edi	add ecx, edi	add edx, edi	movlps xmm6, [rsi + rax*4]	movlps xmm7, [rsi + rcx*4]	movhps xmm6, [rsi + rbx*4]	movhps xmm7, [rsi + rdx*4]	movaps xmm4, xmm6	shufps xmm4, xmm7, 136  ;# 10001000	shufps xmm6, xmm7, 221  ;# 11011101		movd  eax, mm0			movd  ebx, mm1	movd  ecx, mm2	movd  edx, mm3	movaps [rsp + nb430nf_c6], xmm4	movaps [rsp + nb430nf_c12], xmm6		mov rsi, [rbp + nb430nf_pos]       ;# base of pos[] 	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		lea   rcx, [rcx + rcx*2]     ;# replace jnr with j3 	lea   rdx, [rdx + rdx*2]		;# move four coordinates to xmm0-xmm2 		movlps xmm4, [rsi + rax*4]	movlps xmm5, [rsi + rcx*4]	movss xmm2, [rsi + rax*4 + 8]	movss xmm6, [rsi + rcx*4 + 8]	movhps xmm4, [rsi + rbx*4]	movhps xmm5, [rsi + rdx*4]	movss xmm0, [rsi + rbx*4 + 8]	movss xmm1, [rsi + rdx*4 + 8]	shufps xmm2, xmm0, 0	shufps xmm6, xmm1, 0		movaps xmm0, xmm4	movaps xmm1, xmm4	shufps xmm2, xmm6, 136  ;# 10001000		shufps xmm0, xmm5, 136  ;# 10001000	shufps xmm1, xmm5, 221  ;# 11011101			;# move ix-iz to xmm4-xmm6 	movaps xmm4, [rsp + nb430nf_ix]	movaps xmm5, [rsp + nb430nf_iy]	movaps xmm6, [rsp + nb430nf_iz]	;# calc dr 	subps xmm4, xmm0	subps xmm5, xmm1	subps xmm6, xmm2	;# 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 + nb430nf_three]	mulps xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb430nf_half]	subps xmm1, xmm5	;# 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm0, xmm1	;# xmm0=rinv 	mulps xmm4, xmm0	;# xmm4=r	movaps [rsp + nb430nf_r], xmm4	mulps xmm4, [rsp + nb430nf_gbscale]	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, 2	pslld mm7, 2	movd mm0, eax		movd mm1, ebx	movd mm2, ecx	movd mm3, edx	mov  rsi, [rbp + nb430nf_GBtab]	movd eax, mm6	psrlq mm6, 32	movd ecx, mm7	psrlq mm7, 32	movd ebx, mm6	movd edx, mm7		;# load coulomb table	movaps xmm4, [rsi + rax*4]	movaps xmm5, [rsi + rbx*4]	movaps xmm6, [rsi + rcx*4]	movaps xmm7, [rsi + rdx*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	;# coulomb table ready, in xmm4-xmm7  				mulps  xmm6, xmm1	;# xmm6=Geps 	mulps  xmm7, xmm2	;# xmm7=Heps2 	addps  xmm5, xmm6	addps  xmm5, xmm7	;# xmm5=Fp 		movaps xmm3, [rsp + nb430nf_qq]	mulps  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV 	mulps  xmm5, xmm3 ;# vcoul=qq*VV  	addps  xmm5, [rsp + nb430nf_vctot]	movaps [rsp + nb430nf_vctot], xmm5		movaps xmm4, [rsp + nb430nf_r]	mulps xmm4, [rsp + nb430nf_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  rsi, [rbp + nb430nf_VFtab]	movd eax, mm6	psrlq mm6, 32	movd ecx, mm7	psrlq mm7, 32	movd ebx, mm6	movd edx, mm7		;# dispersion 	movaps xmm4, [rsi + rax*4]	movaps xmm5, [rsi + rbx*4]	movaps xmm6, [rsi + rcx*4]	movaps xmm7, [rsi + rdx*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  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV 	mulps  xmm5, [rsp + nb430nf_c6]	 ;# Vvdw6	addps  xmm5, [rsp + nb430nf_Vvdwtot]	movaps [rsp + nb430nf_Vvdwtot], xmm5	;# repulsion 	movaps xmm4, [rsi + rax*4 + 16]	movaps xmm5, [rsi + rbx*4 + 16]	movaps xmm6, [rsi + rcx*4 + 16]	movaps xmm7, [rsi + rdx*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 	

⌨️ 快捷键说明

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