atl_smm4x4x128_av.c

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

C
3,072
字号
		lvx vb0, pB0, k0   #endif	vmaddfp	vC01, va0, vb1, vC01	vmaddfp	vC11, va1, vb1, vC11	vmaddfp	vC21, va2, vb1, vC21	vmaddfp	vC31, va3, vb1, vC31   #if KB > 116		lvx vb1, pB0, k1   #endif	vmaddfp	vC02, va0, vb2, vC02	vmaddfp	vC12, va1, vb2, vC12	vmaddfp	vC22, va2, vb2, vC22	vmaddfp	vC32, va3, vb2, vC32   #if KB > 116		lvx vb2, pB0, k2   #endif	vmaddfp	vC03, va0, vb3, vC03   #if KB > 116		lvx va0, pA0, k0   #endif	vmaddfp	vC13, va1, vb3, vC13   #if KB > 116		lvx va1, pA0, k1   #endif	vmaddfp	vC23, va2, vb3, vC23   #if KB > 116		lvx va2, pA0, k2   #endif	vmaddfp	vC33, va3, vb3, vC33   #if KB > 116		lvx va3, pA0, k3   #endif   #if KB > 116		lvx vb3, pB0, k3   #endif#endif  /* end K=108 block */#if KB > 112   #if KB > 120		addi	k0, k0, 16   #endif	vmaddfp	vC00, vA0, vB0, vC00   #if KB > 120		addi	k1, k1, 16   #endif	vmaddfp	vC10, vA1, vB0, vC10   #if KB > 120		addi	k2, k2, 16   #endif	vmaddfp	vC20, vA2, vB0, vC20   #if KB > 120		addi	k3, k3, 16   #endif	vmaddfp	vC30, vA3, vB0, vC30   #if KB > 120		lvx vB0, pB0, k0   #endif	vmaddfp	vC01, vA0, vB1, vC01	vmaddfp	vC11, vA1, vB1, vC11	vmaddfp	vC21, vA2, vB1, vC21	vmaddfp	vC31, vA3, vB1, vC31   #if KB > 120		lvx vB1, pB0, k1   #endif	vmaddfp	vC02, vA0, vB2, vC02	vmaddfp	vC12, vA1, vB2, vC12	vmaddfp	vC22, vA2, vB2, vC22	vmaddfp	vC32, vA3, vB2, vC32   #if KB > 120		lvx vB2, pB0, k2   #endif	vmaddfp	vC03, vA0, vB3, vC03   #if KB > 120		lvx vA0, pA0, k0   #endif	vmaddfp	vC13, vA1, vB3, vC13   #if KB > 120		lvx vA1, pA0, k1   #endif	vmaddfp	vC23, vA2, vB3, vC23   #if KB > 120		lvx vA2, pA0, k2   #endif	vmaddfp	vC33, vA3, vB3, vC33   #if KB > 120		lvx vA3, pA0, k3   #endif   #if KB > 120		lvx vB3, pB0, k3   #endif#endif  /* end K=112 block */#if KB > 116   #if KB > 124		addi	k0, k0, 16   #endif	vmaddfp	vC00, va0, vb0, vC00   #if KB > 124		addi	k1, k1, 16   #endif	vmaddfp	vC10, va1, vb0, vC10   #if KB > 124		addi	k2, k2, 16   #endif	vmaddfp	vC20, va2, vb0, vC20   #if KB > 124		addi	k3, k3, 16   #endif	vmaddfp	vC30, va3, vb0, vC30   #if KB > 124		lvx vb0, pB0, k0   #endif	vmaddfp	vC01, va0, vb1, vC01	vmaddfp	vC11, va1, vb1, vC11	vmaddfp	vC21, va2, vb1, vC21	vmaddfp	vC31, va3, vb1, vC31   #if KB > 124		lvx vb1, pB0, k1   #endif	vmaddfp	vC02, va0, vb2, vC02	vmaddfp	vC12, va1, vb2, vC12	vmaddfp	vC22, va2, vb2, vC22	vmaddfp	vC32, va3, vb2, vC32   #if KB > 124		lvx vb2, pB0, k2   #endif	vmaddfp	vC03, va0, vb3, vC03   #if KB > 124		lvx va0, pA0, k0   #endif	vmaddfp	vC13, va1, vb3, vC13   #if KB > 124		lvx va1, pA0, k1   #endif	vmaddfp	vC23, va2, vb3, vC23   #if KB > 124		lvx va2, pA0, k2   #endif	vmaddfp	vC33, va3, vb3, vC33   #if KB > 124		lvx va3, pA0, k3   #endif   #if KB > 124		lvx vb3, pB0, k3   #endif#endif  /* end K=116 block */#if KB > 120   #if KB > 128		addi	k0, k0, 16   #endif	vmaddfp	vC00, vA0, vB0, vC00   #if KB > 128		addi	k1, k1, 16   #endif	vmaddfp	vC10, vA1, vB0, vC10   #if KB > 128		addi	k2, k2, 16   #endif	vmaddfp	vC20, vA2, vB0, vC20   #if KB > 128		addi	k3, k3, 16   #endif	vmaddfp	vC30, vA3, vB0, vC30   #if KB > 128		lvx vB0, pB0, k0   #endif	vmaddfp	vC01, vA0, vB1, vC01	vmaddfp	vC11, vA1, vB1, vC11	vmaddfp	vC21, vA2, vB1, vC21	vmaddfp	vC31, vA3, vB1, vC31   #if KB > 128		lvx vB1, pB0, k1   #endif	vmaddfp	vC02, vA0, vB2, vC02	vmaddfp	vC12, vA1, vB2, vC12	vmaddfp	vC22, vA2, vB2, vC22	vmaddfp	vC32, vA3, vB2, vC32   #if KB > 128		lvx vB2, pB0, k2   #endif	vmaddfp	vC03, vA0, vB3, vC03   #if KB > 128		lvx vA0, pA0, k0   #endif	vmaddfp	vC13, vA1, vB3, vC13   #if KB > 128		lvx vA1, pA0, k1   #endif	vmaddfp	vC23, vA2, vB3, vC23   #if KB > 128		lvx vA2, pA0, k2   #endif	vmaddfp	vC33, vA3, vB3, vC33   #if KB > 128		lvx vA3, pA0, k3   #endif   #if KB > 128		lvx vB3, pB0, k3   #endif#endif  /* end K=120 block */#if KB > 124   #if KB > 132		addi	k0, k0, 16   #endif	vmaddfp	vC00, va0, vb0, vC00   #if KB > 132		addi	k1, k1, 16   #endif	vmaddfp	vC10, va1, vb0, vC10   #if KB > 132		addi	k2, k2, 16   #endif	vmaddfp	vC20, va2, vb0, vC20   #if KB > 132		addi	k3, k3, 16   #endif	vmaddfp	vC30, va3, vb0, vC30   #if KB > 132		lvx vb0, pB0, k0   #endif	vmaddfp	vC01, va0, vb1, vC01	vmaddfp	vC11, va1, vb1, vC11	vmaddfp	vC21, va2, vb1, vC21	vmaddfp	vC31, va3, vb1, vC31   #if KB > 132		lvx vb1, pB0, k1   #endif	vmaddfp	vC02, va0, vb2, vC02	vmaddfp	vC12, va1, vb2, vC12	vmaddfp	vC22, va2, vb2, vC22	vmaddfp	vC32, va3, vb2, vC32   #if KB > 132		lvx vb2, pB0, k2   #endif	vmaddfp	vC03, va0, vb3, vC03   #if KB > 132		lvx va0, pA0, k0   #endif	vmaddfp	vC13, va1, vb3, vC13   #if KB > 132		lvx va1, pA0, k1   #endif	vmaddfp	vC23, va2, vb3, vC23   #if KB > 132		lvx va2, pA0, k2   #endif	vmaddfp	vC33, va3, vb3, vC33   #if KB > 132		lvx va3, pA0, k3   #endif   #if KB > 132		lvx vb3, pB0, k3   #endif#endif  /* end K=124 block *//* End KLOOP */#if !defined(BETA0) && KB != 92        lvx     va0, 0, pC0        lvx     va1, pC0, ldc        lvx     va2, pC0, ldc2        lvx     va3, pC0, ldc3#endif/* * Reduce C vectors to scalars */        vspltisb vb0, 8         /* vb0={8,8,8,8,8,8,8,8,8, 8, 8, 8, 8, 8, 8} */        	addi    pA0, pA0, KB4*4         /* pA0 += 4*lda */        vxor    vb1, vb1, vb1   /* vb1={0...0} */        	xor     k0, k0, k0        vsldoi  vb0, vb1, vb0, 8  /* vb0={0,0,0,0,0,0,0,0,8,8,8,8,8,8,8,8} */        	li      k1, KB*4        lvsl    vb1, 0, r1    /*vb1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}*/        	li      k2, 2*KB*4        vaddubm vb1, vb0, vb1 /*vb1={0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23}*/        	li      k3, 3*KB*4        vaddubm vb1, vb0, vb1 /*vb1={0,1,2,3,4,5,6,7,24,25,26,27,28,29,30,31}*/#ifdef BETAX        lvx     vb0, 0, pBETA#endif                                        /* rC00 = {c0a, c0b, c0c, c0d} */                                        /* rC10 = {c1a, c1b, c1c, c1d} */                                        /* rC20 = {c2a, c2b, c2c, c2d} */                                        /* rC30 = {c3a, c3b, c3c, c3d} */#if KB != 92	vmrglw  vb2, vC00, vC10		// vb2  = {c0c, c1c, c0d, c1d}	vmrghw  vC00, vC00, vC10	// vC00 = {c0a, c1a, c0b, c1b}#endif	vaddfp  vC00, vC00, vb2         // vC00 = {c0ac, c1ac, c0bd, c1bd}        lvx     vB0, 0, pB0#if KB != 92	vmrglw  vb3, vC20, vC30		// vb3  = {c2c, c3c, c2d, c3d}	vmrghw  vC20, vC20, vC30	// vC20 = {c2a, c3a, c2b, c3b}#endif	vaddfp  vC20, vC20, vb3         // vC20 = {c2ac, c3ac, c2bd, c3bd}        lvx     vA0, 0, pA0        vperm   vb2, vC00, vC20,vb1     // vb2  = {c0ac, c1ac, c2bd, c3bd}        lvx     vA1, pA0, k1        vsldoi  vC00, vC00, vC20,8      // vC00 = {c0bd, c1bd, c2ac, c3ac}        lvx     vA2, pA0, k2	vaddfp vC00, vC00, vb2          // vC00 = {c0acbd,c1acbd,c2acbd,c3acbd}        lvx     vA3, pA0, k3#ifdef BETA1	vaddfp vC00, vC00, va0          // vC00 = {c0,c1,c2,c3}#elif defined(BETAX)        vmaddfp vC00, va0, vb0, vC00    // vC00 += C*beta;#endif	vmrglw  vb2, vC01, vC11		// vb2  = {c0c, c1c, c0d, c1d}        lvx     vB1, pB0, k1	vmrghw  vC01, vC01, vC11	// vC01 = {c0a, c1a, c0b, c1b}        lvx     vB2, pB0, k2	vaddfp  vC01, vC01, vb2         // vC01 = {c0ac, c1ac, c0bd, c1bd}        lvx     vB3, pB0, k3	vmrglw  vb3, vC21, vC31		// vb3  = {c2c, c3c, c2d, c3d}#if KB > 4        addi    k0, k0, 16#endif	vmrghw  vC21, vC21, vC31	// vC21 = {c2a, c3a, c2b, c3b}#if KB > 4        addi    k1, k1, 16#endif	vaddfp  vC21, vC21, vb3         // vC21 = {c2ac, c3ac, c2bd, c3bd}#if KB > 4        addi    k2, k2, 16#endif        vperm   vb2, vC01, vC21,vb1     // vb2  = {c0ac, c1ac, c2bd, c3bd}#if KB > 4        addi    k3, k3, 16#endif        vsldoi  vC01, vC01, vC21,8      // vC01 = {c0bd, c1bd, c2ac, c3ac}	vaddfp vC01, vC01, vb2          // vC01 = {c0acbd,c1acbd,c0acbd,c1acbd}#if KB > 4        lvx     va0, pA0, k0#endif#ifdef BETA1	vaddfp vC01, vC01, va1          // vC01 = {c0,c1,c2,c3}#elif defined(BETAX)        vmaddfp vC01, va1, vb0, vC01    // vC01 += C*beta;#endif	vmrglw  vb2, vC02, vC12		// vb2  = {c0c, c1c, c0d, c1d}	vmrghw  vC02, vC02, vC12	// vC02 = {c0a, c1a, c0b, c1b}	vaddfp  vC02, vC02, vb2         // vC02 = {c0ac, c1ac, c0bd, c1bd}#if KB > 4        lvx     va1, pA0, k1#endif	vmrglw  vb3, vC22, vC32		// vb3  = {c2c, c3c, c2d, c3d}	vmrghw  vC22, vC22, vC32	// vC22 = {c2a, c3a, c2b, c3b}	vaddfp  vC22, vC22, vb3         // vC22 = {c2ac, c3ac, c2bd, c3bd}        vperm   vb2, vC02, vC22,vb1     // vb2  = {c0ac, c1ac, c2bd, c3bd}        vsldoi  vC02, vC02, vC22,8      // vC02 = {c0bd, c1bd, c2ac, c3ac}	vaddfp vC02, vC02, vb2          // vC02 = {c0acbd,c1acbd,c0acbd,c1acbd}#ifdef BETA1	vaddfp vC02, vC02, va2          // vC02 = {c0,c1,c2,c3}#elif defined(BETAX)        vmaddfp vC02, va2, vb0, vC02    // vC02 += C*beta;#endif	vmrglw  vb2, vC03, vC13		// vb2  = {c0c, c1c, c0d, c1d}	vmrghw  vC03, vC03, vC13	// vC03 = {c0a, c1a, c0b, c1b}	vaddfp  vC03, vC03, vb2         // vC03 = {c0ac, c1ac, c0bd, c1bd}#if KB > 4        lvx     va2, pA0, k2#endif	vmrglw  vb3, vC23, vC33		// vb3  = {c2c, c3c, c2d, c3d}	vmrghw  vC23, vC23, vC33	// vC23 = {c2a, c3a, c2b, c3b}        vxor    vC33, vC33, vC33	vaddfp  vC23, vC23, vb3         // vC23 = {c2ac, c3ac, c2bd, c3bd}        vperm   vb2, vC03, vC23,vb1     // vb2  = {c0ac, c1ac, c2bd, c3bd}        vsldoi  vC03, vC03, vC23,8      // vC03 = {c0bd, c1bd, c2ac, c3ac}	vaddfp vC03, vC03, vb2          // vC03 = {c0acbd,c1acbd,c0acbd,c1acbd}#ifdef BETA1	vaddfp vC03, vC03, va3          // vC02 = {c0,c1,c2,c3}#elif defined(BETAX)        vmaddfp vC03, va3, vb0, vC03    // vC03 += C*beta;#endif#if KB > 4        lvx     vb0, pB0, k0#endif#if KB > 4        lvx     va3, pA0, k3#endif/* *      Store to C, iterate loop */        stvx    vC00, 0, pC0        stvx    vC01, pC0, ldc        stvx    vC02, pC0, ldc2        stvx    vC03, pC0, ldc3/* *      Mov ptrs, while(M) */#if KB > 4        lvx     vb1, pB0, k1#endif#if KB > 4        lvx     vb2, pB0, k2#endif#if KB > 4        lvx     vb3, pB0, k3#endif	addi	pC0, pC0, 16        bdnz+   MLOOP#endif/* *      Last iteration of M-loop unrolled so we can intermix M iterations */#if MB == 0MPEELED:#endif#MLOOP:        xor     k0, k0, k0        li      k1, KB*4        li      k2, 2*KB*4        li      k3, 3*KB*4        lvx     vB0, 0, pB0        lvx     vA0, 0, pA0        lvx     vA1, pA0, k1        lvx     vA2, pA0, k2        lvx     vA3, pA0, k3        lvx     vB1, pB0, k1        lvx     vB2, pB0, k2        lvx     vB3, pB0, k3        vxor    vC33, vC33, vC33#if KB > 4        addi    k0, k0, 16        addi    k1, k1, 16        addi    k2, k2, 16        addi    k3, k3, 16        lvx     vb0, pB0, k0        lvx     va0, pA0, k0        lvx     va1, pA0, k1        lvx     va2, pA0, k2        lvx     va3, pA0, k3        lvx     vb1, pB0, k1        lvx     vb2, pB0, k2        lvx     vb3, pB0, k3#endif/* Begin KLOOP */#if KB > 0      #if KB > 8		addi	k0, k0, 16      #endif	vmaddfp	vC00, vA0, vB0, vC33      #if KB > 8		addi	k1, k1, 16      #endif	vmaddfp	vC10, vA1, vB0, vC33      #if KB > 8		addi	k2, k2, 16      #endif	vmaddfp	vC20, vA2, vB0, vC33      #if KB > 8		addi	k3, k3, 16      #endif	vmaddfp	vC30, vA3, vB0, vC33      #if KB > 8		lvx vB0, pB0, k0      #endif	vmaddfp	vC01, vA0, vB1, vC33	vmaddfp	vC11, vA1, vB1, vC33                        dcbt    0, pfA, 0	vmaddfp	vC21, vA2, vB1, vC33                        addi    pfA, pfA, 64	vmaddfp	vC31, vA3, vB1, vC33      #if KB > 8		lvx vB1, pB0, k1      #endif	vmaddfp	vC02, vA0, vB2, vC33	vmaddfp	vC12, vA1, vB2, vC33	vmaddfp	vC22, vA2, vB2, vC33	vmaddfp	vC32, vA3, vB2, vC33      #if KB > 8		lvx vB2, pB0, k2      #endif	vmaddfp	vC03, vA0, vB3, vC33      #if KB > 8		lvx vA0, pA0, k0      #endif	vmaddfp	vC13, vA1, vB3, vC33      #if KB > 8		lvx vA1, pA0, k1      #endif	vmaddfp	vC23, vA2, vB3, vC33      #if KB > 8		lvx vA2, pA0, k2      #endif	vmaddfp	vC33, vA3, vB3, vC33      #if KB > 8		lvx vA3, pA0, k3      #endif      #if KB > 8		lvx vB3, pB0, k3      #endif#endif  /* end K=0 block */#if KB > 4   #if KB > 12		addi	k0, k0, 16   #endif	vmaddfp	vC00, va0, vb0, vC00   #if KB > 12		addi	k1, k1, 16   #endif	vmaddfp	vC10, va1, vb0, vC10   #if KB > 12		addi	k2, k2, 16   #endif	vmaddfp	vC20, va2, vb0, vC20   #if KB > 12		addi	k3, k3, 16   #endif	vmaddfp	vC30, va3, vb0, vC30   #if KB > 12		lvx vb0, pB0, k0   #endif	vmaddfp	vC01, va0, vb1, vC01	vmaddfp	vC11, va1, vb1, vC11	vmaddfp	vC21, va2, vb1, vC21	vmaddfp	vC31, va3, vb1, vC31   #if KB > 12		lvx vb1, pB0, k1   #endif	vmaddfp	vC02, va0, vb2, vC02	vmaddfp	vC12, va1, vb2, vC12	vmaddfp	vC22, va2, vb2, vC22	vmaddfp	vC32, va3, vb2, vC32   #if KB > 12		lvx vb2, pB0, k2   #endif	vmaddfp	vC03, va0, vb3, vC03   #if KB > 12		lvx va0, pA0, k0   #endif	vmaddfp	vC13, va1, vb3, vC13   #if KB > 12		lvx va1, pA0, k1   #endif	vmaddfp	vC23, va2, vb3, vC23   #if KB > 12		lvx va2, pA0, k2   #endif	vmaddfp	vC33, va3, vb3, vC33   #if KB > 12		lvx va3, pA0, k3   #endif   #if KB > 12		lvx vb3, pB0, k3   #endif#endif  /* end K=4 block */#if KB > 8   #if KB > 16		addi	k0, k0, 16   #endif	vmaddfp	vC00, vA0, vB0, vC00   #if KB > 16		addi	k1, k1, 16   #endif	vmaddfp	vC10, vA1, vB0, vC10   #if KB > 16		addi	k2, k2, 16   #endif	vmaddfp	vC20, vA2, vB0, vC20   #if KB > 16		addi	k3, k3, 16   #endif	vmaddfp	vC30, vA3, vB0, vC30   #if KB > 16		lvx vB0, pB0, k0   #endif	vmaddfp	vC01, vA0, vB1, vC01	vmaddfp	vC11, vA1, vB1, vC11	vmaddfp	vC21, vA2, vB1, vC21	vmaddfp	vC31, vA3, vB1, vC31   #if KB > 16		lvx vB1, pB0, k1   #endif	vmaddfp	vC02, vA0, vB2, vC02	vmaddfp	vC12, vA1, vB2, vC12	vmaddfp	vC22, vA2, vB2, vC22	vmaddfp	vC32, vA3, vB2, vC32   #if KB > 16		lvx vB2, pB0, k2   #endif	vmaddfp	vC03, vA0, vB3, vC03   #if KB > 16		lvx vA0, pA0, k0   #endif	vmaddfp	vC13, vA1, vB3, vC13   #if KB > 16		lvx vA1, pA0, k1   #endif	vmaddfp	vC23, vA2, vB3, vC23   #if KB > 16		lvx vA2, pA0, k2   #endif	vmaddfp	vC33, vA3, vB3, vC33   #if KB > 16		lvx vA3, pA0, k3   #endif   #if KB > 16		lvx vB3, pB0, k3   #endif#endif  /* end K=8 block */#if KB > 12   #if KB > 20		addi	k0, k0, 16   #endif	vmaddfp	vC00, va0, vb0, vC00   #if KB > 20		addi	k1, k1, 16

⌨️ 快捷键说明

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