nb_kernel400_x86_64_sse.intel_syntax.s

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

S
1,664
字号
	mulps xmm1, [rsp + nb400_gbtsc]	movaps [rsp + nb400_gbscale], xmm1		mov rsi, [rbp + nb400_charge]    ;# base of charge[]         mulps xmm2, [rsp + nb400_iq]	movss xmm3, [rsi + rax*4]	movss xmm6, [rsi + rbx*4]    unpcklps xmm3, xmm6    	mulps xmm3, xmm2	movaps [rsp + nb400_qq], xmm3			mov rsi, [rbp + nb400_pos]       ;# base of pos[] 		lea   r8, [rax + rax*2]     ;# j3 	lea   r9, [rbx + rbx*2]		;# move four coordinates to xmm0-xmm2 		movlps xmm4, [rsi + r8*4]	;# x1 y1 - - 	movlps xmm5, [rsi + r9*4]	;# x2 y2 - - 	movss xmm6, [rsi + r8*4 + 8]	;# z1 - - - 	movss xmm7, [rsi + r9*4 + 8]	;# z2 - - -     unpcklps xmm4, xmm5 ;# x1 x2 y1 y2    movhlps  xmm5, xmm4 ;# y1 y2 -  -    unpcklps xmm6, xmm7 ;# z1 z2 -  -    	;# calc dr 	subps xmm4, [rsp + nb400_ix]	subps xmm5, [rsp + nb400_iy]	subps xmm6, [rsp + nb400_iz]	;# store dr 	movaps xmm9, xmm4	movaps xmm10, xmm5	movaps xmm11, xmm6	;# 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 + nb400_three]	mulps xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb400_half]	subps xmm1, xmm5	;# 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm0, xmm1	;# xmm0=rinv 	mulps xmm4, xmm0	;# xmm4=r	movaps [rsp + nb400_r], xmm4	mulps xmm4, [rsp + nb400_gbscale]    ;# truncate and convert to integers    cvttps2dq xmm5, xmm4        ;# convert back to float    cvtdq2ps  xmm6, xmm5        ;# multiply by 4    pslld   xmm5, 2    ;# move to integer registers    movd    r12d, xmm5    pshufd  xmm5, xmm5, 1    movd    r13d, xmm5        ;# calculate eps    subps     xmm4, xmm6    movaps    xmm1, xmm4 ;#eps    	mov  rsi, [rbp + nb400_GBtab]    ;# load table data   	movlps xmm4, [rsi + r12*4]	movlps xmm5, [rsi + r13*4]    unpcklps xmm4, xmm5    movhlps  xmm5, xmm4       	movlps xmm6, [rsi + r12*4 + 8]	movlps xmm7, [rsi + r13*4 + 8]     unpcklps xmm6, xmm7    movhlps  xmm7, xmm6    ;# table data ready in xmm4-xmm7    mulps  xmm7, xmm1   ;# Heps	mulps  xmm6, xmm1	;# xmm6=Geps 	mulps  xmm7, xmm1	;# Heps2 	addps  xmm5, xmm6	addps  xmm5, xmm7	;# xmm5=Fp 		addps  xmm7, xmm7	;# two*Heps2 	movaps xmm3, [rsp + nb400_qq]	addps  xmm7, xmm6	addps  xmm7, xmm5 ;# xmm7=FF 	mulps  xmm5, xmm1 ;# xmm5=eps*Fp 	addps  xmm5, xmm4 ;# xmm5=VV 	mulps  xmm5, xmm3 ;# vcoul=qq*VV  	mulps  xmm3, xmm7 ;# fijC=FF*qq 	;# at this point xmm5 contains vcoul and xmm3 fijC    ;# zero upper part of vcoul     xorps xmm2, xmm2    movlhps xmm5, xmm2    	mov rsi, [rbp + nb400_dvda]		;# Calculate dVda	xorps  xmm7, xmm7	mulps xmm3, [rsp + nb400_gbscale]	movaps xmm6, xmm3	mulps  xmm6, [rsp + nb400_r]	addps  xmm6, xmm5        ;# increment vctot (sum in xmm12)	addps  xmm12, xmm5	;# xmm6=(vcoul+fijC*r)	subps  xmm7, xmm6	movaps xmm6, xmm7    ;# zero upper half of dvda    movlhps xmm7, xmm2        ;# update dvdasum    addps  xmm7, [rsp + nb400_dvdasum]    movaps [rsp + nb400_dvdasum], xmm7 	;# update j atoms dvdaj	movaps  xmm5, xmm6	shufps  xmm5, xmm5, 0x1	;# xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4	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, xmm0	subps  xmm4, xmm3    mulps  xmm9, xmm4    mulps  xmm10, xmm4    mulps  xmm11, xmm4    movlhps xmm9, xmm2    movlhps xmm10, xmm2    movlhps xmm11, xmm2    	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb400_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.nb400_checksingle:					mov   edx, [rsp + nb400_innerk]	and   edx, 1	jnz    .nb400_dosingle	jmp    .nb400_updateouterdata.nb400_dosingle:	mov   rcx, [rsp + nb400_innerjjnr]	mov   eax, [rcx]		;# load isaj	mov rsi, [rbp + nb400_invsqrta]	movss xmm2, [rsi + rax*4]	mulss xmm2, [rsp + nb400_isai]		movss [rsp + nb400_isaprod], xmm2		movaps xmm1, xmm2	mulss xmm1, [rsp + nb400_gbtsc]	movss [rsp + nb400_gbscale], xmm1		mov rsi, [rbp + nb400_charge]    ;# base of charge[]     mulss xmm2, [rsp + nb400_iq]	movss xmm3, [rsi + rax*4]	mulss xmm3, xmm2	movss [rsp + nb400_qq], xmm3			mov rsi, [rbp + nb400_pos]       ;# base of pos[] 		lea   r8, [rax + rax*2]     ;# j3=3*jnr	;# move four coordinates to xmm0-xmm2 		movss xmm4, [rsi + r8*4]		movss xmm5, [rsi + r8*4 + 4]		movss xmm6, [rsi + r8*4 + 8]    	;# calc dr 	subss xmm4, [rsp + nb400_ix]	subss xmm5, [rsp + nb400_iy]	subss xmm6, [rsp + nb400_iz]	;# store dr 	movaps xmm9, xmm4	movaps xmm10, xmm5	movaps xmm11, xmm6	;# square it 	mulss xmm4,xmm4	mulss xmm5,xmm5	mulss xmm6,xmm6	addss xmm4, xmm5	addss xmm4, xmm6	;# rsq in xmm4 	rsqrtss xmm5, xmm4	;# lookup seed in xmm5 	movaps xmm2, xmm5	mulss xmm5, xmm5	movaps xmm1, [rsp + nb400_three]	mulss xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb400_half]	subss xmm1, xmm5	;# 30-rsq*lu*lu 	mulss xmm1, xmm2		mulss xmm0, xmm1	;# xmm0=rinv 	mulss xmm4, xmm0	;# xmm4=r	movaps [rsp + nb400_r], xmm4	mulss xmm4, [rsp + nb400_gbscale]    ;# truncate and convert to integers    cvttss2si r12d, xmm4        ;# convert back to float    cvtsi2ss  xmm6, r12d        ;# multiply by 4    shl r12d, 2    ;# calculate eps    subss     xmm4, xmm6    movaps    xmm1, xmm4 ;#eps    	mov  rsi, [rbp + nb400_GBtab]    ;# load table data   	movss xmm4, [rsi + r12*4]	movss xmm5, [rsi + r12*4 + 4]   	movss xmm6, [rsi + r12*4 + 8]	movss xmm7, [rsi + r12*4 + 12]    ;# table data ready in xmm4-xmm7    mulss  xmm7, xmm1   ;# Heps	mulss  xmm6, xmm1	;# xmm6=Geps 	mulss  xmm7, xmm1	;# Heps2 	addss  xmm5, xmm6	addss  xmm5, xmm7	;# xmm5=Fp 		addss  xmm7, xmm7	;# two*Heps2 	movss  xmm3, [rsp + nb400_qq]	addss  xmm7, xmm6	addss  xmm7, xmm5 ;# xmm7=FF 	mulss  xmm5, xmm1 ;# xmm5=eps*Fp 	addss  xmm5, xmm4 ;# xmm5=VV 	mulss  xmm5, xmm3 ;# vcoul=qq*VV  	mulss  xmm3, xmm7 ;# fijC=FF*qq 	;# at this point xmm5 contains vcoul and xmm3 fijC	mov rsi, [rbp + nb400_dvda]		;# Calculate dVda	xorps  xmm7, xmm7	mulss xmm3, [rsp + nb400_gbscale]	movaps xmm6, xmm3	mulss  xmm6, [rsp + nb400_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 + nb400_dvdasum]    movss [rsp + nb400_dvdasum], xmm7 	;# update j atoms dvdaj	addss  xmm6, [rsi + rax*4]	movss  [rsi + rax*4], xmm6	xorps  xmm4, xmm4		mulss xmm3, xmm0	subss  xmm4, xmm3    mulss  xmm9, xmm4    mulss  xmm10, xmm4    mulss  xmm11, xmm4	;# accumulate i forces    addss xmm13, xmm9    addss xmm14, xmm10    addss xmm15, xmm11	mov rsi, [rbp + nb400_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    .nb400_updateouterdata:	mov   ecx, [rsp + nb400_ii3]	mov   rdi, [rbp + nb400_faction]	mov   rsi, [rbp + nb400_fshift]	mov   edx, [rsp + nb400_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 + nb400_n]        ;# get group index for i particle         mov   rdx, [rbp + nb400_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 + nb400_Vc]	addss xmm12, [rax + rdx*4] 	;# move back to mem 	movss [rax + rdx*4], xmm12		;# accumulate dVda and update it 	movaps xmm7, [rsp + nb400_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 + nb400_ii]	mov rax, [rbp + nb400_dvda]	addss xmm7, [rax + rdx*4]	movss [rax + rdx*4], xmm7	        ;# finish if last         mov ecx, [rsp + nb400_nn1]	;# esi already loaded with n	inc esi        sub ecx, esi        jz .nb400_outerend        ;# not last, iterate outer loop once more!          mov [rsp + nb400_n], esi        jmp .nb400_outer.nb400_outerend:        ;# check if more outer neighborlists remain        mov   ecx, [rsp + nb400_nri]	;# esi already loaded with n above        sub   ecx, esi        jz .nb400_end        ;# non-zero, do one more workunit        jmp   .nb400_threadloop.nb400_end:	mov eax, [rsp + nb400_nouter]	mov ebx, [rsp + nb400_ninner]	mov rcx, [rbp + nb400_outeriter]	mov rdx, [rbp + nb400_inneriter]	mov [rcx], eax	mov [rdx], ebx	add rsp, 456	emms        pop r15        pop r14        pop r13        pop r12	pop rbx	pop	rbp	ret	.globl nb_kernel400nf_x86_64_sse.globl _nb_kernel400nf_x86_64_ssenb_kernel400nf_x86_64_sse:	_nb_kernel400nf_x86_64_sse:	.equiv          nb400nf_fshift,         16.equiv          nb400nf_gid,            24.equiv          nb400nf_pos,            32.equiv          nb400nf_faction,        40.equiv          nb400nf_charge,         48.equiv          nb400nf_p_facel,        56.equiv          nb400nf_argkrf,         64.equiv          nb400nf_argcrf,         72.equiv          nb400nf_Vc,             80.equiv          nb400nf_type,           88.equiv          nb400nf_p_ntype,        96.equiv          nb400nf_vdwparam,       104.equiv          nb400nf_Vvdw,           112.equiv          nb400nf_p_tabscale,     120.equiv          nb400nf_VFtab,          128.equiv          nb400nf_invsqrta,       136.equiv          nb400nf_dvda,           144.equiv          nb400nf_p_gbtabscale,   152.equiv          nb400nf_GBtab,          160.equiv          nb400nf_p_nthreads,     168.equiv          nb400nf_count,          176.equiv          nb400nf_mtx,            184.equiv          nb400nf_outeriter,      192.equiv          nb400nf_inneriter,      200.equiv          nb400nf_work,           208	;# stack offsets for local variables  	;# bottom of stack is cache-aligned for sse use .equiv          nb400nf_ix,             0.equiv          nb400nf_iy,             16.equiv          nb400nf_iz,             32.equiv          nb400nf_iq,             48.equiv          nb400nf_gbtsc,          64.equiv          nb400nf_qq,             80.equiv          nb400nf_vctot,          96.equiv          nb400nf_half,           112.equiv          nb400nf_three,          128.equiv          nb400nf_isai,           144.equiv          nb400nf_isaprod,        160.equiv          nb400nf_gbscale,        176.equiv          nb400nf_nri,            192.equiv          nb400nf_iinr,           200.equiv          nb400nf_jindex,         208.equiv          nb400nf_jjnr,           216.equiv          nb400nf_shift,          224.equiv          nb400nf_shiftvec,       232.equiv          nb400nf_facel,          240.equiv          nb400nf_innerjjnr,      248.equiv          nb400nf_is3,            256.equiv          nb400nf_ii3,            260.equiv          nb400nf_innerk,         264.equiv          nb400nf_n,              268.equiv          nb400nf_nn1,            272.equiv          nb400nf_nouter,         276.equiv          nb400nf_ninner,         280	push rbp	mov  rbp, rsp	push rbx		emms        push r12        push r13        push r14        push r15	sub rsp, 296		;# local variable stack space (n*16+8)	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb400nf_nouter], eax	mov [rsp + nb400nf_ninner], eax	mov edi, [rdi]	mov [rsp + nb400nf_nri], edi	mov [rsp + nb400nf_iinr], rsi	mov [rsp + nb400nf_jindex], rdx	mov [rsp + nb400nf_jjnr], rcx	mov [rsp + nb400nf_shift], r8	mov [rsp + nb400nf_shiftvec], r9	mov rsi, [rbp + nb400nf_p_facel]	movss xmm0, [rsi]	movss [rsp + nb400nf_facel], xmm0	mov rbx, [rbp + nb400nf_p_gbtabscale]	movss xmm4, [rbx]	shufps xmm4, xmm4, 0	movaps [rsp + nb400nf_gbtsc],  xmm4	;# create constant floating-point factors on stack	mov eax, 0x3f000000     ;# half in IEEE (hex)	mov [rsp + nb400nf_half], eax	movss xmm1, [rsp + nb400nf_half]	shufps xmm1, xmm1, 0    ;# splat to all elements	movaps xmm2, xmm1       	addps  xmm2, xmm2	;# one

⌨️ 快捷键说明

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