nb_kernel410_x86_64_sse.intel_syntax.s

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

S
2,011
字号
    mulss  xmm9, xmm0 ;# (12*vnb12-6*vnb6)*rinv	mov rsi, [rbp + nb410_dvda]		;# Calculate dVda	xorps  xmm7, xmm7	mulss xmm3, [rsp + nb410_gbscale]	movaps xmm6, xmm3	mulss  xmm6, [rsp + nb410_r]	addss  xmm6, xmm5        ;# increment vctot (sum in xmm12)	addss  xmm12, xmm5	;# xmm6=(vcoul+fijC*r)	subss  xmm7, xmm6	movaps xmm6, xmm7    ;# update dvdasum    addss  xmm7, [rsp + nb410_dvdasum]    movss [rsp + nb410_dvdasum], xmm7 	;# update j atoms dvdaj	addss  xmm6, [rsi + rax*4]	movss  [rsi + rax*4], xmm6    subss  xmm9, xmm3    mulss  xmm9, xmm0 ;# fscal    movaps  xmm10, xmm9    movaps  xmm11, xmm9    mulss   xmm9, [rsp + nb410_dx]    mulss   xmm10, [rsp + nb410_dy]    mulss   xmm11, [rsp + nb410_dz]    	;# accumulate i forces    addss xmm13, xmm9    addss xmm14, xmm10    addss xmm15, xmm11	mov rsi, [rbp + nb410_faction]    ;# add to j forces    addss  xmm9,  [rsi + r8*4]    addss  xmm10, [rsi + r8*4 + 4]    addss  xmm11, [rsi + r8*4 + 8]    movss  [rsi + r8*4],     xmm9    movss  [rsi + r8*4 + 4], xmm10    movss  [rsi + r8*4 + 8], xmm11    .nb410_updateouterdata:	mov   ecx, [rsp + nb410_ii3]	mov   rdi, [rbp + nb410_faction]	mov   rsi, [rbp + nb410_fshift]	mov   edx, [rsp + nb410_is3]	;# accumulate i forces in xmm13, xmm14, xmm15	movhlps xmm0, xmm13	movhlps xmm1, xmm14	movhlps xmm2, xmm15	addps  xmm0, xmm13	addps  xmm1, xmm14	addps  xmm2, xmm15     movaps xmm3, xmm0		movaps xmm4, xmm1		movaps xmm5, xmm2		shufps xmm3, xmm3, 1	shufps xmm4, xmm4, 1	shufps xmm5, xmm5, 1	addss  xmm0, xmm3	addss  xmm1, xmm4	addss  xmm2, xmm5	;# xmm0-xmm2 has single force in pos0 	;# increment i force 	movss  xmm3, [rdi + rcx*4]	movss  xmm4, [rdi + rcx*4 + 4]	movss  xmm5, [rdi + rcx*4 + 8]	subss  xmm3, xmm0	subss  xmm4, xmm1	subss  xmm5, xmm2	movss  [rdi + rcx*4],     xmm3	movss  [rdi + rcx*4 + 4], xmm4	movss  [rdi + rcx*4 + 8], xmm5	;# increment fshift force  	movss  xmm3, [rsi + rdx*4]	movss  xmm4, [rsi + rdx*4 + 4]	movss  xmm5, [rsi + rdx*4 + 8]	subss  xmm3, xmm0	subss  xmm4, xmm1	subss  xmm5, xmm2	movss  [rsi + rdx*4],     xmm3	movss  [rsi + rdx*4 + 4], xmm4	movss  [rsi + rdx*4 + 8], xmm5	;# get n from stack	mov esi, [rsp + nb410_n]        ;# get group index for i particle         mov   rdx, [rbp + nb410_gid]      	;# base of gid[]        mov   edx, [rdx + rsi*4]		;# ggid=gid[n]	;# accumulate total potential energy and update it 	;# accumulate 	movhlps xmm6, xmm12	addps  xmm12, xmm6	;# pos 0-1 in xmm12 have the sum now 	movaps xmm6, xmm12	shufps xmm6, xmm6, 1	addss  xmm12, xmm6	;# add earlier value from mem 	mov   rax, [rbp + nb410_Vc]	addss xmm12, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm12		;# accumulate total lj energy and update it 	movaps xmm7, [rsp + nb410_Vvdwtot]	;# accumulate 	movhlps xmm6, xmm7	addps  xmm7, xmm6	;# pos 0-1 in xmm7 have the sum now 	movaps xmm6, xmm7	shufps xmm6, xmm6, 1	addss  xmm7, xmm6			;# add earlier value from mem 	mov   rax, [rbp + nb410_Vvdw]	addss xmm7, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm7 		;# accumulate dVda and update it 	movaps xmm7, [rsp + nb410_dvdasum]	;# accumulate 	movhlps xmm6, xmm7	addps  xmm7, xmm6	;# pos 0-1 in xmm7 have the sum now 	movaps xmm6, xmm7	shufps xmm6, xmm6, 1	addss  xmm7, xmm6				mov edx, [rsp + nb410_ii]	mov rax, [rbp + nb410_dvda]	addss xmm7, [rax + rdx*4]	movss [rax + rdx*4], xmm7	        ;# finish if last         mov ecx, [rsp + nb410_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jz .nb410_outerend        ;# not last, iterate outer loop once more!          mov [rsp + nb410_n], esi        jmp .nb410_outer.nb410_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [rsp + nb410_nri]	;# esi already loaded with n above        sub   ecx, esi        jz .nb410_end        ;# non-zero, do one more workunit        jmp   .nb410_threadloop.nb410_end:	mov eax, [rsp + nb410_nouter]	mov ebx, [rsp + nb410_ninner]	mov rcx, [rbp + nb410_outeriter]	mov rdx, [rbp + nb410_inneriter]	mov [rcx], eax	mov [rdx], ebx	add rsp, 568	emms        pop r15        pop r14        pop r13        pop r12	pop rbx	pop	rbp	ret.globl nb_kernel410nf_x86_64_sse.globl _nb_kernel410nf_x86_64_ssenb_kernel410nf_x86_64_sse:	_nb_kernel410nf_x86_64_sse:	;#	Room for return address and rbp (16 bytes).equiv          nb410nf_fshift,         16.equiv          nb410nf_gid,            24.equiv          nb410nf_pos,            32.equiv          nb410nf_faction,        40.equiv          nb410nf_charge,         48.equiv          nb410nf_p_facel,        56.equiv          nb410nf_argkrf,         64.equiv          nb410nf_argcrf,         72.equiv          nb410nf_Vc,             80.equiv          nb410nf_type,           88.equiv          nb410nf_p_ntype,        96.equiv          nb410nf_vdwparam,       104.equiv          nb410nf_Vvdw,           112.equiv          nb410nf_p_tabscale,     120.equiv          nb410nf_VFtab,          128.equiv          nb410nf_invsqrta,       136.equiv          nb410nf_dvda,           144.equiv          nb410nf_p_gbtabscale,   152.equiv          nb410nf_GBtab,          160.equiv          nb410nf_p_nthreads,     168.equiv          nb410nf_count,          176.equiv          nb410nf_mtx,            184.equiv          nb410nf_outeriter,      192.equiv          nb410nf_inneriter,      200.equiv          nb410nf_work,           208	;# stack offsets for local variables  	;# bottom of stack is cache-aligned for sse use .equiv          nb410nf_ix,             0.equiv          nb410nf_iy,             16.equiv          nb410nf_iz,             32.equiv          nb410nf_iq,             48.equiv          nb410nf_gbtsc,          64.equiv          nb410nf_qq,             80.equiv          nb410nf_c6,             96.equiv          nb410nf_c12,            112.equiv          nb410nf_vctot,          128.equiv          nb410nf_Vvdwtot,        144.equiv          nb410nf_half,           160.equiv          nb410nf_three,          176.equiv          nb410nf_isai,           192.equiv          nb410nf_isaprod,        208.equiv          nb410nf_gbscale,        224.equiv          nb410nf_nri,            240.equiv          nb410nf_iinr,           248.equiv          nb410nf_jindex,         256.equiv          nb410nf_jjnr,           264.equiv          nb410nf_shift,          272.equiv          nb410nf_shiftvec,       280.equiv          nb410nf_facel,          288.equiv          nb410nf_innerjjnr,      296.equiv          nb410nf_is3,            304.equiv          nb410nf_ii3,            308.equiv          nb410nf_ntia,           312.equiv          nb410nf_innerk,         316.equiv          nb410nf_n,              320.equiv          nb410nf_nn1,            324.equiv          nb410nf_ntype,          328.equiv          nb410nf_nouter,         332.equiv          nb410nf_ninner,         336	push rbp	mov  rbp, rsp	push rbx		emms        push r12        push r13        push r14        push r15	sub rsp, 360		;# local variable stack space (n*16+8)	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb410nf_nouter], eax	mov [rsp + nb410nf_ninner], eax	mov edi, [rdi]	mov [rsp + nb410nf_nri], edi	mov [rsp + nb410nf_iinr], rsi	mov [rsp + nb410nf_jindex], rdx	mov [rsp + nb410nf_jjnr], rcx	mov [rsp + nb410nf_shift], r8	mov [rsp + nb410nf_shiftvec], r9	mov rdi, [rbp + nb410nf_p_ntype]	mov edi, [rdi]	mov [rsp + nb410nf_ntype], edi	mov rsi, [rbp + nb410nf_p_facel]	movss xmm0, [rsi]	movss [rsp + nb410nf_facel], xmm0	mov rbx, [rbp + nb410nf_p_gbtabscale]	movss xmm4, [rbx]	shufps xmm4, xmm4, 0	movaps [rsp + nb410nf_gbtsc],  xmm4	;# create constant floating-point factors on stack	mov eax, 0x3f000000     ;# half in IEEE (hex)	mov [rsp + nb410nf_half], eax	movss xmm1, [rsp + nb410nf_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 + nb410nf_half],  xmm1	movaps [rsp + nb410nf_three],  xmm3.nb410nf_threadloop:        mov   rsi, [rbp + nb410nf_count]          ;# pointer to sync counter        mov   eax, [rsi].nb410nf_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 .nb410nf_spinlock        ;# if(nn1>nri) nn1=nri        mov ecx, [rsp + nb410nf_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 + nb410nf_n], eax        mov [rsp + nb410nf_nn1], ebx        sub ebx, eax                            ;# calc number of outer lists	mov esi, eax				;# copy n to esi        jg  .nb410nf_outerstart        jmp .nb410nf_end.nb410nf_outerstart:	;# ebx contains number of outer iterations	add ebx, [rsp + nb410nf_nouter]	mov [rsp + nb410nf_nouter], ebx.nb410nf_outer:	mov   rax, [rsp + nb410nf_shift]      ;# rax = pointer into shift[] 	mov   ebx, [rax+rsi*4]		;# ebx=shift[n] 		lea   rbx, [rbx + rbx*2]    ;# rbx=3*is 	mov   [rsp + nb410nf_is3],ebx    	;# store is3 	mov   rax, [rsp + nb410nf_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 + nb410nf_iinr]       ;# rcx = pointer into iinr[] 		mov   ebx, [rcx + rsi*4]	    ;# ebx =ii		mov   rdx, [rbp + nb410nf_charge]	movss xmm3, [rdx + rbx*4]		mulss xmm3, [rsp + nb410nf_facel]	shufps xmm3, xmm3, 0	mov   rdx, [rbp + nb410nf_invsqrta]	;# load invsqrta[ii]	movss xmm4, [rdx + rbx*4]	shufps xmm4, xmm4, 0    	mov   rdx, [rbp + nb410nf_type]     	mov   edx, [rdx + rbx*4]    	imul  edx, [rsp + nb410nf_ntype]    	shl   edx, 1    	mov   [rsp + nb410nf_ntia], edx		lea   rbx, [rbx + rbx*2]	;# rbx = 3*ii=ii3 	mov   rax, [rbp + nb410nf_pos]    ;# rax = base of pos[]  	addss xmm0, [rax + rbx*4]	addss xmm1, [rax + rbx*4 + 4]	addss xmm2, [rax + rbx*4 + 8]	movaps [rsp + nb410nf_iq], xmm3	movaps [rsp + nb410nf_isai], xmm4		shufps xmm0, xmm0, 0	shufps xmm1, xmm1, 0	shufps xmm2, xmm2, 0	movaps [rsp + nb410nf_ix], xmm0	movaps [rsp + nb410nf_iy], xmm1	movaps [rsp + nb410nf_iz], xmm2	mov   [rsp + nb410nf_ii3], ebx		;# clear vctot	xorps xmm4, xmm4	movaps [rsp + nb410nf_vctot], xmm4	movaps [rsp + nb410nf_Vvdwtot], xmm4		mov   rax, [rsp + nb410nf_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 + nb410nf_pos]	mov   rdi, [rbp + nb410nf_faction]		mov   rax, [rsp + nb410nf_jjnr]	shl   ecx, 2	add   rax, rcx	mov   [rsp + nb410nf_innerjjnr], rax     ;# pointer to jjnr[nj0] 	mov   ecx, edx	sub   edx,  4	add   ecx, [rsp + nb410nf_ninner]	mov   [rsp + nb410nf_ninner], ecx	add   edx, 0	mov   [rsp + nb410nf_innerk], edx    ;# number of innerloop atoms 	jge   .nb410nf_unroll_loop	jmp   .nb410nf_finish_inner.nb410nf_unroll_loop:		;# quad-unroll innerloop here 	mov   rdx, [rsp + nb410nf_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 + nb410nf_innerjjnr],  16 ;# advance pointer (unrolled 4) 	;# load isa2	mov rsi, [rbp + nb410nf_invsqrta]	movss xmm3, [rsi + rax*4]	movss xmm4, [rsi + rcx*4]	movss xmm6, [rsi + rbx*4]	movss xmm7, [rsi + rdx*4]	movaps xmm2, [rsp + nb410nf_isai]	shufps xmm3, xmm6, 0 	shufps xmm4, xmm7, 0 	shufps xmm3, xmm4, 136  ;# 10001000 ;# all charges in xmm3  	mulps  xmm2, xmm3		movaps [rsp + nb410nf_isaprod], xmm2	movaps xmm1, xmm2	mulps xmm1, [rsp + nb410nf_gbtsc]	movaps [rsp + nb410nf_gbscale], xmm1		mov rsi, [rbp + nb410nf_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 + nb410nf_iq]	shufps xmm3, xmm6, 0 	shufps xmm4, xmm7, 0 	shufps xmm3, xmm4, 136  ;# 10001000 ;# all charges in xmm3  	mulps  xmm3, xmm2	movaps [rsp + nb410nf_qq], xmm3		movd mm0, eax	movd mm1, ebx	movd mm2, ecx	movd mm3, edx		mov rsi, [rbp + nb410nf_type]	mov eax, [rsi + rax*4]	mov ebx, [rsi + rbx*4]	mov ecx, [rsi + rcx*4]	mov edx, [rsi + rdx*4]	mov rsi, [rbp + nb410nf_vdwparam]	shl eax, 1		shl ebx, 1		shl ecx, 1		shl edx, 1		mov edi, [rsp + nb410nf_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 + nb410nf_c6], xmm4	movaps [rsp + nb410nf_c12], xmm6		mov rsi, [rbp + nb410nf_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]

⌨️ 快捷键说明

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