nb_kernel430_x86_64_sse.intel_syntax.s

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

S
2,332
字号
	addss  xmm6, [rsi + rax*4]	addss  xmm5, [rsi + rbx*4]	movss  [rsi + rax*4], xmm6	movss  [rsi + rbx*4], xmm5	xorps  xmm4, xmm4		mulps xmm3, [rsp + nb430_rinv]	subps  xmm4, xmm3    movaps  xmm9, xmm4    movaps  xmm10, xmm4    movaps  xmm11, xmm4        mulps  xmm9, [rsp + nb430_dx]    mulps  xmm10, [rsp + nb430_dy]    mulps  xmm11, [rsp + nb430_dz]        	;# accumulate i forces    movaps xmm12, [rsp + nb430_fix]    movaps xmm13, [rsp + nb430_fiy]    movaps xmm14, [rsp + nb430_fiz]    addps xmm12, xmm9    addps xmm13, xmm10    addps xmm14, xmm11    movlps [rsp + nb430_fix], xmm12    movlps [rsp + nb430_fiy], xmm13    movlps [rsp + nb430_fiz], xmm14	mov rsi, [rbp + nb430_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + r8*4] ;# x1 y1 - -	movhps xmm0, [rsi + r9*4] ;# x1 y1 x2 y2    unpcklps xmm9, xmm10  ;# x1 y1 x2 y2    addps    xmm0, xmm9	movlps [rsi + r8*4], xmm0	movhps [rsi + r9*4], xmm0        ;# z forces    pshufd xmm8, xmm11, 1    addss  xmm11, [rsi + r8*4 + 8]     addss  xmm8,  [rsi + r9*4 + 8]    movss  [rsi + r8*4 + 8], xmm11    movss  [rsi + r9*4 + 8], xmm8.nb430_checksingle:					mov   edx, [rsp + nb430_innerk]	and   edx, 1	jnz    .nb430_dosingle	jmp    .nb430_updateouterdata.nb430_dosingle:	mov rsi, [rbp + nb430_charge]	mov rdx, [rbp + nb430_invsqrta]	mov rdi, [rbp + nb430_pos]	mov   rcx, [rsp + nb430_innerjjnr]	mov   eax, [rcx]		;# load isaj	mov rsi, [rbp + nb430_invsqrta]	movss xmm3, [rsi + rax*4]	movaps xmm2, [rsp + nb430_isai]	mulss  xmm2, xmm3    movaps [rsp + nb430_isaprod], xmm2	    	movaps xmm1, xmm2	mulss xmm1, [rsp + nb430_gbtsc]	movaps [rsp + nb430_gbscale], xmm1		mov rsi, [rbp + nb430_charge]    ;# base of charge[] 		movss xmm3, [rsi + rax*4]	mulss xmm2, [rsp + nb430_iq]	mulss  xmm3, xmm2	movaps [rsp + nb430_qq], xmm3		    ;# vdw parameters	mov rsi, [rbp + nb430_type]	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb430_ntia]	add r12d, edi	mov rsi, [rbp + nb430_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb430_c6], xmm0    movaps [rsp + nb430_c12], xmm3    	mov rsi, [rbp + nb430_pos]       ;# base of pos[] 			lea   r8, [rax + rax*2]     ;# j3	;# move four coordinates to xmm0-xmm2 	    movss  xmm0, [rsi + r8*4]    movss  xmm1, [rsi + r8*4 + 4]    movss  xmm2, [rsi + r8*4 + 8]    	;# calc dr 	subss xmm0, [rsp + nb430_ix]	subss xmm1, [rsp + nb430_iy]	subss xmm2, [rsp + nb430_iz]	;# store dr 	movaps [rsp + nb430_dx], xmm0	movaps [rsp + nb430_dy], xmm1	movaps [rsp + nb430_dz], xmm2	;# square it 	mulss xmm0,xmm0	mulss xmm1,xmm1	mulss xmm2,xmm2	addss xmm0, xmm1	addss xmm0, xmm2    movaps xmm4, xmm0	;# rsq in xmm4 	rsqrtss xmm5, xmm4	;# lookup seed in xmm5 	movaps xmm2, xmm5	mulss xmm5, xmm5	movaps xmm1, [rsp + nb430_three]	mulss xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb430_half]	subss xmm1, xmm5	;# 30-rsq*lu*lu 	mulss xmm1, xmm2		mulss xmm0, xmm1	;# xmm0=rinv 	mulss xmm4, xmm0	;# xmm4=r	movaps [rsp + nb430_r], xmm4    movaps [rsp + nb430_rinv], xmm0        movaps xmm8, xmm4    ;# r	mulss xmm4, [rsp + nb430_gbscale] ;# rgbtab    mulss xmm8, [rsp + nb430_tsc]    ;# rtab        ;# truncate and convert to integers    cvttss2si r12d, xmm4  ;# gb    cvttss2si r14d, xmm8  ;# lj        ;# convert back to float    cvtsi2ss  xmm6, r12d   ;# gb    cvtsi2ss  xmm10, r14d  ;# lj        ;# multiply by 4 and 8, respectively    shl   r12d, 2   ;# gb    shl   r14d, 3   ;# lj    ;# GB index: r12   LJ indices: r14        ;# calculate eps    subss     xmm4, xmm6   ;# gb    subss     xmm8, xmm10  ;# lj    movaps    [rsp + nb430_epsgb], xmm4 ;# gb eps    movaps    [rsp + nb430_eps], xmm8 ;# lj eps    	mov  rsi, [rbp + nb430_GBtab]	mov  rdi, [rbp + nb430_VFtab]    ;# load GB table data to xmm0-xmm3, disp to xmm4-xmm7, rep. to xmm8-xmm11    movss  xmm0,  [rsi + r12*4]    movss  xmm1,  [rsi + r12*4 + 4]    movss  xmm2,  [rsi + r12*4 + 8]    movss  xmm3,  [rsi + r12*4 + 12]    movss  xmm4,  [rdi + r14*4]    movss  xmm5,  [rdi + r14*4 + 4]    movss  xmm6,  [rdi + r14*4 + 8]    movss  xmm7,  [rdi + r14*4 + 12]    movss  xmm8,  [rdi + r14*4 + 16]    movss  xmm9,  [rdi + r14*4 + 20]    movss  xmm10, [rdi + r14*4 + 24]    movss  xmm11, [rdi + r14*4 + 28]    ;# table data ready. Coul in xmm0-xmm3 , disp in xmm4-xmm7 , rep. in xmm8-xmm11    movaps xmm12, [rsp + nb430_epsgb]    movaps xmm13, [rsp + nb430_eps]        mulss  xmm3, xmm12   ;# Heps    mulss  xmm7, xmm13    mulss  xmm11, xmm13    mulss  xmm2, xmm12     ;# Geps    mulss  xmm6, xmm13    mulss  xmm10, xmm13    mulss  xmm3, xmm12   ;# Heps2    mulss  xmm7, xmm13    mulss  xmm11, xmm13    addss  xmm1, xmm2   ;# F+Geps    addss  xmm5, xmm6    addss  xmm9, xmm10     addss  xmm1, xmm3   ;# F+Geps+Heps2 = Fp    addss  xmm5, xmm7    addss  xmm9, xmm11     addss  xmm3, xmm3    ;# 2*Heps2    addss  xmm7, xmm7    addss  xmm11, xmm11    addss  xmm3, xmm2    ;# 2*Heps2+Geps    addss  xmm7, xmm6      addss  xmm11, xmm10    addss  xmm3, xmm1   ;# FF = Fp + 2*Heps2 + Geps    addss  xmm7, xmm5    addss  xmm11, xmm9    mulss  xmm1, xmm12   ;# eps*Fp    mulss  xmm5, xmm13    mulss  xmm9, xmm13    addss  xmm1, xmm0     ;# VV    addss  xmm5, xmm4    addss  xmm9, xmm8    mulss  xmm1, [rsp + nb430_qq]   ;# VV*qq = vcoul    mulss  xmm5, [rsp + nb430_c6]   ;# vnb6    mulss  xmm9, [rsp + nb430_c12]   ;# vnb12    mulss  xmm3, [rsp + nb430_qq]    ;# FF*qq = fij    mulss  xmm7, [rsp + nb430_c6]   ;# fijD    mulss  xmm11, [rsp + nb430_c12]   ;#fijR    addss  xmm11, xmm7 ;# fijD+fijR    mulss  xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale        ;# accumulate Vvdwtot    addss  xmm5, [rsp + nb430_Vvdwtot]    addss  xmm5, xmm9    movss [rsp + nb430_Vvdwtot], xmm5	mov rsi, [rbp + nb430_dvda]		;# Calculate dVda	mulss xmm3, [rsp + nb430_gbscale]   ;# fijC=qq*FF*gbscale	movaps xmm6, xmm3 	mulss  xmm6, [rsp + nb430_r]	addss  xmm6, xmm1   ;# vcoul+fijC*r    addss  xmm3, xmm11  ;# fijC+fijD+fijR        ;# increment vctot	addss  xmm1, [rsp + nb430_vctot]    movss [rsp + nb430_vctot], xmm1	;# xmm6=(vcoul+fijC*r)	xorps  xmm7, xmm7	subss  xmm7, xmm6	movaps xmm6, xmm7		;# update dvdasum 	addss  xmm7, [rsp + nb430_dvdasum]    movss [rsp + nb430_dvdasum], xmm7	;# update j atoms dvdaj	;# xmm6=dvdaj1	addss  xmm6, [rsi + rax*4]	movss  [rsi + rax*4], xmm6	xorps  xmm4, xmm4		mulss xmm3, [rsp + nb430_rinv]	subss  xmm4, xmm3    movss  xmm9, xmm4    movss  xmm10, xmm4    movss  xmm11, xmm4        mulss  xmm9, [rsp + nb430_dx]    mulss  xmm10, [rsp + nb430_dy]    mulss  xmm11, [rsp + nb430_dz]    	;# accumulate i forces    movaps xmm12, [rsp + nb430_fix]    movaps xmm13, [rsp + nb430_fiy]    movaps xmm14, [rsp + nb430_fiz]    addss xmm12, xmm9    addss xmm13, xmm10    addss xmm14, xmm11    movss [rsp + nb430_fix], xmm12    movss [rsp + nb430_fiy], xmm13    movss [rsp + nb430_fiz], xmm14	mov rsi, [rbp + nb430_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    .nb430_updateouterdata:	mov   ecx, [rsp + nb430_ii3]	mov   rdi, [rbp + nb430_faction]	mov   rsi, [rbp + nb430_fshift]	mov   edx, [rsp + nb430_is3]	;# accumulate i forces in xmm0, xmm1, xmm2 	movaps xmm0, [rsp + nb430_fix]	movaps xmm1, [rsp + nb430_fiy]	movaps xmm2, [rsp + nb430_fiz]	movhlps xmm3, xmm0	movhlps xmm4, xmm1	movhlps xmm5, xmm2	addps  xmm0, xmm3	addps  xmm1, xmm4	addps  xmm2, xmm5 ;# sum is in 1/2 in xmm0-xmm2 	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 + nb430_n]        ;# get group index for i particle         mov   rdx, [rbp + nb430_gid]      	;# base of gid[]        mov   edx, [rdx + rsi*4]		;# ggid=gid[n]	;# accumulate total potential energy and update it 	movaps xmm7, [rsp + nb430_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 + nb430_Vc]	addss xmm7, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm7 		;# accumulate total lj energy and update it 	movaps xmm7, [rsp + nb430_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 + nb430_Vvdw]	addss xmm7, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm7 		;# accumulate dVda and update it 	movaps xmm7, [rsp + nb430_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 + nb430_ii]	mov rax, [rbp + nb430_dvda]	addss xmm7, [rax + rdx*4]	movss [rax + rdx*4], xmm7	        ;# finish if last         mov ecx, [rsp + nb430_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jz .nb430_outerend        ;# not last, iterate outer loop once more!          mov [rsp + nb430_n], esi        jmp .nb430_outer.nb430_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [rsp + nb430_nri]	;# esi already loaded with n above        sub   ecx, esi        jz .nb430_end        ;# non-zero, do one more workunit        jmp   .nb430_threadloop.nb430_end:	mov eax, [rsp + nb430_nouter]	mov ebx, [rsp + nb430_ninner]	mov rcx, [rbp + nb430_outeriter]	mov rdx, [rbp + nb430_inneriter]	mov [rcx], eax	mov [rdx], ebx	add rsp, 552	emms        pop r15        pop r14        pop r13        pop r12	pop rbx	pop	rbp	ret.globl nb_kernel430nf_x86_64_sse.globl _nb_kernel430nf_x86_64_ssenb_kernel430nf_x86_64_sse:	_nb_kernel430nf_x86_64_sse:	;#	Room for return address and rbp (16 bytes).equiv          nb430nf_fshift,         16.equiv          nb430nf_gid,            24.equiv          nb430nf_pos,            32.equiv          nb430nf_faction,        40.equiv          nb430nf_charge,         48.equiv          nb430nf_p_facel,        56.equiv          nb430nf_argkrf,         64.equiv          nb430nf_argcrf,         72.equiv          nb430nf_Vc,             80.equiv          nb430nf_type,           88.equiv          nb430nf_p_ntype,        96.equiv          nb430nf_vdwparam,       104.equiv          nb430nf_Vvdw,           112.equiv          nb430nf_p_tabscale,     120.equiv          nb430nf_VFtab,          128.equiv          nb430nf_invsqrta,       136.equiv          nb430nf_dvda,           144.equiv          nb430nf_p_gbtabscale,   152.equiv          nb430nf_GBtab,          160.equiv          nb430nf_p_nthreads,     168.equiv          nb430nf_count,          176.equiv          nb430nf_mtx,            184.equiv          nb430nf_outeriter,      192.equiv          nb430nf_inneriter,      200.equiv          nb430nf_work,           208	;# stack offsets for local variables  	;# bottom of stack is cache-aligned for sse use .equiv          nb430nf_ix,             0.equiv          nb430nf_iy,             16.equiv          nb430nf_iz,             32.equiv          nb430nf_iq,             48.equiv          nb430nf_gbtsc,          64.equiv          nb430nf_tsc,            80.equiv          nb430nf_qq,             96

⌨️ 快捷键说明

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