nb_kernel210_x86_64_sse.intel_syntax.s

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

S
1,550
字号
	movlps xmm3, [rsi + r12*4]	movhps xmm3, [rsi + r13*4]    xorps  xmm7, xmm7	movaps xmm0, xmm3	shufps xmm0, xmm7, 136  ;# 10001000	shufps xmm3, xmm7, 221  ;# 11011101	        movaps [rsp + nb210_c6], xmm0    movaps [rsp + nb210_c12], xmm3	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		;# load coordinates	mov rdi, [rbp + nb210_pos]    	movlps xmm1, [rdi + rax*4]	;# x1 y1 - - 	movlps xmm2, [rdi + rbx*4]	;# x2 y2 - - 	movss xmm5, [rdi + rax*4 + 8]	;# z1 - - - 	movss xmm6, [rdi + rbx*4 + 8]	;# z2 - - -     unpcklps xmm1, xmm2 ;# x1 x2 y1 y2    movhlps  xmm2, xmm1 ;# y1 y2 -  -    unpcklps xmm5, xmm6 ;# z1 z2 -  -	;# calc dr  	subps xmm1, [rsp + nb210_ix]	subps xmm2, [rsp + nb210_iy]	subps xmm5, [rsp + nb210_iz]	;# store dr in xmm9-xmm11    movaps xmm9, xmm1    movaps xmm10, xmm2    movaps xmm11, xmm5    	;# square it 	mulps xmm1,xmm1	mulps xmm2,xmm2	mulps xmm5,xmm5	addps xmm1, xmm2	addps xmm1, xmm5	;# rsq in xmm1        movaps xmm7, [rsp + nb210_krf]     mulps  xmm7, xmm1    ;# krsq        ;# calculate rinv=1/sqrt(rsq)	rsqrtps xmm5, xmm1	movaps xmm6, xmm5	mulps xmm5, xmm5	movaps xmm4, [rsp + nb210_three]	mulps xmm5, xmm1	;# rsq*lu*lu 	    subps xmm4, xmm5	;# 30-rsq*lu*lu 	mulps xmm4, xmm6		mulps xmm4, [rsp + nb210_half]		movaps xmm1, xmm4	mulps  xmm4, xmm4	    ;# xmm1=rinv    ;# xmm4=rinvsq     movaps xmm3, xmm1        subps  xmm1, xmm7    subps  xmm1, xmm7   ;# rinv-2*krsq    addps  xmm3, xmm7   ;# rinv+krsq        subps  xmm3, [rsp + nb210_crf] ;# rinv+krsq-crf    mulps  xmm3, xmm12  ;# vcoul=qq*(rinv+krsq-crf)    mulps  xmm1, xmm12  ;# fijC        	movaps xmm5, xmm4	mulps  xmm5, xmm4   ;# rinv4	mulps  xmm5, xmm4	;# rinv6	movaps xmm6, xmm5	mulps  xmm5, xmm5	;# xmm5=rinv12        ;# add to vctot    addps  xmm3, [rsp + nb210_vctot]    movlps [rsp + nb210_vctot], xmm3    	mulps  xmm6, [rsp + nb210_c6]   ;# vvdw6=c6*rinv6	mulps  xmm5, [rsp + nb210_c12]  ;# vvdw12=c12*rinv12     	movaps xmm7, xmm5	subps  xmm5, xmm6	;# Vvdw=Vvdw12-Vvdw6     	mulps  xmm6, [rsp + nb210_six]	mulps  xmm7, [rsp + nb210_twelve]	subps  xmm7, xmm6    addps  xmm1, xmm7	mulps  xmm4, xmm1	;# xmm4=total fscal         xorps  xmm7, xmm7    movlhps xmm5, xmm7        ;# add potential to Vvdwtot 	addps  xmm5, [rsp + nb210_Vvdwtot]    movaps [rsp + nb210_Vvdwtot], xmm5        ;# calculate scalar force by multiplying dx/dy/dz with fscal	mulps  xmm9, xmm4	mulps  xmm10, xmm4	mulps  xmm11, xmm4    movlhps xmm9, xmm7    movlhps xmm10, xmm7    movlhps xmm11, xmm7    	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb210_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + rax*4] ;# x1 y1 - -	movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2    unpcklps xmm9, xmm10  ;# x1 y1 x2 y2    addps    xmm0, xmm9	movlps [rsi + rax*4], xmm0	movhps [rsi + rbx*4], xmm0        ;# z forces    pshufd xmm8, xmm11, 1    addss  xmm11, [rsi + rax*4 + 8]     addss  xmm8,  [rsi + rbx*4 + 8]    movss  [rsi + rax*4 + 8], xmm11    movss  [rsi + rbx*4 + 8], xmm8.nb210_checksingle:                                 mov   edx, [rsp + nb210_innerk]    and   edx, 1    jnz    .nb210_dosingle    jmp    .nb210_updateouterdata.nb210_dosingle:	    mov rcx, [rsp + nb210_innerjjnr]	mov   eax, [rcx]	            	mov rsi, [rbp + nb210_charge]	movss xmm12, [rsi + rax*4]       mulss xmm12, [rsp + nb210_iq] ;# qq	mov rsi, [rbp + nb210_type]	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb210_ntia]	add r12d, edi	mov rsi, [rbp + nb210_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb210_c6], xmm0    movaps [rsp + nb210_c12], xmm3	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	mov rdi, [rbp + nb210_pos]	;# load coordinates	movss xmm1, [rdi + rax*4]	    ;# x1 - - - 	movss xmm2, [rdi + rax*4 + 4]    ;# y2 - - - 	movss xmm5, [rdi + rax*4 + 8]    ;# 13 - - - 	;# calc dr  	subss xmm1, [rsp + nb210_ix]	subss xmm2, [rsp + nb210_iy]	subss xmm5, [rsp + nb210_iz]	;# store dr in xmm9-xmm11    movaps xmm9, xmm1    movaps xmm10, xmm2    movaps xmm11, xmm5    	;# square it 	mulss xmm1,xmm1	mulss xmm2,xmm2	mulss xmm5,xmm5	addss xmm1, xmm2	addss xmm1, xmm5	;# rsq in xmm1        movaps xmm7, [rsp + nb210_krf]     mulss  xmm7, xmm1    ;# krsq        ;# calculate rinv=1/sqrt(rsq)	rsqrtss xmm5, xmm1	movaps xmm6, xmm5	mulss xmm5, xmm5	movaps xmm4, [rsp + nb210_three]	mulss xmm5, xmm1	;# rsq*lu*lu 	    subss xmm4, xmm5	;# 30-rsq*lu*lu 	mulss xmm4, xmm6		mulss xmm4, [rsp + nb210_half]		movaps xmm1, xmm4	mulss  xmm4, xmm4	    ;# xmm1=rinv    ;# xmm4=rinvsq     movaps xmm3, xmm1        subss  xmm1, xmm7    subss  xmm1, xmm7   ;# rinv-2*krsq    addss  xmm3, xmm7   ;# rinv+krsq        subss  xmm3, [rsp + nb210_crf] ;# rinv+krsq-crf    mulss  xmm3, xmm12  ;# vcoul=qq*(rinv+krsq-crf)    mulss  xmm1, xmm12  ;# fijC        	movaps xmm5, xmm4	mulss  xmm5, xmm4   ;# rinv4	mulss  xmm5, xmm4	;# rinv6	movaps xmm6, xmm5	mulss  xmm5, xmm5	;# xmm5=rinv12        ;# add to vctot    addss  xmm3, [rsp + nb210_vctot]    movss [rsp + nb210_vctot], xmm3    	mulss  xmm6, [rsp + nb210_c6]   ;# vvdw6=c6*rinv6	mulss  xmm5, [rsp + nb210_c12]   ;# vvdw12=c12*rinv12     	movaps xmm7, xmm5	subss  xmm5, xmm6	;# Vvdw=Vvdw12-Vvdw6     	mulss  xmm6, [rsp + nb210_six]	mulss  xmm7, [rsp + nb210_twelve]	subss  xmm7, xmm6    addss  xmm1, xmm7	mulss  xmm4, xmm1	;# xmm4=total fscal     ;# add potential to Vvdwtot 	addss  xmm5, [rsp + nb210_Vvdwtot]    movss  [rsp + nb210_Vvdwtot], xmm5        ;# calculate scalar force by multiplying dx/dy/dz with fscal	mulss  xmm9, xmm4	mulss  xmm10, xmm4	mulss  xmm11, xmm4    	;# xmm0-xmm2 contains tx-tz (partial force) 	;# accumulate i forces    addss xmm13, xmm9    addss xmm14, xmm10    addss xmm15, xmm11	mov rsi, [rbp + nb210_faction]    ;# add to j forces    addss  xmm9,  [rsi + rax*4]    addss  xmm10, [rsi + rax*4 + 4]    addss  xmm11, [rsi + rax*4 + 8]    movss  [rsi + rax*4],     xmm9    movss  [rsi + rax*4 + 4], xmm10    movss  [rsi + rax*4 + 8], xmm11    .nb210_updateouterdata:	mov   ecx, [rsp + nb210_ii3]	mov   rdi, [rbp + nb210_faction]	mov   rsi, [rbp + nb210_fshift]	mov   edx, [rsp + nb210_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 + nb210_n]        ;# get group index for i particle         mov   rdx, [rbp + nb210_gid]      	;# base of gid[]        mov   edx, [rdx + rsi*4]		;# ggid=gid[n]	;# accumulate total potential energy and update it 	movaps xmm7, [rsp + nb210_vctot]	;# 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 + nb210_Vc]	addss xmm7, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm7 		;# accumulate total potential energy and update it 	movaps xmm12, [rsp + nb210_Vvdwtot]    ;# 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 + nb210_Vvdw]	addss xmm12, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm12	        ;# finish if last         mov ecx, [rsp + nb210_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jz .nb210_outerend        ;# not last, iterate outer loop once more!          mov [rsp + nb210_n], esi        jmp .nb210_outer.nb210_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [rsp + nb210_nri]	;# esi already loaded with n above        sub   ecx, esi        jz .nb210_end        ;# non-zero, do one more workunit        jmp   .nb210_threadloop.nb210_end:	mov eax, [rsp + nb210_nouter]	mov ebx, [rsp + nb210_ninner]	mov rcx, [rbp + nb210_outeriter]	mov rdx, [rbp + nb210_inneriter]	mov [rcx], eax	mov [rdx], ebx	add rsp, 440	emms        pop r15        pop r14        pop r13        pop r12	pop rbx	pop	rbp	ret.globl nb_kernel210nf_x86_64_sse.globl _nb_kernel210nf_x86_64_ssenb_kernel210nf_x86_64_sse:	_nb_kernel210nf_x86_64_sse:	;#	Room for return address and rbp (16 bytes).equiv          nb210nf_fshift,         16.equiv          nb210nf_gid,            24.equiv          nb210nf_pos,            32.equiv          nb210nf_faction,        40.equiv          nb210nf_charge,         48.equiv          nb210nf_p_facel,        56.equiv          nb210nf_argkrf,         64.equiv          nb210nf_argcrf,         72.equiv          nb210nf_Vc,             80.equiv          nb210nf_type,           88.equiv          nb210nf_p_ntype,        96.equiv          nb210nf_vdwparam,       104.equiv          nb210nf_Vvdw,           112.equiv          nb210nf_p_tabscale,     120.equiv          nb210nf_VFtab,          128.equiv          nb210nf_invsqrta,       136.equiv          nb210nf_dvda,           144.equiv          nb210nf_p_gbtabscale,   152.equiv          nb210nf_GBtab,          160.equiv          nb210nf_p_nthreads,     168.equiv          nb210nf_count,          176.equiv          nb210nf_mtx,            184.equiv          nb210nf_outeriter,      192.equiv          nb210nf_inneriter,      200.equiv          nb210nf_work,           208	;# stack offsets for local variables  	;# bottom of stack is cache-aligned for sse use .equiv          nb210nf_ix,             0.equiv          nb210nf_iy,             16.equiv          nb210nf_iz,             32.equiv          nb210nf_iq,             48.equiv          nb210nf_c6,             64.equiv          nb210nf_c12,            80.equiv          nb210nf_vctot,          96.equiv          nb210nf_Vvdwtot,        112.equiv          nb210nf_half,           128.equiv          nb210nf_three,          144.equiv          nb210nf_krf,            160.equiv          nb210nf_crf,            176.equiv          nb210nf_nri,            192.equiv          nb210nf_iinr,           200.equiv          nb210nf_jindex,         208.equiv          nb210nf_jjnr,           216.equiv          nb210nf_shift,          224.equiv          nb210nf_shiftvec,       232.equiv          nb210nf_facel,          240.equiv          nb210nf_innerjjnr,      248.equiv          nb210nf_is3,            256.equiv          nb210nf_ii3,            260.equiv          nb210nf_ntia,           264.equiv          nb210nf_innerk,         268.equiv          nb210nf_n,              272.equiv          nb210nf_nn1,            276.equiv          nb210nf_ntype,          280.equiv          nb210nf_nouter,         284.equiv          nb210nf_ninner,         288	push rbp	mov  rbp, rsp	push rbx		emms        push r12        push r13        push r14        push r15	sub rsp, 312		;# local variable stack space (n*16+8)	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb210nf_nouter], eax	mov [rsp + nb210nf_ninner], eax	mov edi, [rdi]	mov [rsp + nb210nf_nri], edi	mov [rsp + nb210nf_iinr], rsi	mov [rsp + nb210nf_jindex], rdx	mov [rsp + nb210nf_jjnr], rcx	mov [rsp + nb210nf_shift], r8	mov [rsp + nb210nf_shiftvec], r9	mov rdi, [rbp + nb210nf_p_ntype]	mov edi, [rdi]	mov [rsp + nb210nf_ntype], edi	mov rsi, [rbp + nb210nf_p_facel]	movss xmm0, [rsi]	movss [rsp + nb210nf_facel], xmm0	mov rsi, [rbp + nb210nf_argkrf]	mov rdi, [rbp + nb210nf_argcrf]	movss xmm1, [rsi]	movss xmm2, [rdi]	shufps xmm1, xmm1, 0	shufps xmm2, xmm2, 0	movaps [rsp + nb210nf_krf], xmm1	movaps [rsp + nb210nf_crf], xmm2	;# create constant floating-point factors on stack	mov eax, 0x3f000000     ;# half in IEEE (hex)	mov [rsp + nb210nf_half], eax	movss xmm1, [rsp + nb210nf_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 + nb210nf_half],  xmm1	movaps [rsp + nb210nf_three],  xmm3.nb210nf_threadloop:        mov   rsi, [rbp + nb210nf_count]          ;# pointer to sync counter        mov   eax, [rsi].nb210nf_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 .nb210nf_spinlock        ;# if(nn1>nri) nn1=nri

⌨️ 快捷键说明

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