atl_smm10x1x120_sse.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 1,411 行 · 第 1/2 页
C
1,411 行
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 2006 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */#include "atlas_asm.h"/* * This routine optimized for Core2Duo, which has a relatively weak frontend, * so we have to be very careful about alignment, and things seem to work * better if we keep a register block within 128 bytes */#if !defined(MB) #define MB 0#endif#if !defined(NB) #define NB 0#endif#if !defined(KB) #define KB 0#endif#if KB == 0 #error "KB must be compile time constant!"#endif#if KB/4*4 != KB #error "KB must be a multiple of 4!"#endif#if KB > 128 #error "KB must be <= 128!"#endif#if KB != 0 && (MB/10)*10 != MB #error "MB must be a multiple of 10!"#endif/* * Floating point (SSE) register usage */#define rA0 %xmm0#define rB0 %xmm1#define rC0 %xmm2#define rC1 %xmm3#define rC2 %xmm4#define rC3 %xmm5#define rC4 %xmm6#define rC5 %xmm7#define rC6 %xmm8#define rC7 %xmm9#define rC8 %xmm10#define rC9 %xmm11#define rCa %xmm12#define rCb %xmm13#define rCc %xmm14#define rBETA %xmm15/* * Integer register usage */#define pB0 %rax#define pA2 %rcx#define pA7 %rbx#define nlda %rbp#define lda %rdi#define pfA %rsi#define ldb %rdx#define II %r8#define JJ %r9#define M0 %r10#define pC0 %r11#define incAn %r12#define incCn %r13#define incAm %r14/* * Prefetch defines */#if 1 #define pref2(mem) prefetcht1 mem #define prefB(mem) prefetcht1 mem #define prefC(mem) prefetcht0 mem#else #define pref2(mem) #define prefB(mem) #define prefC(mem)#endif#if MB == 0 #define PFAINC 64#else #define PFAINC ((MB*4+MB/4-1)/(MB/4))#endif#ifdef SCPLX #define CMUL(arg_) 2*arg_#else #define CMUL(arg_) arg_#endif/* %rdi %rsi %rdx %xmm0 void ATL_USERMM(const int M, const int N, const int K, const TYPE alpha, %rcx %r8 %r9 8 const TYPE *A, const int lda, const TYPE *B, const int ldb, %xmm1 16 24 const TYPE beta, TYPE *C, const int ldc)*/.text.global ATL_asmdecor(ATL_USERMM)ALIGN128ATL_asmdecor(ATL_USERMM):/* * Save callee-saved iregs */ movq %rbp, -8(%rsp) movq %rbx, -16(%rsp) movq %r12, -24(%rsp) movq %r13, -32(%rsp) movq %r14, -40(%rsp)/* movq %r15, -48(%rsp) *//* * Load parameters */ movq %r9, pB0 movq %rdi, M0 movq %rsi, JJ movq %r8, lda movslq 8(%rsp), ldb movq 16(%rsp), pC0 movslq 24(%rsp), incCn#ifdef BETAX pshufd $0x00, %xmm1, rBETA # rBETA = {beta,beta,beta,beta}#endif/* * ldx *= sizeof; */ shl $2, lda shl $2, ldb movq lda, nlda neg nlda/* * incAm = 10*lda - (increment done in K-loop) */#if KB <= 64 || 1 /* did no += 256 increment */ lea (lda,lda,8),incAm /* incAm = lda*9 */ lea (incAm, lda), incAm /* incAm = lda*10 */#elif KB <= 128 /* did one += 256 increment */ lea -128(lda,lda,8),incAm /* incAm = lda*9 - 128 */ lea -128(incAm, lda), incAm /* incAm = lda*10 - 256 */#endif/* * pA2 = pA + 2*lda + 128; pA7 = pA+7*lda + 128; pB0 += 128 */ lea (lda,lda,2), pA7 /* pA7 = 3*lda */ sub $-128, pA2 /* pA2 = pA2 + 128 */ lea (pA7,lda,4), pA7 /* pA7 = 7*lda */ add pA2, pA7 /* pA7 = pA0 + 7*lda + 128 */ sub $-128, pB0 /* pB0 = pB0 + 128 */ lea (pA2, lda,2), pA2 /* pA2 = pA0 + 2*lda + 128 *//* * incAn = lda*M*sizeof */ movq M0, incAn imulq lda, incAn /* incAn = lda*M */ lea (pA2,incAn), pfA /* pfA = pA0+2*lda + M*lda + 128 */ lea -128(pfA,nlda,2), pfA /* pfA = pA0 + M*lda *//* * incCn = (ldc-M)*sizeof */ sub M0, incCn#ifdef SCPLX shl $3, incCn#else shl $2, incCn#endifNLOOP: movq M0, II prefB(-128(pB0,ldb))#if KB > 32 prefB((pB0,ldb))#endif#if KB > 64 prefB(128(pB0,ldb))#endif#if KB > 96 prefB(256(pB0,ldb))#endifALIGN16MLOOP: prefC((pC0))#define MY_ALIGN/* * Start the KLOOP */ movaps -128(pB0), rB0 pref2((pfA)) add $PFAINC, pfA movaps -128(pA2,nlda,2), rC0 mulps rB0,rC0 movaps -128(pA2,nlda), rC1 mulps rB0,rC1 movaps -128(pA2), rC2 mulps rB0,rC2 movaps -128(pA2,lda), rC3 mulps rB0,rC3 movaps -128(pA2,lda,2), rC4 mulps rB0,rC4 movaps -128(pA7,nlda,2), rC5 mulps rB0,rC5 movaps -128(pA7,nlda), rC6 mulps rB0,rC6 movaps -128(pA7), rC7 mulps rB0,rC7 movaps -128(pA7,lda), rC8 mulps rB0,rC8 movaps -128(pA7,lda,2), rC9 mulps rB0,rC9#ifdef BETA0 nop nop nop#elif defined(BETA1)#endif#if KB > 4 movaps 16-128(pB0), rB0 movaps 16-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 16-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 16-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 16-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 16-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 16-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 16-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 16-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 16-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 16-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 8 MY_ALIGN movaps 32-128(pB0), rB0 movaps 32-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 32-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 32-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 32-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 32-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 32-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 32-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 32-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 32-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 32-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 12 MY_ALIGN movaps 48-128(pB0), rB0 movaps 48-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 48-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 48-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 48-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 48-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 48-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 48-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 48-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 48-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 48-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 16 MY_ALIGN movaps 64-128(pB0), rB0 movaps 64-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 64-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 64-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 64-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 64-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 64-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 64-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 64-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 64-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 64-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 20 MY_ALIGN movaps 80-128(pB0), rB0 movaps 80-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 80-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 80-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 80-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 80-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 80-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 80-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 80-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 80-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 80-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 24 MY_ALIGN movaps 96-128(pB0), rB0 movaps 96-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 96-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 96-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 96-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 96-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 96-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 96-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 96-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 96-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 96-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 28 MY_ALIGN movaps 112-128(pB0), rB0 movaps 112-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 112-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 112-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 112-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 112-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 112-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 112-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 112-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 112-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 112-128(pA7,lda,2), rB0 addps rB0,rC9#endif#ifndef BETA0 /* cplx = XX c1 XX c0 */ movups (pC0), rCa /* rCa = c3 c2 c1 c0 */#endif#if KB > 32 MY_ALIGN movaps 128-128(pB0), rB0 movaps 128-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 128-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 128-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 128-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 128-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 128-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 128-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 128-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 128-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 128-128(pA7,lda,2), rB0 addps rB0,rC9#endif#ifndef BETA0 #ifdef SCPLX movups 16(pC0), rCc /* rCc = XX c3 XX c2 */ #else movups 16(pC0), rCb /* rCb = c7 c6 c5 c4 */ #endif#endif#if KB > 36 MY_ALIGN movaps 144-128(pB0), rB0 movaps 144-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 144-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 144-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 144-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 144-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 144-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 144-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 144-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 144-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 144-128(pA7,lda,2), rB0 addps rB0,rC9#endif#ifndef BETA0 #ifdef SCPLX movups 32(pC0), rCb /* rCb = XX c5 XX c4 */ #else movups 32(pC0), rCc /* rCc = XX XX c9 c8 */ #endif#endif#if defined(SCPLX) && !defined(BETA0) shufps $0x88, rCc, rCa /* rCa = c3 c2 c1 c0 */#endif#if KB > 40 MY_ALIGN movaps 160-128(pB0), rB0 movaps 160-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 160-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 160-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 160-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 160-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 160-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 160-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 160-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 160-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 160-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 44 MY_ALIGN movaps 176-128(pB0), rB0 movaps 176-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 176-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 176-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 176-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 176-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 176-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 176-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 176-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 176-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 176-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 48 MY_ALIGN movaps 192-128(pB0), rB0 movaps 192-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 192-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 192-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 192-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 192-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 192-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 192-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 192-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 192-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 192-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 52 MY_ALIGN movaps 208-128(pB0), rB0 movaps 208-128(pA2,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC0 movaps 208-128(pA2,nlda), rA0 mulps rB0,rA0 addps rA0,rC1 movaps 208-128(pA2), rA0 mulps rB0,rA0 addps rA0,rC2 movaps 208-128(pA2,lda), rA0 mulps rB0,rA0 addps rA0,rC3 movaps 208-128(pA2,lda,2), rA0 mulps rB0,rA0 addps rA0,rC4 movaps 208-128(pA7,nlda,2), rA0 mulps rB0,rA0 addps rA0,rC5 movaps 208-128(pA7,nlda), rA0 mulps rB0,rA0 addps rA0,rC6 movaps 208-128(pA7), rA0 mulps rB0,rA0 addps rA0,rC7 movaps 208-128(pA7,lda), rA0 mulps rB0,rA0 addps rA0,rC8 mulps 208-128(pA7,lda,2), rB0 addps rB0,rC9#endif#if KB > 56 MY_ALIGN
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?