nb_kernel430_x86_64_sse.intel_syntax.s

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

S
2,332
字号
    movd    r15d, xmm11     ;# lj    ;# GB indices: r8-r11   LJ indices: r12-r15        ;# calculate eps    subps     xmm4, xmm6   ;# gb    subps     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   	movlps xmm1, [rsi + r8*4]         ;# Y1c F1c    	movlps xmm5, [rdi + r12*4]        ;# Y1d F1d    	movlps xmm9, [rdi + r12*4 + 16]   ;# Y1r F1r 	movlps xmm3, [rsi + r10*4]        ;# Y3c F3c 	movlps xmm7, [rdi + r14*4]        ;# Y3d F3d 	movlps xmm11, [rdi + r14*4 + 16]  ;# Y3r F3r 	movhps xmm1, [rsi + r9*4]         ;# Y1c F1c Y2c F2c	movhps xmm5, [rdi + r13*4]        ;# Y1d F1d Y2d F2d	movhps xmm9, [rdi + r13*4 + 16]   ;# Y1r F1r Y2r F2r	movhps xmm3, [rsi + r11*4]        ;# Y3c F3c Y4c F4c	movhps xmm7, [rdi + r15*4]        ;# Y3d F3d Y4d F4d	movhps xmm11, [rdi + r15*4 + 16]  ;# Y3r F3r Y4r F4r    movaps xmm0, xmm1    movaps xmm4, xmm5    movaps xmm8, xmm9	shufps xmm0, xmm3, 136  ;# 10001000   => Y1c Y2c Y3c Y4c	shufps xmm4, xmm7, 136  ;# 10001000   => Y1d Y2d Y3d Y4d	shufps xmm8, xmm11, 136  ;# 10001000  => Y1r Y2r Y3r Y4r	shufps xmm1, xmm3, 221  ;# 11011101   => F1c F2c F3c F4c	shufps xmm5, xmm7, 221  ;# 11011101   => F1d F2d F3d F4d	shufps xmm9, xmm11, 221  ;# 11011101  => F1r F2r F3r F4r       	movlps xmm3, [rsi + r8*4 + 8]      ;# G1c H1c    	movlps xmm7, [rdi + r12*4 + 8]     ;# G1d H1d    	movlps xmm11, [rdi + r12*4 + 24]   ;# G1r H1r 	movlps xmm12, [rsi + r10*4 + 8]    ;# G3c H3c 	movlps xmm13, [rdi + r14*4 + 8]    ;# G3d H3d 	movlps xmm14, [rdi + r14*4 + 24]   ;# G3r H3r 	movhps xmm3, [rsi + r9*4 + 8]      ;# G1c H1c G2c H2c	movhps xmm7, [rdi + r13*4 + 8]     ;# G1d H1d G2d H2d	movhps xmm11, [rdi + r13*4 + 24]   ;# G1r H1r G2r H2r	movhps xmm12, [rsi + r11*4 + 8]    ;# G3c H3c G4c H4c	movhps xmm13, [rdi + r15*4 + 8]    ;# G3d H3d G4d H4d	movhps xmm14, [rdi + r15*4 + 24]   ;# G3r H3r G4r H4r    movaps xmm2, xmm3    movaps xmm6, xmm7    movaps xmm10, xmm11    	shufps xmm2, xmm12, 136  ;# 10001000  => G1c G2c G3c G4c	shufps xmm6, xmm13, 136  ;# 10001000  => G1d G2d G3d G4d	shufps xmm10, xmm14, 136  ;# 10001000 => G1r G2r G3r G4r	shufps xmm3, xmm12, 221  ;# 11011101  => H1c H2c H3c H4c	shufps xmm7, xmm13, 221  ;# 11011101  => H1d H2d H3d H4d	shufps xmm11, xmm14, 221  ;# 11011101 => H1r H2r H3r H4r    ;# 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]        mulps  xmm3, xmm12   ;# Heps    mulps  xmm7, xmm13    mulps  xmm11, xmm13    mulps  xmm2, xmm12     ;# Geps    mulps  xmm6, xmm13    mulps  xmm10, xmm13    mulps  xmm3, xmm12   ;# Heps2    mulps  xmm7, xmm13    mulps  xmm11, xmm13    addps  xmm1, xmm2   ;# F+Geps    addps  xmm5, xmm6    addps  xmm9, xmm10     addps  xmm1, xmm3   ;# F+Geps+Heps2 = Fp    addps  xmm5, xmm7    addps  xmm9, xmm11     addps  xmm3, xmm3    ;# 2*Heps2    addps  xmm7, xmm7    addps  xmm11, xmm11    addps  xmm3, xmm2    ;# 2*Heps2+Geps    addps  xmm7, xmm6      addps  xmm11, xmm10    addps  xmm3, xmm1   ;# FF = Fp + 2*Heps2 + Geps    addps  xmm7, xmm5    addps  xmm11, xmm9    mulps  xmm1, xmm12   ;# eps*Fp    mulps  xmm5, xmm13    mulps  xmm9, xmm13    addps  xmm1, xmm0     ;# VV    addps  xmm5, xmm4    addps  xmm9, xmm8    mulps  xmm1, [rsp + nb430_qq]   ;# VV*qq = vcoul    mulps  xmm5, [rsp + nb430_c6]   ;# vnb6    mulps  xmm9, [rsp + nb430_c12]   ;# vnb12    mulps  xmm3, [rsp + nb430_qq]    ;# FF*qq = fij    mulps  xmm7, [rsp + nb430_c6]   ;# fijD    mulps  xmm11, [rsp + nb430_c12]   ;#fijR    addps  xmm11, xmm7 ;# fijD+fijR    mulps  xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale        ;# accumulate Vvdwtot    addps  xmm5, [rsp + nb430_Vvdwtot]    addps  xmm5, xmm9    movaps [rsp + nb430_Vvdwtot], xmm5	mov rsi, [rbp + nb430_dvda]		;# Calculate dVda	mulps xmm3, [rsp + nb430_gbscale]   ;# fijC=qq*FF*gbscale	movaps xmm6, xmm3 	mulps  xmm6, [rsp + nb430_r]	addps  xmm6, xmm1   ;# vcoul+fijC*r    addps  xmm3, xmm11  ;# fijC+fijD+fijR        ;# increment vctot	addps  xmm1, [rsp + nb430_vctot]    movaps [rsp + nb430_vctot], xmm1	;# xmm6=(vcoul+fijC*r)	xorps  xmm7, xmm7	subps  xmm7, xmm6	movaps xmm6, xmm7		;# update dvdasum 	addps  xmm7, [rsp + nb430_dvdasum]    movaps [rsp + nb430_dvdasum], xmm7	;# update j atoms dvdaj	movhlps xmm7, xmm6	movaps  xmm5, xmm6	movaps  xmm4, xmm7	shufps  xmm5, xmm5, 0x1	shufps  xmm4, xmm4, 0x1	;# xmm6=dvdaj1 xmm5=dvdaj2 xmm7=dvdaj3 xmm4=dvdaj4	addss  xmm6, [rsi + rax*4]	addss  xmm5, [rsi + rbx*4]	addss  xmm7, [rsi + rcx*4]	addss  xmm4, [rsi + rdx*4]	movss  [rsi + rax*4], xmm6	movss  [rsi + rbx*4], xmm5	movss  [rsi + rcx*4], xmm7	movss  [rsi + rdx*4], xmm4	xorps  xmm4, xmm4		mulps xmm3, [rsp + nb430_rinv]	subps  xmm4, xmm3    movd r8, mm0   ;# fetch j3    movd r9, mm1    movd r10, mm2    movd r11, mm3    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    movaps [rsp + nb430_fix], xmm12    movaps [rsp + nb430_fiy], xmm13    movaps [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 - -	movlps xmm1, [rsi + r10*4] ;# x3 y3 - -	movhps xmm0, [rsi + r9*4] ;# x1 y1 x2 y2	movhps xmm1, [rsi + r11*4] ;# x3 y3 x4 y4    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 + r8*4], xmm0	movlps [rsi + r10*4], xmm1	movhps [rsi + r9*4], xmm0	movhps [rsi + r11*4], xmm1        ;# xmm11: fjz1 fjz2 fjz3 fjz4    pshufd  xmm10, xmm11, 1  ;# fjz2 - - -    movhlps xmm9,  xmm11     ;# fjz3 - - -    pshufd  xmm8,  xmm11, 3  ;# fjz4 - - -    	addss  xmm11, [rsi + r8*4 + 8]	addss  xmm10, [rsi + r9*4 + 8]	addss  xmm9,  [rsi + r10*4 + 8]	addss  xmm8,  [rsi + r11*4 + 8]    	movss  [rsi + r8*4 + 8], xmm11	movss  [rsi + r9*4 + 8], xmm10	movss  [rsi + r10*4 + 8], xmm9	movss  [rsi + r11*4 + 8], xmm8		;# should we do one more iteration? 	sub dword ptr [rsp + nb430_innerk],  4	jl    .nb430_finish_inner	jmp   .nb430_unroll_loop.nb430_finish_inner:	;# check if at least two particles remain 	add dword ptr [rsp + nb430_innerk],  4	mov   edx, [rsp + nb430_innerk]	and   edx, 2	jnz   .nb430_dopair	jmp   .nb430_checksingle.nb430_dopair:		mov   rcx, [rsp + nb430_innerjjnr]		mov   eax, [rcx]		mov   ebx, [rcx + 4]              	add qword ptr [rsp + nb430_innerjjnr],  8	;# load isaj	mov rsi, [rbp + nb430_invsqrta]	movss xmm3, [rsi + rax*4]	movss xmm6, [rsi + rbx*4]	movaps xmm2, [rsp + nb430_isai]    unpcklps xmm3, xmm6	mulps  xmm2, xmm3    movaps [rsp + nb430_isaprod], xmm2	    	movaps xmm1, xmm2	mulps xmm1, [rsp + nb430_gbtsc]	movaps [rsp + nb430_gbscale], xmm1		mov rsi, [rbp + nb430_charge]    ;# base of charge[] 		movss xmm3, [rsi + rax*4]	movss xmm6, [rsi + rbx*4]    unpcklps xmm3, xmm6	mulps xmm2, [rsp + nb430_iq]	mulps  xmm3, xmm2	movaps [rsp + nb430_qq], xmm3		    ;# vdw parameters	mov rsi, [rbp + nb430_type]	mov r12d, [rsi + rax*4]	mov r13d, [rsi + rbx*4]	shl r12d, 1		shl r13d, 1	    mov edi, [rsp + nb430_ntia]	add r12d, edi	add r13d, edi	mov rsi, [rbp + nb430_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 + nb430_c6], xmm0    movaps [rsp + nb430_c12], xmm3    	mov rsi, [rbp + nb430_pos]       ;# base of pos[] 			lea   r8, [rax + rax*2]     ;# j3	lea   r9, [rbx + rbx*2]		;# move four coordinates to xmm0-xmm2 		movlps xmm0, [rsi + r8*4]	;# x1 y1 - - 	movlps xmm1, [rsi + r9*4]	;# x2 y2 - - 	movss xmm2, [rsi + r8*4 + 8]	;# z1 - - - 	movss xmm7, [rsi + r9*4 + 8]	;# z2 - - -     unpcklps xmm0, xmm1 ;# x1 x2 y1 y2    movhlps  xmm1, xmm0 ;# y1 y2 -  -    unpcklps xmm2, xmm7 ;# z1 z2 -  -    	;# calc dr 	subps xmm0, [rsp + nb430_ix]	subps xmm1, [rsp + nb430_iy]	subps xmm2, [rsp + nb430_iz]	;# store dr 	movaps [rsp + nb430_dx], xmm0	movaps [rsp + nb430_dy], xmm1	movaps [rsp + nb430_dz], xmm2	;# square it 	mulps xmm0,xmm0	mulps xmm1,xmm1	mulps xmm2,xmm2	addps xmm0, xmm1	addps xmm0, xmm2    movaps xmm4, xmm0	;# rsq in xmm4 	rsqrtps xmm5, xmm4	;# lookup seed in xmm5 	movaps xmm2, xmm5	mulps xmm5, xmm5	movaps xmm1, [rsp + nb430_three]	mulps xmm5, xmm4	;# rsq*lu*lu 				movaps xmm0, [rsp + nb430_half]	subps xmm1, xmm5	;# 30-rsq*lu*lu 	mulps xmm1, xmm2		mulps xmm0, xmm1	;# xmm0=rinv 	mulps xmm4, xmm0	;# xmm4=r	movaps [rsp + nb430_r], xmm4    movaps [rsp + nb430_rinv], xmm0        movaps xmm8, xmm4    ;# r	mulps xmm4, [rsp + nb430_gbscale] ;# rgbtab    mulps xmm8, [rsp + nb430_tsc]    ;# rtab        ;# truncate and convert to integers    cvttps2dq xmm5, xmm4  ;# gb    cvttps2dq xmm9, xmm8  ;# lj        ;# convert back to float    cvtdq2ps  xmm6, xmm5   ;# gb    cvtdq2ps  xmm10, xmm9  ;# lj        ;# multiply by 4 and 8, respectively    pslld   xmm5, 2   ;# gb    pslld   xmm9, 3   ;# lj    ;# move to integer registers    movd    r12d, xmm5       ;# gb    movd    r14d, xmm9      ;# lj    pshufd  xmm5, xmm5, 1   ;# gb    pshufd  xmm9, xmm9, 1   ;# lj    movd    r13d, xmm5       ;# gb    movd    r15d, xmm9      ;# lj    ;# GB indices: r12-r13   LJ indices: r14-r15        ;# calculate eps    subps     xmm4, xmm6   ;# gb    subps     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   	movlps xmm0, [rsi + r12*4]       ;# Y1c F1c	movlps xmm1, [rsi + r13*4]       ;# Y2c F2c   	movlps xmm4, [rdi + r14*4]       ;# Y1d F1d  	movlps xmm5, [rdi + r15*4]       ;# Y2d F2d   	movlps xmm8, [rdi + r14*4 + 16]  ;# Y1r F1r	movlps xmm9, [rdi + r15*4 + 16]  ;# Y2r F2r    unpcklps xmm0, xmm1    movhlps  xmm1, xmm0    unpcklps xmm4, xmm5    movhlps  xmm5, xmm4    unpcklps xmm8, xmm9    movhlps  xmm9, xmm8   	movlps xmm2, [rsi + r12*4 + 8]    ;# G1c H1c	movlps xmm3, [rsi + r13*4 + 8]    ;# G2c H2c   	movlps xmm6, [rdi + r14*4 + 8]    ;# G1d H1d  	movlps xmm7, [rdi + r15*4 + 8]    ;# G2d H2d   	movlps xmm10, [rdi + r14*4 + 24]  ;# G1r H1r	movlps xmm11, [rdi + r15*4 + 24]  ;# G2r H2r    unpcklps xmm2, xmm3    movhlps  xmm3, xmm2    unpcklps xmm6, xmm7    movhlps  xmm7, xmm6    unpcklps xmm10, xmm11    movhlps  xmm11, xmm10    ;# 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]            mulps  xmm3, xmm12   ;# Heps    mulps  xmm7, xmm13    mulps  xmm11, xmm13    mulps  xmm2, xmm12     ;# Geps    mulps  xmm6, xmm13    mulps  xmm10, xmm13    mulps  xmm3, xmm12   ;# Heps2    mulps  xmm7, xmm13    mulps  xmm11, xmm13    addps  xmm1, xmm2   ;# F+Geps    addps  xmm5, xmm6    addps  xmm9, xmm10     addps  xmm1, xmm3   ;# F+Geps+Heps2 = Fp    addps  xmm5, xmm7    addps  xmm9, xmm11     addps  xmm3, xmm3    ;# 2*Heps2    addps  xmm7, xmm7    addps  xmm11, xmm11    addps  xmm3, xmm2    ;# 2*Heps2+Geps    addps  xmm7, xmm6      addps  xmm11, xmm10    addps  xmm3, xmm1   ;# FF = Fp + 2*Heps2 + Geps    addps  xmm7, xmm5    addps  xmm11, xmm9    mulps  xmm1, xmm12   ;# eps*Fp    mulps  xmm5, xmm13    mulps  xmm9, xmm13    addps  xmm1, xmm0     ;# VV    addps  xmm5, xmm4    addps  xmm9, xmm8    mulps  xmm1, [rsp + nb430_qq]   ;# VV*qq = vcoul    mulps  xmm5, [rsp + nb430_c6]   ;# vnb6    mulps  xmm9, [rsp + nb430_c12]   ;# vnb12    mulps  xmm3, [rsp + nb430_qq]    ;# FF*qq = fij    mulps  xmm7, [rsp + nb430_c6]   ;# fijD    mulps  xmm11, [rsp + nb430_c12]   ;#fijR    addps  xmm11, xmm7 ;# fijD+fijR    mulps  xmm11, [rsp + nb430_tsc] ;# (fijD+fijR)*tabscale        ;# accumulate Vvdwtot    addps  xmm5, [rsp + nb430_Vvdwtot]    addps  xmm5, xmm9    movlps [rsp + nb430_Vvdwtot], xmm5	mov rsi, [rbp + nb430_dvda]		;# Calculate dVda	mulps xmm3, [rsp + nb430_gbscale]   ;# fijC=qq*FF*gbscale	movaps xmm6, xmm3 	mulps  xmm6, [rsp + nb430_r]	addps  xmm6, xmm1   ;# vcoul+fijC*r    addps  xmm3, xmm11  ;# fijC+fijD+fijR        ;# increment vctot	addps  xmm1, [rsp + nb430_vctot]    movlps [rsp + nb430_vctot], xmm1	;# xmm6=(vcoul+fijC*r)	xorps  xmm7, xmm7	subps  xmm7, xmm6	movaps xmm6, xmm7		;# update dvdasum 	addps  xmm7, [rsp + nb430_dvdasum]    movlps [rsp + nb430_dvdasum], xmm7	;# update j atoms dvdaj	movaps  xmm5, xmm6	shufps  xmm5, xmm5, 0x1	;# xmm6=dvdaj1 xmm5=dvdaj2 

⌨️ 快捷键说明

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