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 + -
显示快捷键?