nb_kernel102_x86_64_sse2.intel_syntax.s

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

S
2,311
字号
.equiv          nb102nf_rinvOO,         528.equiv          nb102nf_rinvOH1,        544.equiv          nb102nf_rinvOH2,        560.equiv          nb102nf_rinvH1O,        576.equiv          nb102nf_rinvH1H1,       592.equiv          nb102nf_rinvH1H2,       608.equiv          nb102nf_rinvH2O,        624.equiv          nb102nf_rinvH2H1,       640.equiv          nb102nf_rinvH2H2,       656.equiv          nb102nf_is3,            672.equiv          nb102nf_ii3,            676.equiv          nb102nf_nri,            680.equiv          nb102nf_iinr,           688.equiv          nb102nf_jindex,         696.equiv          nb102nf_jjnr,           704.equiv          nb102nf_shift,          712.equiv          nb102nf_shiftvec,       720.equiv          nb102nf_facel,          728.equiv          nb102nf_innerjjnr,      736.equiv          nb102nf_innerk,         744.equiv          nb102nf_n,              748.equiv          nb102nf_nn1,            752.equiv          nb102nf_nouter,         756.equiv          nb102nf_ninner,         760	push rbp	mov  rbp, rsp	push rbx		emms        push r12        push r13        push r14        push r15	sub rsp, 792		;# local variable stack space (n*16+8)	;# zero 32-bit iteration counters	mov eax, 0	mov [rsp + nb102nf_nouter], eax	mov [rsp + nb102nf_ninner], eax	mov edi, [rdi]	mov [rsp + nb102nf_nri], edi	mov [rsp + nb102nf_iinr], rsi	mov [rsp + nb102nf_jindex], rdx	mov [rsp + nb102nf_jjnr], rcx	mov [rsp + nb102nf_shift], r8	mov [rsp + nb102nf_shiftvec], r9	mov rsi, [rbp + nb102nf_p_facel]	movsd xmm0, [rsi]	movsd [rsp + nb102nf_facel], xmm0	;# create constant floating-point factors on stack	mov eax, 0x00000000     ;# lower half of double half IEEE (hex)	mov ebx, 0x3fe00000	mov [rsp + nb102nf_half], eax	mov [rsp + nb102nf_half+4], ebx	movsd xmm1, [rsp + nb102nf_half]	shufpd xmm1, xmm1, 0    ;# splat to all elements	movapd xmm3, xmm1	addpd  xmm3, xmm3       ;# one	movapd xmm2, xmm3	addpd  xmm2, xmm2       ;# two	addpd  xmm3, xmm2	;# three	movapd [rsp + nb102nf_half], xmm1	movapd [rsp + nb102nf_three], xmm3		;# assume we have at least one i particle - start directly 	mov   rcx, [rsp + nb102nf_iinr]       ;# rcx = pointer into iinr[] 		mov   ebx, [rcx]	    ;# ebx =ii 	mov   rdx, [rbp + nb102nf_charge]	movsd xmm3, [rdx + rbx*8]	;# qO 	movsd xmm4, xmm3		;# qO 	movsd xmm5, [rdx + rbx*8 + 8]	;# qH 	mov rsi, [rbp + nb102nf_p_facel]	movsd xmm0, [rsi]	movsd xmm6, [rsp + nb102nf_facel]	;# facel 	mulsd  xmm3, xmm3		;# qO*qO 	mulsd  xmm4, xmm5		;# qO*qH 	mulsd  xmm5, xmm5		;# qH*qH 	mulsd  xmm3, xmm6	mulsd  xmm4, xmm6	mulsd  xmm5, xmm6	shufpd xmm3, xmm3, 0	shufpd xmm4, xmm4, 0	shufpd xmm5, xmm5, 0	movapd [rsp + nb102nf_qqOO], xmm3	movapd [rsp + nb102nf_qqOH], xmm4	movapd [rsp + nb102nf_qqHH], xmm5.nb102nf_threadloop:        mov   rsi, [rbp + nb102nf_count]        ;# pointer to sync counter        mov   eax, [rsi].nb102nf_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 .nb102nf_spinlock        ;# if(nn1>nri) nn1=nri        mov ecx, [rsp + nb102nf_nri]        mov edx, ecx        sub ecx, ebx        cmovle ebx, edx                         ;# if(nn1>nri) nn1=nri        ;# Cleared the spinlock if we got here.        ;# eax contains nn0, ebx contains nn1.        mov [rsp + nb102nf_n], eax        mov [rsp + nb102nf_nn1], ebx        sub ebx, eax                            ;# calc number of outer lists	mov esi, eax				;# copy n to esi        jg  .nb102nf_outerstart        jmp .nb102nf_end.nb102nf_outerstart:	;# ebx contains number of outer iterations	add ebx, [rsp + nb102nf_nouter]	mov [rsp + nb102nf_nouter], ebx.nb102nf_outer:	mov   rax, [rsp + nb102nf_shift]      ;# rax = pointer into shift[] 	mov   ebx, [rax+rsi*4]		;# rbx=shift[n] 		lea   rbx, [rbx + rbx*2]    ;# rbx=3*is 	mov   rax, [rsp + nb102nf_shiftvec]   ;# rax = base of shiftvec[] 	movsd xmm0, [rax + rbx*8]	movsd xmm1, [rax + rbx*8 + 8]	movsd xmm2, [rax + rbx*8 + 16] 	mov   rcx, [rsp + nb102nf_iinr]       ;# rcx = pointer into iinr[] 		mov   ebx, [rcx+rsi*4]	    ;# ebx =ii 	lea   rbx, [rbx + rbx*2]	;# rbx = 3*ii=ii3 	mov   rax, [rbp + nb102nf_pos]    ;# rax = base of pos[]  	mov   [rsp + nb102nf_ii3], ebx			movapd xmm3, xmm0	movapd xmm4, xmm1	movapd xmm5, xmm2	addsd xmm3, [rax + rbx*8]	addsd xmm4, [rax + rbx*8 + 8]	addsd xmm5, [rax + rbx*8 + 16]			shufpd xmm3, xmm3, 0	shufpd xmm4, xmm4, 0	shufpd xmm5, xmm5, 0	movapd [rsp + nb102nf_ixO], xmm3	movapd [rsp + nb102nf_iyO], xmm4	movapd [rsp + nb102nf_izO], xmm5	movsd xmm3, xmm0	movsd xmm4, xmm1	movsd xmm5, xmm2	addsd xmm0, [rax + rbx*8 + 24]	addsd xmm1, [rax + rbx*8 + 32]	addsd xmm2, [rax + rbx*8 + 40]			addsd xmm3, [rax + rbx*8 + 48]	addsd xmm4, [rax + rbx*8 + 56]	addsd xmm5, [rax + rbx*8 + 64]			shufpd xmm0, xmm0, 0	shufpd xmm1, xmm1, 0	shufpd xmm2, xmm2, 0	shufpd xmm3, xmm3, 0	shufpd xmm4, xmm4, 0	shufpd xmm5, xmm5, 0	movapd [rsp + nb102nf_ixH1], xmm0	movapd [rsp + nb102nf_iyH1], xmm1	movapd [rsp + nb102nf_izH1], xmm2	movapd [rsp + nb102nf_ixH2], xmm3	movapd [rsp + nb102nf_iyH2], xmm4	movapd [rsp + nb102nf_izH2], xmm5	;# clear vctot 	xorpd xmm4, xmm4	movapd [rsp + nb102nf_vctot], xmm4		mov   rax, [rsp + nb102nf_jindex]	mov   ecx, [rax + rsi*4]	     ;# jindex[n] 	mov   edx, [rax + rsi*4 + 4]	     ;# jindex[n+1] 	sub   edx, ecx               ;# number of innerloop atoms 	mov   rsi, [rbp + nb102nf_pos]	mov   rax, [rsp + nb102nf_jjnr]	shl   ecx, 2	add   rax, rcx	mov   [rsp + nb102nf_innerjjnr], rax     ;# pointer to jjnr[nj0] 	mov   ecx, edx	sub   edx,  2	add   ecx, [rsp + nb102nf_ninner]	mov   [rsp + nb102nf_ninner], ecx	add   edx, 0	mov   [rsp + nb102nf_innerk], edx    ;# number of innerloop atoms 	jge   .nb102nf_unroll_loop	jmp   .nb102nf_checksingle.nb102nf_unroll_loop:		;# twice unrolled innerloop here 	mov   rdx, [rsp + nb102nf_innerjjnr]     ;# pointer to jjnr[k] 	mov   eax, [rdx]		mov   ebx, [rdx + 4] 		add qword ptr [rsp + nb102nf_innerjjnr], 8 ;# advance pointer (unrolled 2) 	mov rsi, [rbp + nb102nf_pos]       ;# base of pos[] 	lea   rax, [rax + rax*2]     ;# replace jnr with j3 	lea   rbx, [rbx + rbx*2]			;# move j coordinates to local temp variables 	movlpd xmm2, [rsi + rax*8]	movlpd xmm3, [rsi + rax*8 + 8]	movlpd xmm4, [rsi + rax*8 + 16]	movlpd xmm5, [rsi + rax*8 + 24]	movlpd xmm6, [rsi + rax*8 + 32]	movlpd xmm7, [rsi + rax*8 + 40]	movhpd xmm2, [rsi + rbx*8]	movhpd xmm3, [rsi + rbx*8 + 8]	movhpd xmm4, [rsi + rbx*8 + 16]	movhpd xmm5, [rsi + rbx*8 + 24]	movhpd xmm6, [rsi + rbx*8 + 32]	movhpd xmm7, [rsi + rbx*8 + 40]	movapd 	[rsp + nb102nf_jxO], xmm2	movapd 	[rsp + nb102nf_jyO], xmm3	movapd 	[rsp + nb102nf_jzO], xmm4	movapd 	[rsp + nb102nf_jxH1], xmm5	movapd 	[rsp + nb102nf_jyH1], xmm6	movapd 	[rsp + nb102nf_jzH1], xmm7	movlpd xmm2, [rsi + rax*8 + 48]	movlpd xmm3, [rsi + rax*8 + 56]	movlpd xmm4, [rsi + rax*8 + 64]	movhpd xmm2, [rsi + rbx*8 + 48]	movhpd xmm3, [rsi + rbx*8 + 56]	movhpd xmm4, [rsi + rbx*8 + 64]	movapd 	[rsp + nb102nf_jxH2], xmm2	movapd 	[rsp + nb102nf_jyH2], xmm3	movapd 	[rsp + nb102nf_jzH2], xmm4		movapd xmm0, [rsp + nb102nf_ixO]	movapd xmm1, [rsp + nb102nf_iyO]	movapd xmm2, [rsp + nb102nf_izO]	movapd xmm3, [rsp + nb102nf_ixO]	movapd xmm4, [rsp + nb102nf_iyO]	movapd xmm5, [rsp + nb102nf_izO]	subpd  xmm0, [rsp + nb102nf_jxO]	subpd  xmm1, [rsp + nb102nf_jyO]	subpd  xmm2, [rsp + nb102nf_jzO]	subpd  xmm3, [rsp + nb102nf_jxH1]	subpd  xmm4, [rsp + nb102nf_jyH1]	subpd  xmm5, [rsp + nb102nf_jzH1]	mulpd  xmm0, xmm0	mulpd  xmm1, xmm1	mulpd  xmm2, xmm2	mulpd  xmm3, xmm3	mulpd  xmm4, xmm4	mulpd  xmm5, xmm5	addpd  xmm0, xmm1	addpd  xmm0, xmm2	addpd  xmm3, xmm4	addpd  xmm3, xmm5	movapd [rsp + nb102nf_rsqOO], xmm0	movapd [rsp + nb102nf_rsqOH1], xmm3	movapd xmm0, [rsp + nb102nf_ixO]	movapd xmm1, [rsp + nb102nf_iyO]	movapd xmm2, [rsp + nb102nf_izO]	movapd xmm3, [rsp + nb102nf_ixH1]	movapd xmm4, [rsp + nb102nf_iyH1]	movapd xmm5, [rsp + nb102nf_izH1]	subpd  xmm0, [rsp + nb102nf_jxH2]	subpd  xmm1, [rsp + nb102nf_jyH2]	subpd  xmm2, [rsp + nb102nf_jzH2]	subpd  xmm3, [rsp + nb102nf_jxO]	subpd  xmm4, [rsp + nb102nf_jyO]	subpd  xmm5, [rsp + nb102nf_jzO]	mulpd  xmm0, xmm0	mulpd  xmm1, xmm1	mulpd  xmm2, xmm2	mulpd  xmm3, xmm3	mulpd  xmm4, xmm4	mulpd  xmm5, xmm5	addpd  xmm0, xmm1	addpd  xmm0, xmm2	addpd  xmm3, xmm4	addpd  xmm3, xmm5	movapd [rsp + nb102nf_rsqOH2], xmm0	movapd [rsp + nb102nf_rsqH1O], xmm3	movapd xmm0, [rsp + nb102nf_ixH1]	movapd xmm1, [rsp + nb102nf_iyH1]	movapd xmm2, [rsp + nb102nf_izH1]	movapd xmm3, [rsp + nb102nf_ixH1]	movapd xmm4, [rsp + nb102nf_iyH1]	movapd xmm5, [rsp + nb102nf_izH1]	subpd  xmm0, [rsp + nb102nf_jxH1]	subpd  xmm1, [rsp + nb102nf_jyH1]	subpd  xmm2, [rsp + nb102nf_jzH1]	subpd  xmm3, [rsp + nb102nf_jxH2]	subpd  xmm4, [rsp + nb102nf_jyH2]	subpd  xmm5, [rsp + nb102nf_jzH2]	mulpd  xmm0, xmm0	mulpd  xmm1, xmm1	mulpd  xmm2, xmm2	mulpd  xmm3, xmm3	mulpd  xmm4, xmm4	mulpd  xmm5, xmm5	addpd  xmm0, xmm1	addpd  xmm0, xmm2	addpd  xmm3, xmm4	addpd  xmm3, xmm5	movapd [rsp + nb102nf_rsqH1H1], xmm0	movapd [rsp + nb102nf_rsqH1H2], xmm3	movapd xmm0, [rsp + nb102nf_ixH2]	movapd xmm1, [rsp + nb102nf_iyH2]	movapd xmm2, [rsp + nb102nf_izH2]	movapd xmm3, [rsp + nb102nf_ixH2]	movapd xmm4, [rsp + nb102nf_iyH2]	movapd xmm5, [rsp + nb102nf_izH2]	subpd  xmm0, [rsp + nb102nf_jxO]	subpd  xmm1, [rsp + nb102nf_jyO]	subpd  xmm2, [rsp + nb102nf_jzO]	subpd  xmm3, [rsp + nb102nf_jxH1]	subpd  xmm4, [rsp + nb102nf_jyH1]	subpd  xmm5, [rsp + nb102nf_jzH1]	mulpd  xmm0, xmm0	mulpd  xmm1, xmm1	mulpd  xmm2, xmm2	mulpd  xmm3, xmm3	mulpd  xmm4, xmm4	mulpd  xmm5, xmm5	addpd  xmm0, xmm1	addpd  xmm0, xmm2	addpd  xmm4, xmm3	addpd  xmm4, xmm5	movapd [rsp + nb102nf_rsqH2O], xmm0	movapd [rsp + nb102nf_rsqH2H1], xmm4	movapd xmm0, [rsp + nb102nf_ixH2]	movapd xmm1, [rsp + nb102nf_iyH2]	movapd xmm2, [rsp + nb102nf_izH2]	subpd  xmm0, [rsp + nb102nf_jxH2]	subpd  xmm1, [rsp + nb102nf_jyH2]	subpd  xmm2, [rsp + nb102nf_jzH2]	mulpd xmm0, xmm0	mulpd xmm1, xmm1	mulpd xmm2, xmm2	addpd xmm0, xmm1	addpd xmm0, xmm2	movapd [rsp + nb102nf_rsqH2H2], xmm0		;# start doing invsqrt use rsq values in xmm0 (h2h2) , xmm4 (h2h1) 	cvtpd2ps xmm1, xmm0		cvtpd2ps xmm5, xmm4		rsqrtps xmm1, xmm1	rsqrtps xmm5, xmm5	cvtps2pd xmm1, xmm1	cvtps2pd xmm5, xmm5		movapd  xmm2, xmm1	;# copy of luA 	movapd  xmm6, xmm5	;# copy of luB 	mulpd   xmm1, xmm1	;# luA*luA 	mulpd   xmm5, xmm5	;# luB*luB 	movapd  xmm3, [rsp + nb102nf_three]	mulpd   xmm1, xmm0	;# rsqA*luA*luA 	mulpd   xmm5, xmm4	;# rsqB*luB*luB 		movapd  xmm7, xmm3	subpd   xmm3, xmm1	;# 3-rsqA*luA*luA 	subpd   xmm7, xmm5	;# 3-rsqB*luB*luB 	mulpd   xmm3, xmm2	;# luA*(3-rsqA*luA*luA) 	mulpd   xmm7, xmm6	;# luB*(3-rsqB*luB*luB) 	mulpd   xmm3, [rsp + nb102nf_half] ;# iter1 	mulpd   xmm7, [rsp + nb102nf_half] ;# iter1 	movapd  xmm2, xmm3	;# copy of luA 	movapd  xmm6, xmm7	;# copy of luB 	mulpd   xmm3, xmm3	;# luA*luA 	mulpd   xmm7, xmm7	;# luB*luB 	movapd  xmm1, [rsp + nb102nf_three]	mulpd   xmm3, xmm0	;# rsqA*luA*luA 	mulpd   xmm7, xmm4	;# rsqB*luB*luB 		movapd  xmm5, xmm1	subpd   xmm1, xmm3	;# 3-rsqA*luA*luA 	subpd   xmm5, xmm7	;# 3-rsqB*luB*luB 	mulpd   xmm1, xmm2	;# luA*(3-rsqA*luA*luA) 	mulpd   xmm5, xmm6	;# luB*(3-rsqB*luB*luB) 	mulpd   xmm1, [rsp + nb102nf_half] ;# rinv 	mulpd   xmm5, [rsp + nb102nf_half] ;# rinv 	movapd [rsp + nb102nf_rinvH2H2], xmm1	movapd [rsp + nb102nf_rinvH2H1], xmm5	movapd xmm0, [rsp + nb102nf_rsqOO]	movapd xmm4, [rsp + nb102nf_rsqOH1]		cvtpd2ps xmm1, xmm0		cvtpd2ps xmm5, xmm4		rsqrtps xmm1, xmm1	rsqrtps xmm5, xmm5	cvtps2pd xmm1, xmm1	cvtps2pd xmm5, xmm5		movapd  xmm2, xmm1	;# copy of luA 	movapd  xmm6, xmm5	;# copy of luB 	mulpd   xmm1, xmm1	;# luA*luA 	mulpd   xmm5, xmm5	;# luB*luB 	movapd  xmm3, [rsp + nb102nf_three]	mulpd   xmm1, xmm0	;# rsqA*luA*luA 	mulpd   xmm5, xmm4	;# rsqB*luB*luB 		movapd  xmm7, xmm3	subpd   xmm3, xmm1	;# 3-rsqA*luA*luA 	subpd   xmm7, xmm5	;# 3-rsqB*luB*luB 	mulpd   xmm3, xmm2	;# luA*(3-rsqA*luA*luA) 	mulpd   xmm7, xmm6	;# luB*(3-rsqB*luB*luB) 	mulpd   xmm3, [rsp + nb102nf_half] ;# iter1 of  	mulpd   xmm7, [rsp + nb102nf_half] ;# iter1 of  	movapd  xmm2, xmm3	;# copy of luA 	movapd  xmm6, xmm7	;# copy of luB 	mulpd   xmm3, xmm3	;# luA*luA 	mulpd   xmm7, xmm7	;# luB*luB 	movapd  xmm1, [rsp + nb102nf_three]	mulpd   xmm3, xmm0	;# rsqA*luA*luA 	mulpd   xmm7, xmm4	;# rsqB*luB*luB 		movapd  xmm5, xmm1	subpd   xmm1, xmm3	;# 3-rsqA*luA*luA 	subpd   xmm5, xmm7	;# 3-rsqB*luB*luB 	mulpd   xmm1, xmm2	;# luA*(3-rsqA*luA*luA) 	mulpd   xmm5, xmm6	;# luB*(3-rsqB*luB*luB) 	mulpd   xmm1, [rsp + nb102nf_half] ;# rinv 	mulpd   xmm5, [rsp + nb102nf_half] ;# rinv	movapd [rsp + nb102nf_rinvOO], xmm1	movapd [rsp + nb102nf_rinvOH1], xmm5	movapd xmm0, [rsp + nb102nf_rsqOH2]	movapd xmm4, [rsp + nb102nf_rsqH1O]		cvtpd2ps xmm1, xmm0		cvtpd2ps xmm5, xmm4		rsqrtps xmm1, xmm1	rsqrtps xmm5, xmm5	cvtps2pd xmm1, xmm1	cvtps2pd xmm5, xmm5		movapd  xmm2, xmm1	;# copy of luA 	movapd  xmm6, xmm5	;# copy of luB 	mulpd   xmm1, xmm1	;# luA*luA 	mulpd   xmm5, xmm5	;# luB*luB 	movapd  xmm3, [rsp + nb102nf_three]	mulpd   xmm1, xmm0	;# rsqA*luA*luA 	mulpd   xmm5, xmm4	;# rsqB*luB*luB 		movapd  xmm7, xmm3	subpd   xmm3, xmm1	;# 3-rsqA*luA*luA 	subpd   xmm7, xmm5	;# 3-rsqB*luB*luB 	mulpd   xmm3, xmm2	;# luA*(3-rsqA*luA*luA) 	mulpd   xmm7, xmm6	;# luB*(3-rsqB*luB*luB) 	mulpd   xm

⌨️ 快捷键说明

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