nb_kernel311_x86_64_sse.intel_syntax.s
来自「最著名最快的分子模拟软件」· S 代码 · 共 2,160 行 · 第 1/4 页
S
2,160 行
;#;# $Id: nb_kernel311_x86_64_sse.intel_syntax.s,v 1.1.2.2 2006/09/22 08:32:51 lindahl Exp $;#;# Gromacs 4.0 Copyright (c) 1991-2003 ;# David van der Spoel, Erik Lindahl;#;# This program is free software; you can redistribute it and/or;# modify it under the terms of the GNU General Public License;# as published by the Free Software Foundation; either version 2;# of the License, or (at your option) any later version.;#;# To help us fund GROMACS development, we humbly ask that you cite;# the research papers on the package. Check out http://www.gromacs.org;# ;# And Hey:;# Gnomes, ROck Monsters And Chili Sauce;#;# These files require GNU binutils 2.10 or later, since we;# use intel syntax for portability, or a recent version ;# of NASM that understands Extended 3DNow and SSE2 instructions.;# (NASM is normally only used with MS Visual C++).;# Since NASM and gnu as disagree on some definitions and use ;# completely different preprocessing options I have to introduce a;# trick: NASM uses ';' for comments, while gnu as uses '#' on x86.;# Gnu as treats ';' as a line break, i.e. ignores it. This is the;# reason why all comments need both symbols...;# The source is written for GNU as, with intel syntax. When you use;# NASM we redefine a couple of things. The false if-statement around ;# the following code is seen by GNU as, but NASM doesn't see it, so ;# the code inside is read by NASM but not gcc.; .if 0 # block below only read by NASM%define .section section%define .long dd%define .align align%define .globl global;# NASM only wants 'dword', not 'dword ptr'.%define ptr.equiv .equiv 2 %1 equ %2%endmacro; .endif # End of NASM-specific block; .intel_syntax noprefix # Line only read by gnu as.globl nb_kernel311_x86_64_sse.globl _nb_kernel311_x86_64_ssenb_kernel311_x86_64_sse: _nb_kernel311_x86_64_sse: ;# Room for return address and rbp (16 bytes).equiv nb311_fshift, 16.equiv nb311_gid, 24.equiv nb311_pos, 32.equiv nb311_faction, 40.equiv nb311_charge, 48.equiv nb311_p_facel, 56.equiv nb311_argkrf, 64.equiv nb311_argcrf, 72.equiv nb311_Vc, 80.equiv nb311_type, 88.equiv nb311_p_ntype, 96.equiv nb311_vdwparam, 104.equiv nb311_Vvdw, 112.equiv nb311_p_tabscale, 120.equiv nb311_VFtab, 128.equiv nb311_invsqrta, 136.equiv nb311_dvda, 144.equiv nb311_p_gbtabscale, 152.equiv nb311_GBtab, 160.equiv nb311_p_nthreads, 168.equiv nb311_count, 176.equiv nb311_mtx, 184.equiv nb311_outeriter, 192.equiv nb311_inneriter, 200.equiv nb311_work, 208 ;# stack offsets for local variables ;# bottom of stack is cache-aligned for sse use .equiv nb311_ixO, 0.equiv nb311_iyO, 16.equiv nb311_izO, 32.equiv nb311_ixH1, 48.equiv nb311_iyH1, 64.equiv nb311_izH1, 80.equiv nb311_ixH2, 96.equiv nb311_iyH2, 112.equiv nb311_izH2, 128.equiv nb311_iqO, 144.equiv nb311_iqH, 160.equiv nb311_dxO, 176.equiv nb311_dyO, 192.equiv nb311_dzO, 208.equiv nb311_dxH1, 224.equiv nb311_dyH1, 240.equiv nb311_dzH1, 256.equiv nb311_dxH2, 272.equiv nb311_dyH2, 288.equiv nb311_dzH2, 304.equiv nb311_qqO, 320.equiv nb311_qqH, 336.equiv nb311_rinvO, 352.equiv nb311_rinvH1, 368.equiv nb311_rinvH2, 384.equiv nb311_rO, 400.equiv nb311_rH1, 416.equiv nb311_rH2, 432.equiv nb311_tsc, 448.equiv nb311_fstmp, 464.equiv nb311_c6, 480.equiv nb311_c12, 496.equiv nb311_six, 512.equiv nb311_twelve, 528.equiv nb311_vctot, 544.equiv nb311_Vvdwtot, 560.equiv nb311_fixO, 576.equiv nb311_fiyO, 592.equiv nb311_fizO, 608.equiv nb311_fixH1, 624.equiv nb311_fiyH1, 640.equiv nb311_fizH1, 656.equiv nb311_fixH2, 672.equiv nb311_fiyH2, 688.equiv nb311_fizH2, 704.equiv nb311_epsO, 720.equiv nb311_epsH1, 736.equiv nb311_epsH2, 752.equiv nb311_half, 768.equiv nb311_three, 784.equiv nb311_is3, 800.equiv nb311_ii3, 804.equiv nb311_nri, 808.equiv nb311_iinr, 816.equiv nb311_jindex, 824.equiv nb311_jjnr, 832.equiv nb311_shift, 840.equiv nb311_shiftvec, 848.equiv nb311_facel, 856.equiv nb311_innerjjnr, 864.equiv nb311_ntia, 872.equiv nb311_innerk, 876.equiv nb311_n, 880.equiv nb311_nn1, 884.equiv nb311_nouter, 888.equiv nb311_ninner, 892 push rbp mov rbp, rsp push rbx emms push r12 push r13 push r14 push r15 sub rsp, 904 ;# local variable stack space (n*16+8) ;# zero 32-bit iteration counters mov eax, 0 mov [rsp + nb311_nouter], eax mov [rsp + nb311_ninner], eax mov edi, [rdi] mov [rsp + nb311_nri], edi mov [rsp + nb311_iinr], rsi mov [rsp + nb311_jindex], rdx mov [rsp + nb311_jjnr], rcx mov [rsp + nb311_shift], r8 mov [rsp + nb311_shiftvec], r9 mov rsi, [rbp + nb311_p_facel] movss xmm0, [rsi] movss [rsp + nb311_facel], xmm0 mov rax, [rbp + nb311_p_tabscale] movss xmm3, [rax] shufps xmm3, xmm3, 0 movaps [rsp + nb311_tsc], xmm3 ;# create constant floating-point factors on stack mov eax, 0x3f000000 ;# half in IEEE (hex) mov [rsp + nb311_half], eax movss xmm1, [rsp + nb311_half] shufps xmm1, xmm1, 0 ;# splat to all elements movaps xmm2, xmm1 addps xmm2, xmm2 ;# one movaps xmm3, xmm2 addps xmm2, xmm2 ;# two addps xmm3, xmm2 ;# three movaps xmm4, xmm3 addps xmm4, xmm4 ;# six movaps xmm5, xmm4 addps xmm5, xmm5 ;# twelve movaps [rsp + nb311_half], xmm1 movaps [rsp + nb311_three], xmm3 movaps [rsp + nb311_six], xmm4 movaps [rsp + nb311_twelve], xmm5 ;# assume we have at least one i particle - start directly mov rcx, [rsp + nb311_iinr] ;# rcx = pointer into iinr[] mov ebx, [rcx] ;# ebx =ii mov rdx, [rbp + nb311_charge] movss xmm3, [rdx + rbx*4] movss xmm4, [rdx + rbx*4 + 4] mov rsi, [rbp + nb311_p_facel] movss xmm0, [rsi] movss xmm5, [rsp + nb311_facel] mulss xmm3, xmm5 mulss xmm4, xmm5 shufps xmm3, xmm3, 0 shufps xmm4, xmm4, 0 movaps [rsp + nb311_iqO], xmm3 movaps [rsp + nb311_iqH], xmm4 mov rdx, [rbp + nb311_type] mov ecx, [rdx + rbx*4] shl ecx, 1 mov rdi, [rbp + nb311_p_ntype] imul ecx, [rdi] ;# rcx = ntia = 2*ntype*type[ii0] mov [rsp + nb311_ntia], ecx .nb311_threadloop: mov rsi, [rbp + nb311_count] ;# pointer to sync counter mov eax, [rsi].nb311_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 .nb311_spinlock ;# if(nn1>nri) nn1=nri mov ecx, [rsp + nb311_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 + nb311_n], eax mov [rsp + nb311_nn1], ebx sub ebx, eax ;# calc number of outer lists mov esi, eax ;# copy n to esi jg .nb311_outerstart jmp .nb311_end.nb311_outerstart: ;# ebx contains number of outer iterations add ebx, [rsp + nb311_nouter] mov [rsp + nb311_nouter], ebx.nb311_outer: mov rax, [rsp + nb311_shift] ;# rax = pointer into shift[] mov ebx, [rax + rsi*4] ;# rbx=shift[n] lea rbx, [rbx + rbx*2] ;# rbx=3*is mov [rsp + nb311_is3],ebx ;# store is3 mov rax, [rsp + nb311_shiftvec] ;# rax = base of shiftvec[] movss xmm0, [rax + rbx*4] movss xmm1, [rax + rbx*4 + 4] movss xmm2, [rax + rbx*4 + 8] mov rcx, [rsp + nb311_iinr] ;# rcx = pointer into iinr[] mov ebx, [rcx + rsi*4] ;# ebx =ii movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 lea rbx, [rbx + rbx*2] ;# rbx = 3*ii=ii3 mov rax, [rbp + nb311_pos] ;# rax = base of pos[] mov [rsp + nb311_ii3], ebx addss xmm3, [rax + rbx*4] addss xmm4, [rax + rbx*4 + 4] addss xmm5, [rax + rbx*4 + 8] shufps xmm3, xmm3, 0 shufps xmm4, xmm4, 0 shufps xmm5, xmm5, 0 movaps [rsp + nb311_ixO], xmm3 movaps [rsp + nb311_iyO], xmm4 movaps [rsp + nb311_izO], xmm5 movss xmm3, xmm0 movss xmm4, xmm1 movss xmm5, xmm2 addss xmm0, [rax + rbx*4 + 12] addss xmm1, [rax + rbx*4 + 16] addss xmm2, [rax + rbx*4 + 20] addss xmm3, [rax + rbx*4 + 24] addss xmm4, [rax + rbx*4 + 28] addss xmm5, [rax + rbx*4 + 32] shufps xmm0, xmm0, 0 shufps xmm1, xmm1, 0 shufps xmm2, xmm2, 0 shufps xmm3, xmm3, 0 shufps xmm4, xmm4, 0 shufps xmm5, xmm5, 0 movaps [rsp + nb311_ixH1], xmm0 movaps [rsp + nb311_iyH1], xmm1 movaps [rsp + nb311_izH1], xmm2 movaps [rsp + nb311_ixH2], xmm3 movaps [rsp + nb311_iyH2], xmm4 movaps [rsp + nb311_izH2], xmm5 ;# clear vctot and i forces xorps xmm4, xmm4 movaps [rsp + nb311_vctot], xmm4 movaps [rsp + nb311_Vvdwtot], xmm4 movaps [rsp + nb311_fixO], xmm4 movaps [rsp + nb311_fiyO], xmm4 movaps [rsp + nb311_fizO], xmm4 movaps [rsp + nb311_fixH1], xmm4 movaps [rsp + nb311_fiyH1], xmm4 movaps [rsp + nb311_fizH1], xmm4 movaps [rsp + nb311_fixH2], xmm4 movaps [rsp + nb311_fiyH2], xmm4 movaps [rsp + nb311_fizH2], xmm4 mov rax, [rsp + nb311_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 + nb311_pos] mov rdi, [rbp + nb311_faction] mov rax, [rsp + nb311_jjnr] shl ecx, 2 add rax, rcx mov [rsp + nb311_innerjjnr], rax ;# pointer to jjnr[nj0] mov ecx, edx sub edx, 4 add ecx, [rsp + nb311_ninner] mov [rsp + nb311_ninner], ecx add edx, 0 mov [rsp + nb311_innerk], edx ;# number of innerloop atoms jge .nb311_unroll_loop jmp .nb311_odd_inner.nb311_unroll_loop: ;# quad-unroll innerloop here mov rdx, [rsp + nb311_innerjjnr] ;# pointer to jjnr[k] mov eax, [rdx] mov ebx, [rdx + 4] mov ecx, [rdx + 8] mov edx, [rdx + 12] ;# eax-edx=jnr1-4 add qword ptr [rsp + nb311_innerjjnr], 16 ;# advance pointer (unrolled 4) mov rsi, [rbp + nb311_charge] ;# base of charge[] movss xmm3, [rsi + rax*4] movss xmm4, [rsi + rcx*4] movss xmm6, [rsi + rbx*4] movss xmm7, [rsi + rdx*4] shufps xmm3, xmm6, 0 shufps xmm4, xmm7, 0 shufps xmm3, xmm4, 136 ;# 10001000 ;# all charges in xmm3 movaps xmm4, xmm3 ;# and in xmm4 mulps xmm3, [rsp + nb311_iqO] mulps xmm4, [rsp + nb311_iqH] movaps [rsp + nb311_qqO], xmm3 movaps [rsp + nb311_qqH], xmm4 mov rsi, [rbp + nb311_type] mov r8d, [rsi + rax*4] mov r9d, [rsi + rbx*4] mov r10d, [rsi + rcx*4] mov r11d, [rsi + rdx*4] mov rsi, [rbp + nb311_vdwparam] shl r8d, 1 shl r9d, 1 shl r10d, 1 shl r11d, 1 mov edi, [rsp + nb311_ntia] add r8d, edi add r9d, edi add r10d, edi add r11d, edi movlps xmm6, [rsi + r8*4] movlps xmm7, [rsi + r10*4] movhps xmm6, [rsi + r9*4] movhps xmm7, [rsi + r11*4] movaps xmm4, xmm6 shufps xmm4, xmm7, 136 ;# 10001000 shufps xmm6, xmm7, 221 ;# 11011101 movaps [rsp + nb311_c6], xmm4 movaps [rsp + nb311_c12], xmm6 mov rsi, [rbp + nb311_pos] ;# base of pos[] lea rax, [rax + rax*2] ;# replace jnr with j3 lea rbx, [rbx + rbx*2] lea rcx, [rcx + rcx*2] ;# replace jnr with j3 lea rdx, [rdx + rdx*2] ;# move four coordinates to xmm0-xmm2 movlps xmm4, [rsi + rax*4] movlps xmm5, [rsi + rcx*4] movss xmm2, [rsi + rax*4 + 8] movss xmm6, [rsi + rcx*4 + 8] movhps xmm4, [rsi + rbx*4] movhps xmm5, [rsi + rdx*4] movss xmm0, [rsi + rbx*4 + 8] movss xmm1, [rsi + rdx*4 + 8] shufps xmm2, xmm0, 0 shufps xmm6, xmm1, 0 movaps xmm0, xmm4 movaps xmm1, xmm4 shufps xmm2, xmm6, 136 ;# 10001000 shufps xmm0, xmm5, 136 ;# 10001000 shufps xmm1, xmm5, 221 ;# 11011101 ;# xmm0 = jx ;# xmm1 = jy ;# xmm2 = jz movaps xmm3, xmm0 movaps xmm4, xmm1 movaps xmm5, xmm2 movaps xmm6, xmm0 movaps xmm7, xmm1 movaps xmm8, xmm2 movd mm0, eax movd mm1, ebx movd mm2, ecx movd mm3, edx subps xmm0, [rsp + nb311_ixO] subps xmm1, [rsp + nb311_iyO] subps xmm2, [rsp + nb311_izO] subps xmm3, [rsp + nb311_ixH1] subps xmm4, [rsp + nb311_iyH1] subps xmm5, [rsp + nb311_izH1] subps xmm6, [rsp + nb311_ixH2] subps xmm7, [rsp + nb311_iyH2] subps xmm8, [rsp + nb311_izH2] movaps [rsp + nb311_dxO], xmm0 movaps [rsp + nb311_dyO], xmm1 movaps [rsp + nb311_dzO], xmm2 mulps xmm0, xmm0 mulps xmm1, xmm1 mulps xmm2, xmm2 movaps [rsp + nb311_dxH1], xmm3 movaps [rsp + nb311_dyH1], xmm4 movaps [rsp + nb311_dzH1], xmm5 mulps xmm3, xmm3 mulps xmm4, xmm4 mulps xmm5, xmm5 movaps [rsp + nb311_dxH2], xmm6 movaps [rsp + nb311_dyH2], xmm7 movaps [rsp + nb311_dzH2], xmm8 mulps xmm6, xmm6 mulps xmm7, xmm7 mulps xmm8, xmm8 addps xmm0, xmm1 addps xmm0, xmm2 addps xmm3, xmm4 addps xmm3, xmm5 addps xmm6, xmm7 addps xmm6, xmm8 ;# start doing invsqrt for j atoms rsqrtps xmm1, xmm0 rsqrtps xmm4, xmm3 rsqrtps xmm7, xmm6 movaps xmm2, xmm1 movaps xmm5, xmm4 movaps xmm8, xmm7 mulps xmm1, xmm1 ;# lu*lu mulps xmm4, xmm4 ;# lu*lu mulps xmm7, xmm7 ;# lu*lu movaps xmm9, [rsp + nb311_three] movaps xmm10, xmm9 movaps xmm11, xmm9 mulps xmm1, xmm0 ;# rsq*lu*lu mulps xmm4, xmm3 ;# rsq*lu*lu mulps xmm7, xmm6 ;# rsq*lu*lu subps xmm9, xmm1 subps xmm10, xmm4 subps xmm11, xmm7 ;# 3-rsq*lu*lu mulps xmm9, xmm2 mulps xmm10, xmm5 mulps xmm11, xmm8 ;# lu*(3-rsq*lu*lu) movaps xmm4, [rsp + nb311_half] mulps xmm9, xmm4 ;# rinvO mulps xmm10, xmm4 ;# rinvH1 mulps xmm11, xmm4 ;# rinvH2 movaps [rsp + nb311_rinvO], xmm9 movaps [rsp + nb311_rinvH1], xmm10 movaps [rsp + nb311_rinvH2], xmm11 ;# interactions ;# rsq in xmm0,xmm3,xmm6 ;# rinv in xmm9, xmm10, xmm11 movaps xmm1, [rsp + nb311_tsc] mulps xmm0, xmm9 ;# r mulps xmm3, xmm10 mulps xmm6, xmm11 mulps xmm0, xmm1 ;# rtab mulps xmm3, xmm1 mulps xmm6, xmm1 ;# truncate and convert to integers cvttps2dq xmm1, xmm0 cvttps2dq xmm4, xmm3 cvttps2dq xmm7, xmm6 ;# convert back to float cvtdq2ps xmm2, xmm1 cvtdq2ps xmm5, xmm4
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?