atl_dmm8x1x120_sse2.c

来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 3,266 行 · 第 1/5 页

C
3,266
字号
/* *             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"#include "atlas_asm.h"/* * This routine designed for Core2, which seems to have relatively few * reservation stations on both the VPUs and ld/st, so we make it so * we do at most 8 computations per block, and reduce outstanding ld/st * over similar x86-64 code for AMD archs */#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/* *Register usage */#define pA0     %rcx#define lda     %rbx#define lda3    %rbp#define lda5    %rdx#define lda7    %rdi#define pB0     %rax#define pC0     %rsi#define ldb     %r8#define ldc     %r9#define pfA     %r10#define MM      %r11#define NN      %r12#define incAn   %r13#define incCn   %r14#define MM0     %r15#define rA0     %xmm0#define rB0     %xmm1#define rC00    %xmm2#define rC01    %xmm3#define rC02    %xmm4#define rC03    %xmm5#define rC04    %xmm6#define rC05    %xmm7#define rC06    %xmm8#define rC07    %xmm9#define rC0     %xmm10#define rC2     %xmm11#define rC4     %xmm12#define rC6     %xmm13#define rb0     %xmm14#define BETA    %xmm15/* * 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*8+MB/8-1)/(MB/8))#endif#ifdef DCPLX   #define CMUL(arg_) 2*arg_#else   #define CMUL(arg_) arg_#endif/*                      %rdi/4       %rsi/8       %rdx/12          %xmm0/16 void ATL_USERMM(const int M, const int N, const int K, const TYPE alpha,                       %rcx/24         %r8/28         %r9/32           8/36                 const TYPE *A, const int lda, const TYPE *B, const int ldb,                        %xmm1/40    16/48          24/52                 const TYPE beta, TYPE *C, const int ldc)*/        .text.global ATL_asmdecor(ATL_USERMM)ALIGN16ATL_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)#ifdef BETAX        pshufd  $0x44, %xmm1, BETA/*        pshufd  $0b01000100, %xmm1, BETA */#endif/* *      Setup input parameters */        movq    %rdi, MM0        movq    %rsi, NN        movq    %r9, pB0        movq    %r8, lda        movslq  8(%rsp), ldb        movq    16(%rsp), pC0        movslq  24(%rsp), incCn/* *      ldx *= sizeof; lda3 = 3*lda, lda5=5*lda, lda7=7*lda */#ifndef DCPLX        movq    incCn, ldc#endif        shl     $3, lda        shl     $3, ldb        lea     (lda,lda,2), lda3        lea     (lda,lda,4), lda5        lea     (lda3,lda,4), lda7/* *      pA3 += 128, pB0 += 128 */        sub     $-128, pA0        sub     $-128, pB0/* *      incAn = lda*M*sizeof */        movq    lda, incAn        imulq   MM0, incAn        lea     -128(pA0,incAn), pfA/* *      incCn = (ldc - M)*sizeof */        sub     MM0, incCn#ifdef DCPLX        shl     $4, incCn#else        shl     $3, incCn        test    $1, ldc        jnz     UNLOOP        test    $15, pC0        jnz     UNLOOPNLOOP:        movq    MM0, MM        prefB(-128(pB0,ldb))#if KB > 16        prefB((pB0,ldb))#endif#if KB > 32        prefB(128(pB0,ldb))#endif#if KB > 48        prefB(256(pB0,ldb))#endif#if KB > 64        prefB(384(pB0,ldb))#endifMLOOP:                prefC((pC0))/*KLOOP: */	movapd	-128(pB0), rB0                                        pref2((pfA))                                        add     $PFAINC, pfA	movapd	-128(pA0), rC00	mulpd	rB0,rC00	movapd	-128(pA0,lda), rC01	mulpd	rB0,rC01	movapd	-128(pA0,lda,2), rC02	mulpd	rB0,rC02	movapd	-128(pA0,lda3), rC03	mulpd	rB0,rC03	movapd	-128(pA0,lda,4), rC04	mulpd	rB0,rC04	movapd	-128(pA0,lda5), rC05	mulpd	rB0,rC05	movapd	-128(pA0,lda3,2), rC06	mulpd	rB0,rC06	movapd	-128(pA0,lda7), rC07	mulpd	rB0,rC07#if KB > 2	movapd	16-128(pB0), rB0	movapd	16-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	16-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	16-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	16-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	16-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	16-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	16-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	16-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 4	movapd	32-128(pB0), rB0	movapd	32-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	32-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	32-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	32-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	32-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	32-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	32-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	32-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 6	movapd	48-128(pB0), rB0	movapd	48-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	48-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	48-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	48-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	48-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	48-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	48-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	48-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 8	movapd	64-128(pB0), rB0	movapd	64-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	64-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	64-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	64-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	64-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	64-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	64-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	64-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 10	movapd	80-128(pB0), rB0	movapd	80-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	80-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	80-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	80-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	80-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	80-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	80-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	80-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 12	movapd	96-128(pB0), rB0	movapd	96-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	96-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	96-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	96-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	96-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	96-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	96-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	96-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 14	movapd	112-128(pB0), rB0	movapd	112-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	112-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	112-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	112-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	112-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	112-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	112-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	112-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 16	movapd	128-128(pB0), rB0	movapd	128-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	128-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	128-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	128-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	128-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	128-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	128-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	128-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 18	movapd	144-128(pB0), rB0	movapd	144-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	144-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	144-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	144-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	144-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	144-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	144-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	144-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 20	movapd	160-128(pB0), rB0	movapd	160-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	160-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	160-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	160-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	160-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	160-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	160-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	160-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 22	movapd	176-128(pB0), rB0	movapd	176-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	176-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	176-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	176-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	176-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	176-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	176-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	176-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 24	movapd	192-128(pB0), rB0	movapd	192-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	192-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	192-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	192-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	192-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	192-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	192-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	192-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 26	movapd	208-128(pB0), rB0	movapd	208-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	208-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	208-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	208-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	208-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	208-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	208-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	208-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 28	movapd	224-128(pB0), rB0	movapd	224-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	224-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	224-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	224-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	224-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	224-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	224-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	224-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 30	movapd	240-128(pB0), rB0	movapd	240-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	240-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	240-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	240-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	240-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	240-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	240-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	240-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 32	movapd	256-128(pB0), rB0	movapd	256-128(pA0), rA0	mulpd	rB0,rA0	addpd	rA0,rC00	movapd	256-128(pA0,lda), rA0	mulpd	rB0,rA0	addpd	rA0,rC01	movapd	256-128(pA0,lda,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC02	movapd	256-128(pA0,lda3), rA0	mulpd	rB0,rA0	addpd	rA0,rC03	movapd	256-128(pA0,lda,4), rA0	mulpd	rB0,rA0	addpd	rA0,rC04	movapd	256-128(pA0,lda5), rA0	mulpd	rB0,rA0	addpd	rA0,rC05	movapd	256-128(pA0,lda3,2), rA0	mulpd	rB0,rA0	addpd	rA0,rC06	mulpd	256-128(pA0,lda7), rB0	addpd	rB0,rC07#endif#if KB > 34	movapd	272-128(pB0), rB0	movapd	272-128(pA0), rA0	mulpd	rB0,rA0

⌨️ 快捷键说明

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