Add files via upload
authorwjc404 <52632443+wjc404@users.noreply.github.com>
Sat, 27 Jul 2019 23:39:09 +0000 (07:39 +0800)
committerGitHub <noreply@github.com>
Sat, 27 Jul 2019 23:39:09 +0000 (07:39 +0800)
kernel/x86_64/dgemm_kernel_4x8_haswell.S

index 082e62a..19e32ef 100644 (file)
@@ -107,6 +107,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 #define        A_PR1   512\r
 #define        B_PR1   160\r
+#define BROADCASTKERNEL\r
 \r
 /*******************************************************************************************\r
 * Macro definitions\r
@@ -133,7 +134,11 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        prefetcht0      A_PR1(AO)\r
        vmovups         -12 * SIZE(BO), %ymm1\r
        prefetcht0      B_PR1(BO)\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+# else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+# endif\r
        prefetcht0      B_PR1+64(BO)\r
        vmovups          -8 * SIZE(BO), %ymm2\r
        prefetcht0      B_PR1+128(BO)\r
@@ -143,17 +148,29 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vmulpd          %ymm0 ,%ymm2  , %ymm8\r
        vmulpd          %ymm0 ,%ymm3  , %ymm12\r
        prefetcht0      B_PR1+256(BO)\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm5\r
        vmulpd          %ymm0 ,%ymm2  , %ymm9\r
        vmulpd          %ymm0 ,%ymm3  , %ymm13\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+# else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+# endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm6\r
        vmulpd          %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $ 12*SIZE, BO\r
        vmulpd          %ymm0 ,%ymm3  , %ymm14\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
        vmulpd          %ymm0 ,%ymm2  , %ymm11\r
@@ -165,23 +182,38 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x12_M1\r
        prefetcht0      A_PR1(AO)\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+# else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+# endif\r
        prefetcht0      B_PR1(BO)\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        prefetcht0      B_PR1+64(BO)\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
        prefetcht0      B_PR1+128(BO)\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm12\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm13\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+# else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
-\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm14\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
@@ -192,21 +224,37 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .endm\r
 \r
 .macro KERNEL4x12_M2\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+# else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm12\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm13\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+# else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $ 8*SIZE, AO\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm14\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups           0 * SIZE(BO), %ymm1\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
@@ -218,21 +266,37 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 \r
 .macro KERNEL4x12_E\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+# else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm12\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm13\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+# else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $ 8*SIZE, AO\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm14\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm15\r
@@ -241,23 +305,39 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x12_SUB\r
        vmovups         -12 * SIZE(BO), %ymm1\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+# else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vmovups          -8 * SIZE(BO), %ymm2\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
        vmovups          -4 * SIZE(BO), %ymm3\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm12\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
        addq            $ 12*SIZE, BO\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm13\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+# else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
        addq            $ 4*SIZE, AO\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm14\r
+# if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+# else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+# endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
        vfmadd231pd     %ymm0 ,%ymm3  , %ymm15\r
@@ -289,27 +369,53 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 #if B_PR1 > 96\r
         prefetcht0      192 + BUFFER1\r
 #endif\r
+\r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm6, %ymm4 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm7, %ymm5 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm6, %ymm4 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm7, %ymm5 , %ymm3\r
+#else\r
        vpermilpd $ 0x05 , %ymm5, %ymm5\r
        vpermilpd $ 0x05 , %ymm7, %ymm7\r
+#endif\r
+\r
 #if B_PR1 > 160\r
         prefetcht0      256 + BUFFER1\r
 #endif\r
+\r
+#if defined BROADCASTKERNEL\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
        vblendpd $ 0x0a, %ymm5, %ymm4, %ymm0\r
        vblendpd $ 0x05, %ymm5, %ymm4, %ymm1\r
        vblendpd $ 0x0a, %ymm7, %ymm6, %ymm2\r
        vblendpd $ 0x05, %ymm7, %ymm6, %ymm3\r
+#endif\r
+\r
 #if B_PR1 > 224\r
         prefetcht0      320 + BUFFER1\r
 #endif\r
+\r
+#ifndef BROADCASTKERNEL\r
        vperm2f128 $ 0x01 , %ymm2, %ymm2 , %ymm2\r
        vperm2f128 $ 0x01 , %ymm3, %ymm3 , %ymm3\r
+#endif\r
+\r
 #if B_PR1 > 288\r
         prefetcht0      384 + BUFFER1\r
 #endif\r
+\r
+#ifndef BROADCASTKERNEL\r
        vblendpd $ 0x03, %ymm0, %ymm2 , %ymm4\r
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
+#endif\r
+\r
 #if B_PR1 > 352\r
         prefetcht0      448 + BUFFER1\r
 #endif\r
@@ -338,11 +444,21 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        prefetcht1      56(%rax)\r
        prefetcht1      56(%rax,LDC)\r
 \r
-       vpermilpd $ 0x05 , %ymm9 , %ymm9\r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm10, %ymm8 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm11, %ymm9 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm10, %ymm8 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm11, %ymm9 , %ymm3\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
+       vpermilpd $ 0x05 , %ymm9, %ymm9\r
        vpermilpd $ 0x05 , %ymm11, %ymm11\r
 \r
-       vblendpd $ 0x0a, %ymm9 , %ymm8 , %ymm0\r
-       vblendpd $ 0x05, %ymm9 , %ymm8 , %ymm1\r
+       vblendpd $ 0x0a, %ymm9, %ymm8, %ymm0\r
+       vblendpd $ 0x05, %ymm9, %ymm8, %ymm1\r
        vblendpd $ 0x0a, %ymm11, %ymm10, %ymm2\r
        vblendpd $ 0x05, %ymm11, %ymm10, %ymm3\r
 \r
@@ -353,7 +469,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
-\r
+#endif\r
 \r
        leaq    (%rax, LDC, 2), %rax\r
        leaq    (%rax, LDC, 2), %rbp\r
@@ -377,6 +493,16 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        prefetcht1      56(%rbp)\r
        prefetcht1      56(%rbp,LDC)\r
 \r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm14, %ymm12 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm15, %ymm13 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm14, %ymm12 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm15, %ymm13 , %ymm3\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
        vpermilpd $ 0x05 , %ymm13, %ymm13\r
        vpermilpd $ 0x05 , %ymm15, %ymm15\r
 \r
@@ -392,7 +518,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
-\r
+#endif\r
 \r
        leaq    (%rax, LDC, 4), %rax\r
        leaq    (%rbp, LDC, 4), %rbp\r
@@ -693,19 +819,35 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x8_I\r
        vmovups         -12 * SIZE(BO), %ymm1\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        vmovups          -8 * SIZE(BO), %ymm2\r
        vmulpd          %ymm0 ,%ymm1  , %ymm4\r
        vmulpd          %ymm0 ,%ymm2  , %ymm8\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm5\r
        vmulpd          %ymm0 ,%ymm2  , %ymm9\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm6\r
        vmulpd          %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $  8*SIZE, BO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
        vmulpd          %ymm0 ,%ymm2  , %ymm11\r
@@ -715,19 +857,34 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x8_M1\r
        prefetcht0      A_PR1(AO)\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        prefetcht0      B_PR1(BO)\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        prefetcht0      B_PR1+64(BO)\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
-\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
@@ -736,18 +893,34 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .endm\r
 \r
 .macro KERNEL4x8_M2\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $ 8*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups          -4 * SIZE(BO), %ymm1\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
@@ -757,18 +930,34 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 \r
 .macro KERNEL4x8_E\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
 \r
        addq            $ 8*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
        addq            $  8*SIZE, BO\r
@@ -776,19 +965,35 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x8_SUB\r
        vmovups         -12 * SIZE(BO), %ymm1\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
        vmovups          -8 * SIZE(BO), %ymm2\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm8\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm9\r
        addq            $  8*SIZE, BO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm10\r
        addq            $ 4*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vfmadd231pd     %ymm0 ,%ymm2  , %ymm11\r
 \r
@@ -809,6 +1014,16 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vmulpd  %ymm0 , %ymm10, %ymm10\r
        vmulpd  %ymm0 , %ymm11, %ymm11\r
 \r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm6, %ymm4 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm7, %ymm5 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm6, %ymm4 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm7, %ymm5 , %ymm3\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
        vpermilpd $ 0x05 , %ymm5, %ymm5\r
        vpermilpd $ 0x05 , %ymm7, %ymm7\r
 \r
@@ -824,6 +1039,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
+#endif\r
 \r
         leaq    (CO1, LDC, 2), %rax     \r
        \r
@@ -847,6 +1063,16 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        prefetcht0      56(%rax)\r
        prefetcht0      56(%rax,LDC)\r
 \r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm10, %ymm8 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm11, %ymm9 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm10, %ymm8 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm11, %ymm9 , %ymm3\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
        vpermilpd $ 0x05 , %ymm9 , %ymm9\r
        vpermilpd $ 0x05 , %ymm11, %ymm11\r
 \r
@@ -862,7 +1088,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
-\r
+#endif\r
 \r
        leaq    (%rax, LDC, 2), %rax\r
        leaq    (%rax, LDC, 2), %rbp\r
@@ -1088,15 +1314,31 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .macro KERNEL4x4_I\r
        prefetcht0      A_PR1(AO)\r
        vmovups         -12 * SIZE(BO), %ymm1\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm4\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm5\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm6\r
 \r
        addq            $ 4*SIZE, BO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vmulpd          %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
 \r
@@ -1104,29 +1346,60 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 .macro KERNEL4x4_M1\r
        prefetcht0      A_PR1(AO)\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
-\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -13 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups         -12 * SIZE(BO), %ymm1\r
 \r
 .endm\r
 \r
 .macro KERNEL4x4_M2\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
 \r
        addq            $ 8*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        vmovups          -8 * SIZE(BO), %ymm1\r
        addq            $ 8*SIZE, BO\r
@@ -1134,30 +1407,62 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 \r
 \r
 .macro KERNEL4x4_E\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -12 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -12 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -11 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -10 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
 \r
        addq            $ 8*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
        addq            $ 4*SIZE, BO\r
 .endm\r
 \r
 .macro KERNEL4x4_SUB\r
        vmovups         -12 * SIZE(BO), %ymm1\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -16 * SIZE(AO), %ymm0\r
+#else\r
        vmovups         -16 * SIZE(AO), %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm4\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -15 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm5\r
        addq            $ 4*SIZE, BO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -14 * SIZE(AO), %ymm0\r
+#else\r
        vpermpd         $ 0x1b, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm6\r
        addq            $ 4*SIZE, AO\r
+#if defined BROADCASTKERNEL\r
+        vbroadcastsd    -17 * SIZE(AO), %ymm0\r
+#else\r
        vpermilpd       $ 0x05, %ymm0  , %ymm0\r
+#endif\r
        vfmadd231pd     %ymm0 ,%ymm1  , %ymm7\r
 \r
 .endm\r
@@ -1171,6 +1476,16 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vmulpd  %ymm0 , %ymm5 , %ymm5\r
        vmulpd  %ymm0 , %ymm6 , %ymm6\r
 \r
+#if defined BROADCASTKERNEL\r
+        vperm2f128 $ 0x20 , %ymm6, %ymm4 , %ymm0\r
+        vperm2f128 $ 0x20 , %ymm7, %ymm5 , %ymm1\r
+        vperm2f128 $ 0x31 , %ymm6, %ymm4 , %ymm2\r
+        vperm2f128 $ 0x31 , %ymm7, %ymm5 , %ymm3\r
+        vunpcklpd %ymm1, %ymm0, %ymm4\r
+        vunpckhpd %ymm1, %ymm0, %ymm5\r
+        vunpcklpd %ymm3, %ymm2, %ymm6\r
+        vunpckhpd %ymm3, %ymm2, %ymm7\r
+#else\r
        vpermilpd $ 0x05 , %ymm5, %ymm5\r
        vpermilpd $ 0x05 , %ymm7, %ymm7\r
 \r
@@ -1186,6 +1501,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        vblendpd $ 0x03, %ymm1, %ymm3 , %ymm5\r
        vblendpd $ 0x03, %ymm2, %ymm0 , %ymm6\r
        vblendpd $ 0x03, %ymm3, %ymm1 , %ymm7\r
+#endif\r
 \r
         leaq    (CO1, LDC, 2), %rax     \r
        \r