nb_kernel010_x86_64_sse.intel_syntax.s

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

S
1,299
字号
	mov   eax, [rdx]		mov   ebx, [rdx + 4]                  	add qword ptr [rsp + nb010_innerjjnr],  8 ;# advance pointer (unrolled 2) 	mov rsi, [rbp + nb010_type]	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb010_ntia]    	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb010_vdwparam]	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	    ;# xmm0=c6    ;# xmm3=c12	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		mov rdi, [rbp + nb010_pos]	;# load coordinates	movlps xmm1, [rdi + rax*4]	;# x1 y1  -  - 	movlps xmm4, [rdi + rbx*4]	;# x2 y2  -  -	movss xmm5, [rdi + rax*4 + 8]	;# z1 - - - 	movss xmm7, [rdi + rbx*4 + 8]	;# z2 - - -     unpcklps xmm1, xmm4 ;# x1 x2 y1 y2    movhlps  xmm2, xmm1 ;# y1 y2 -  -    unpcklps xmm5, xmm7 ;# z1 z2 -  - 	;# calc dr  	subps xmm1, [rsp + nb010_ix]	subps xmm2, [rsp + nb010_iy]	subps xmm5, [rsp + nb010_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    	rcpps xmm5, xmm1	;# 1/x lookup seed in xmm5 	movaps xmm6, [rsp + nb010_two]	mulps xmm1, xmm5	subps xmm6, xmm1	mulps xmm6, xmm5	;# xmm6=rinvsq		movaps xmm4, xmm6   ;# rinvsq	movaps xmm1, xmm6	mulps  xmm1, xmm6   ;# rinv4	mulps  xmm1, xmm6	;# rinv6	movaps xmm2, xmm1	mulps  xmm2, xmm2	;# xmm2=rinv12	mulps  xmm1, xmm0	mulps  xmm2, xmm3	movaps xmm5, xmm2	subps  xmm5, xmm1	;# Vvdw=Vvdw12-Vvdw6 	mulps  xmm1, [rsp + nb010_six]	mulps  xmm2, [rsp + nb010_twelve]	subps  xmm2, xmm1	mulps  xmm4, xmm2	;# xmm4=total fscal             xorps  xmm7, xmm7    movlhps xmm5, xmm7            ;# add potential to Vvdwtot (sum in xmm12)	addps  xmm12, 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    	;# xmm0-xmm2 contains tx-tz (partial force) 	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb010_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.nb010_checksingle:                                 mov   edx, [rsp + nb010_innerk]    and   edx, 1    jnz    .nb010_dosingle    jmp    .nb010_updateouterdata.nb010_dosingle:	    mov rcx, [rsp + nb010_innerjjnr]	mov   eax, [rcx]	            	mov rsi, [rbp + nb010_type]	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb010_ntia]	add r12d, edi	mov rsi, [rbp + nb010_vdwparam]	movss xmm0, [rsi + r12*4]    movss xmm3, [rsi + r12*4 + 4]	    ;# xmm0=c6    ;# xmm3=c12	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	mov rdi, [rbp + nb010_pos]	;# load coordinates	movss xmm1, [rdi + rax*4]		movss xmm2, [rdi + rax*4 + 4]	movss xmm5, [rdi + rax*4 + 8]	;# calc dr  	subss xmm1, [rsp + nb010_ix]	subss xmm2, [rsp + nb010_iy]	subss xmm5, [rsp + nb010_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    	;# rsq in xmm4 	rcpss xmm5, xmm1	;# 1/x lookup seed in xmm5 	movaps xmm6, [rsp + nb010_two]	mulss xmm1, xmm5	subss xmm6, xmm1	mulss xmm6, xmm5	;# xmm6=rinvsq		movaps xmm4, xmm6   ;# rinvsq	movaps xmm1, xmm6	mulss  xmm1, xmm6   ;# rinv4	mulss  xmm1, xmm6	;# rinv6	movaps xmm2, xmm1	mulss  xmm2, xmm2	;# xmm2=rinv12	mulss  xmm1, xmm0	mulss  xmm2, xmm3	movaps xmm5, xmm2	subss  xmm5, xmm1	;# Vvdw=Vvdw12-Vvdw6 	mulss  xmm1, [rsp + nb010_six]	mulss  xmm2, [rsp + nb010_twelve]	subss  xmm2, xmm1	mulss  xmm4, xmm2	;# xmm4=total fscal             ;# add potential to Vvdwtot (sum in xmm12)	addss  xmm12, 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 + nb010_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    .nb010_updateouterdata:	mov   ecx, [rsp + nb010_ii3]	mov   rdi, [rbp + nb010_faction]	mov   rsi, [rbp + nb010_fshift]	mov   edx, [rsp + nb010_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 + nb010_n]    ;# get group index for i particle     mov   rdx, [rbp + nb010_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 + nb010_Vvdw]	addss xmm12, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm12        ;# finish if last         mov ecx, [rsp + nb010_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jz .nb010_outerend        ;# not last, iterate outer loop once more!          mov [rsp + nb010_n], esi        jmp .nb010_outer.nb010_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [rsp + nb010_nri]	;# esi already loaded with n above        sub   ecx, esi        jz .nb010_end        ;# non-zero, do one more workunit        jmp   .nb010_threadloop.nb010_end:		emms	mov eax, [rsp + nb010_nouter]	mov ebx, [rsp + nb010_ninner]	mov rcx, [rbp + nb010_outeriter]	mov rdx, [rbp + nb010_inneriter]	mov [rcx], eax	mov [rdx], ebx	add rsp, 392		pop r15	pop r14	pop r13	pop r12	pop rbx	pop	rbp	ret	.globl nb_kernel010nf_x86_64_sse.globl _nb_kernel010nf_x86_64_ssenb_kernel010nf_x86_64_sse:	_nb_kernel010nf_x86_64_sse:	;#	Room for return address and rbp (16 bytes).equiv          nb010nf_fshift,         16.equiv          nb010nf_gid,            24.equiv          nb010nf_pos,            32.equiv          nb010nf_faction,        40.equiv          nb010nf_charge,         48.equiv          nb010nf_p_facel,        56.equiv          nb010nf_argkrf,         64.equiv          nb010nf_argcrf,         72.equiv          nb010nf_Vc,             80.equiv          nb010nf_type,           88.equiv          nb010nf_p_ntype,        96.equiv          nb010nf_vdwparam,       104.equiv          nb010nf_Vvdw,           112.equiv          nb010nf_p_tabscale,     120.equiv          nb010nf_VFtab,          128.equiv          nb010nf_invsqrta,       136.equiv          nb010nf_dvda,           144.equiv          nb010nf_p_gbtabscale,   152.equiv          nb010nf_GBtab,          160.equiv          nb010nf_p_nthreads,     168.equiv          nb010nf_count,          176.equiv          nb010nf_mtx,            184.equiv          nb010nf_outeriter,      192.equiv          nb010nf_inneriter,      200.equiv          nb010nf_work,           208        ;# The mutex (last arg) is not used in assembly.	;# stack offsets for local variables  	;# bottom of stack is cache-aligned for sse use .equiv          nb010nf_ix,             0.equiv          nb010nf_iy,             16.equiv          nb010nf_iz,             32.equiv          nb010nf_two,            48.equiv          nb010nf_c6,             64.equiv          nb010nf_c12,            80.equiv          nb010nf_Vvdwtot,        96.equiv          nb010nf_half,           112.equiv          nb010nf_three,          128.equiv          nb010nf_nri,            144.equiv          nb010nf_iinr,           152.equiv          nb010nf_jindex,         160.equiv          nb010nf_jjnr,           168.equiv          nb010nf_shift,          176.equiv          nb010nf_shiftvec,       184.equiv          nb010nf_innerjjnr,      192.equiv          nb010nf_facel,          200.equiv          nb010nf_ntia,           208.equiv          nb010nf_innerk,         216.equiv          nb010nf_is3,            220.equiv          nb010nf_ii3,            224.equiv          nb010nf_n,              228.equiv          nb010nf_nn1,            232.equiv          nb010nf_ntype,          236.equiv          nb010nf_nouter,         240.equiv          nb010nf_ninner,         244	push rbp	mov  rbp, rsp	push rbx        sub rsp, 264		; # local variable stack space (n*16+8)                                                         	emms	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb010nf_nouter], eax	mov [rsp + nb010nf_ninner], eax	mov edi, [rdi]	mov [rsp + nb010nf_nri], edi	mov [rsp + nb010nf_iinr], rsi	mov [rsp + nb010nf_jindex], rdx	mov [rsp + nb010nf_jjnr], rcx	mov [rsp + nb010nf_shift], r8	mov [rsp + nb010nf_shiftvec], r9	mov rdi, [rbp + nb010nf_p_ntype]	mov edi, [rdi]	mov [rsp + nb010nf_ntype], edi	;# create constant floating-point factors on stack	mov eax, 0x40000000     ;# 2.0 in IEEE (hex)	mov [rsp + nb010nf_two], eax	movss xmm1, [rsp + nb010nf_two]	shufps xmm1, xmm1, 0    ;# splat to all elements	movaps [rsp + nb010nf_two], xmm1.nb010nf_threadloop:        mov   rsi, [rbp + nb010nf_count]        ;# pointer to sync counter        mov   eax, [rsi].nb010nf_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 .nb010nf_spinlock

⌨️ 快捷键说明

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