nb_kernel310_x86_64_sse.intel_syntax.s

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

S
1,805
字号
    mulps  xmm2, [rsp + nb310_c6]    ;# vvdw6=c6*rinv6	mulps  xmm12, [rsp + nb310_c12]   ;# vvdw12=c12*rinv12     	movaps xmm0, xmm12	subps  xmm12, xmm2	;# Vvdw=Vvdw12-Vvdw6    ;# add potential to vvdwtot 	addps  xmm12, [rsp + nb310_Vvdwtot]    movaps [rsp + nb310_Vvdwtot], xmm12    	shufps xmm6, xmm8, 136  ;# 10001000	shufps xmm7, xmm8, 221  ;# 11011101    ;# table data ready in xmm4-xmm7        mulps xmm7, xmm3   ;# Heps    mulps  xmm6, xmm3  ;# Geps    mulps xmm7, xmm3   ;# Heps2    addps  xmm5, xmm6   ;# F+Geps    addps  xmm5, xmm7   ;# F+Geps+Heps2 = Fp    addps  xmm7, xmm7   ;# 2*Heps2    addps  xmm7, xmm6   ;# 2*Heps2+Geps    addps  xmm7, xmm5   ;# FF = Fp + 2*Heps2 + Geps    mulps  xmm5, xmm3   ;# eps*Fp    addps  xmm5, xmm4   ;# VV    mulps  xmm5, [rsp + nb310_qq]   ;# VV*qq=vcoul    mulps  xmm7, [rsp + nb310_qq]   ;# FF*qq=fijC    ;# LJ forces    mulps  xmm2, [rsp + nb310_six]    mulps  xmm0, [rsp + nb310_twelve]    subps  xmm0, xmm2    mulps  xmm0, xmm1 ;# (12*vnb12-6*vnb6)*rinv    ;# add potential to vctot 	addps  xmm5, [rsp + nb310_vctot]    movaps [rsp + nb310_vctot], xmm5    mulps  xmm7, [rsp + nb310_tsc]    subps  xmm0, xmm7        mulps  xmm0, xmm1  ;# fscal    ;# calculate scalar force by multiplying dx/dy/dz with fscal	mulps  xmm9, xmm0	mulps  xmm10, xmm0	mulps  xmm11, xmm0	mov rsi, [rbp + nb310_faction]	;# the fj's - start by accumulating x & y forces from memory 	movlps xmm0, [rsi + rax*4] ;# x1 y1 - -	movlps xmm1, [rsi + rcx*4] ;# x3 y3 - -	movhps xmm0, [rsi + rbx*4] ;# x1 y1 x2 y2	movhps xmm1, [rsi + rdx*4] ;# x3 y3 x4 y4	;# xmm0-xmm2 contains tx-tz (partial force) 	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11    movaps xmm8, xmm9    unpcklps xmm9, xmm10 ;# x1 y1 x2 y2    unpckhps xmm8, xmm10 ;# x3 y3 x4 y4        ;# update fjx and fjy	addps  xmm0, xmm9	addps  xmm1, xmm8		movlps [rsi + rax*4], xmm0	movlps [rsi + rcx*4], xmm1	movhps [rsi + rbx*4], xmm0	movhps [rsi + rdx*4], xmm1        ;# xmm11: fjz1 fjz2 fjz3 fjz4    pshufd  xmm10, xmm11, 1  ;# fjz2 - - -    movhlps xmm9,  xmm11     ;# fjz3 - - -    pshufd  xmm8,  xmm11, 3  ;# fjz4 - - -    	addss  xmm11, [rsi + rax*4 + 8]	addss  xmm10, [rsi + rbx*4 + 8]	addss  xmm9,  [rsi + rcx*4 + 8]	addss  xmm8,  [rsi + rdx*4 + 8]    	movss  [rsi + rax*4 + 8], xmm11	movss  [rsi + rbx*4 + 8], xmm10	movss  [rsi + rcx*4 + 8], xmm9	movss  [rsi + rdx*4 + 8], xmm8		;# should we do one more iteration? 	sub dword ptr [rsp + nb310_innerk],  4	jl    .nb310_finish_inner	jmp   .nb310_unroll_loop.nb310_finish_inner:    ;# check if at least two particles remain     add dword ptr [rsp + nb310_innerk],  4    mov   edx, [rsp + nb310_innerk]    and   edx, 2    jnz   .nb310_dopair    jmp   .nb310_checksingle.nb310_dopair:  	;# twice-unrolled innerloop here 	mov   rdx, [rsp + nb310_innerjjnr]     ;# pointer to jjnr[k] 	mov   eax, [rdx]		mov   ebx, [rdx + 4]                  	add qword ptr [rsp + nb310_innerjjnr],  8 ;# advance pointer (unrolled 2) 	mov rsi, [rbp + nb310_charge]	movss xmm0, [rsi + rax*4]	movss xmm2, [rsi + rbx*4]    unpcklps xmm0, xmm2  ;# jqa jqb 	mulps xmm0, [rsp + nb310_iq]     movaps [rsp + nb310_qq], xmm0	mov rsi, [rbp + nb310_type]    ;# vdw parameters	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb310_ntia]	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb310_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    movaps [rsp + nb310_c6], xmm0    movaps [rsp + nb310_c12], xmm3	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]		;# load coordinates	mov rdi, [rbp + nb310_pos]    	movlps xmm4, [rdi + rax*4]	;# x1 y1 - - 	movlps xmm5, [rdi + rbx*4]	;# x2 y2 - - 	movss xmm6, [rdi + rax*4 + 8]	;# z1 - - - 	movss xmm7, [rdi + rbx*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 + nb310_ix]	subps xmm5, [rsp + nb310_iy]	subps xmm6, [rsp + nb310_iz]	;# store dr in xmm9-xmm11    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     ;# calculate rinv=1/sqrt(rsq)	rsqrtps xmm5, xmm4	movaps xmm2, xmm5	mulps xmm5, xmm5	movaps xmm1, [rsp + nb310_three]	mulps xmm5, xmm4	;# rsq*lu*lu 	    subps xmm1, xmm5	;# 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm1, [rsp + nb310_half]		    ;# xmm1=rinv    movaps xmm3, xmm4    ;# xmm3=rsq     mulps xmm3, xmm1 ;# r    mulps xmm3, [rsp + nb310_tsc] ;# rtab        ;# truncate and convert to integers    cvttps2dq xmm2, xmm3        ;# convert back to float    cvtdq2ps  xmm0, xmm2        ;# multiply by 4    pslld   xmm2, 2    ;# move to integer registers    movd    r12d, xmm2    pshufd  xmm2, xmm2, 1    movd    r13d, xmm2        ;# calculate eps    subps     xmm3, xmm0	mov rsi, [rbp + nb310_VFtab]    ;# load table data   	movlps xmm4, [rsi + r12*4]	movlps xmm5, [rsi + r13*4]    unpcklps xmm4, xmm5    movhlps xmm5, xmm4        movaps xmm0, xmm1 ;# rinv    mulps  xmm0, xmm0 ;# rinvsq    movaps xmm2, xmm0 ;# rinvsq    mulps  xmm2, xmm2 ;# rinv4    mulps  xmm2, xmm0 ;# rinv6    movaps xmm12, xmm2     mulps  xmm12, xmm12 ;# rinv12   	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  xmm2, [rsp + nb310_c6]    ;# vvdw6=c6*rinv6	mulps  xmm12, [rsp + nb310_c12]   ;# vvdw12=c12*rinv12     	movaps xmm0, xmm12	subps  xmm12, xmm2	;# Vvdw=Vvdw12-Vvdw6    ;# add potential to vvdwtot 	addps  xmm12, [rsp + nb310_Vvdwtot]    movlps [rsp + nb310_Vvdwtot], xmm12        mulps xmm7, xmm3   ;# Heps    mulps  xmm6, xmm3  ;# Geps    mulps xmm7, xmm3   ;# Heps2    addps  xmm5, xmm6   ;# F+Geps    addps  xmm5, xmm7   ;# F+Geps+Heps2 = Fp    addps  xmm7, xmm7   ;# 2*Heps2    addps  xmm7, xmm6   ;# 2*Heps2+Geps    addps  xmm7, xmm5   ;# FF = Fp + 2*Heps2 + Geps    mulps  xmm5, xmm3   ;# eps*Fp    addps  xmm5, xmm4   ;# VV    mulps  xmm5, [rsp + nb310_qq]   ;# VV*qq=vcoul    mulps  xmm7, [rsp + nb310_qq]   ;# FF*qq=fijC    ;# LJ forces    mulps  xmm2, [rsp + nb310_six]    mulps  xmm0, [rsp + nb310_twelve]    subps  xmm0, xmm2    mulps  xmm0, xmm1 ;# (12*vnb12-6*vnb6)*rinv    ;# add potential to vctot 	addps  xmm5, [rsp + nb310_vctot]    movlps [rsp + nb310_vctot], xmm5    xorps xmm8, xmm8        mulps  xmm7, [rsp + nb310_tsc]    subps  xmm0, xmm7        mulps  xmm0, xmm1  ;# fscal    ;# calculate scalar force by multiplying dx/dy/dz with fscal	mulps  xmm9, xmm0	mulps  xmm10, xmm0	mulps  xmm11, xmm0    movlhps xmm9, xmm8    movlhps xmm10, xmm8    movlhps xmm11, xmm8    	;# accumulate i forces    addps xmm13, xmm9    addps xmm14, xmm10    addps xmm15, xmm11	mov rsi, [rbp + nb310_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.nb310_checksingle:                                 mov   edx, [rsp + nb310_innerk]    and   edx, 1    jnz    .nb310_dosingle    jmp    .nb310_updateouterdata.nb310_dosingle:	    mov rcx, [rsp + nb310_innerjjnr]	mov   eax, [rcx]	            	mov rsi, [rbp + nb310_charge]	movss xmm0, [rsi + rax*4]	mulss xmm0, [rsp + nb310_iq]     movaps [rsp + nb310_qq], xmm0	mov rsi, [rbp + nb310_type]    ;# vdw parameters	mov r12d, [rsi + rax*4]	shl r12d, 1	    mov edi, [rsp + nb310_ntia]	add r12d, edi	mov rsi, [rbp + nb310_vdwparam]	movss xmm0, [rsi + r12*4]	movss xmm3, [rsi + r12*4 + 4]    movaps [rsp + nb310_c6], xmm0    movaps [rsp + nb310_c12], xmm3	lea   rax, [rax + rax*2]        ;# replace jnr with j3 	mov rdi, [rbp + nb310_pos]	movss xmm4, [rdi + rax*4]	    ;# x1 - - - 	movss xmm5, [rdi + rax*4 + 4]    ;# y2 - - - 	movss xmm6, [rdi + rax*4 + 8]    ;# 13 - - - 	;# calc dr  	subss xmm4, [rsp + nb310_ix]	subss xmm5, [rsp + nb310_iy]	subss xmm6, [rsp + nb310_iz]	;# store dr in xmm9-xmm11    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     ;# calculate rinv=1/sqrt(rsq)	rsqrtss xmm5, xmm4	movaps xmm2, xmm5	mulss xmm5, xmm5	movaps xmm1, [rsp + nb310_three]	mulss xmm5, xmm4	;# rsq*lu*lu 	    subss xmm1, xmm5	;# 30-rsq*lu*lu 	mulss xmm1, xmm2		mulss xmm1, [rsp + nb310_half]		    ;# xmm1=rinv    movaps xmm3, xmm4    ;# xmm3=rsq     mulss xmm3, xmm1 ;# r    mulss xmm3, [rsp + nb310_tsc] ;# rtab        ;# truncate and convert to integers    cvttss2si r12d, xmm3        ;# convert back to float    cvtsi2ss  xmm0, r12d        ;# multiply by 4    shl       r12d, 2    ;# calculate eps    subss     xmm3, xmm0	mov rsi, [rbp + nb310_VFtab]        movaps xmm0, xmm1 ;# rinv    mulss  xmm0, xmm0 ;# rinvsq    movaps xmm2, xmm0 ;# rinvsq    mulss  xmm2, xmm2 ;# rinv4    mulss  xmm2, xmm0 ;# rinv6    movaps xmm12, xmm2     mulss  xmm12, xmm12 ;# rinv12    ;# 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  xmm2, [rsp + nb310_c6]    ;# vvdw6=c6*rinv6	mulss  xmm12, [rsp + nb310_c12]   ;# vvdw12=c12*rinv12     	movaps xmm0, xmm12	subss  xmm12, xmm2	;# Vvdw=Vvdw12-Vvdw6    ;# add potential to vvdwtot 	addss  xmm12, [rsp + nb310_Vvdwtot]    movss [rsp + nb310_Vvdwtot], xmm12        mulss xmm7, xmm3   ;# Heps    mulss  xmm6, xmm3  ;# Geps    mulss xmm7, xmm3   ;# Heps2    addss  xmm5, xmm6   ;# F+Geps    addss  xmm5, xmm7   ;# F+Geps+Heps2 = Fp    addss  xmm7, xmm7   ;# 2*Heps2    addss  xmm7, xmm6   ;# 2*Heps2+Geps    addss  xmm7, xmm5   ;# FF = Fp + 2*Heps2 + Geps    mulss  xmm5, xmm3   ;# eps*Fp    addss  xmm5, xmm4   ;# VV    mulss  xmm5, [rsp + nb310_qq]   ;# VV*qq=vcoul    mulss  xmm7, [rsp + nb310_qq]   ;# FF*qq=fijC    ;# LJ forces    mulss  xmm2, [rsp + nb310_six]    mulss  xmm0, [rsp + nb310_twelve]    subss  xmm0, xmm2    mulss  xmm0, xmm1 ;# (12*vnb12-6*vnb6)*rinv    ;# add potential to vctot 	addss  xmm5, [rsp + nb310_vctot]    movss [rsp + nb310_vctot], xmm5        mulss  xmm7, [rsp + nb310_tsc]    subss  xmm0, xmm7        mulss  xmm0, xmm1  ;# fscal    ;# calculate scalar force by multiplying dx/dy/dz with fscal	mulss  xmm9, xmm0	mulss  xmm10, xmm0	mulss  xmm11, xmm0    	;# accumulate i forces    addss xmm13, xmm9    addss xmm14, xmm10    addss xmm15, xmm11	mov rsi, [rbp + nb310_faction]    ;# add to j forces    addss  xmm9,  [rsi + rax*4]    addss  xmm10, [rsi + rax*4 + 4]    addss  xmm11, [rsi + rax*4 + 8]

⌨️ 快捷键说明

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