added trsm_kernel_RT_4x4_bulldozer.S
authorwernsaar <wernsaar@googlemail.com>
Sat, 27 Apr 2013 14:48:48 +0000 (16:48 +0200)
committerwernsaar <wernsaar@googlemail.com>
Sat, 27 Apr 2013 14:48:48 +0000 (16:48 +0200)
kernel/x86_64/KERNEL.BULLDOZER
kernel/x86_64/trsm_kernel_RT_4x4_bulldozer.S [new file with mode: 0644]

index e0b8a71..a41c94a 100644 (file)
@@ -46,7 +46,7 @@ STRSMKERNEL_RT        =  trsm_kernel_RT_8x4_sse.S
 DTRSMKERNEL_LN =  trsm_kernel_LN_4x4_barcelona.S
 DTRSMKERNEL_LT =  trsm_kernel_LT_4x4_bulldozer.S
 DTRSMKERNEL_RN =  trsm_kernel_LT_4x4_bulldozer.S
-DTRSMKERNEL_RT =  trsm_kernel_RT_4x4_barcelona.S
+DTRSMKERNEL_RT =  trsm_kernel_RT_4x4_bulldozer.S
 
 CTRSMKERNEL_LN =  ztrsm_kernel_LN_4x2_sse.S
 CTRSMKERNEL_LT =  ztrsm_kernel_LT_4x2_sse.S
diff --git a/kernel/x86_64/trsm_kernel_RT_4x4_bulldozer.S b/kernel/x86_64/trsm_kernel_RT_4x4_bulldozer.S
new file mode 100644 (file)
index 0000000..e188085
--- /dev/null
@@ -0,0 +1,3292 @@
+/*********************************************************************/
+/* Copyright 2009, 2010 The University of Texas at Austin.           */
+/* All rights reserved.                                              */
+/*                                                                   */
+/* 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.                              */
+/*                                                                   */
+/*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
+/*    AUSTIN  ``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 UNIVERSITY  OF TEXAS AT    */
+/*    AUSTIN OR 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.                                    */
+/*                                                                   */
+/* The views and conclusions contained in the software and           */
+/* documentation are those of the authors and should not be          */
+/* interpreted as representing official policies, either expressed   */
+/* or implied, of The University of Texas at Austin.                 */
+/*********************************************************************/
+
+#define ASSEMBLER
+#include "common.h"
+#define OLD_M  %rdi
+#define OLD_N  %rsi
+#define M      %r13
+#define N      %r14
+#define K      %rdx
+
+#define A      %rcx
+#define B      %r8
+#define C      %r9
+#define LDC    %r10
+       
+#define I      %r11
+#define AO     %rdi
+#define BO     %rsi
+#define        CO1     %r15
+#define CO2    %r12
+#define BB     %rbp
+#define        J       %rbx
+
+#ifndef WINDOWS_ABI
+
+#define STACKSIZE 96
+
+#define OFFSET  48(%rsp)
+#define AORIG   56(%rsp)
+#define KK      64(%rsp)
+#define KKK     72(%rsp)
+
+#else
+
+#define STACKSIZE 256
+
+#define OLD_A          40 + STACKSIZE(%rsp)
+#define OLD_B          48 + STACKSIZE(%rsp)
+#define OLD_C          56 + STACKSIZE(%rsp)
+#define OLD_LDC                64 + STACKSIZE(%rsp)
+#define OLD_OFFSET     72 + STACKSIZE(%rsp)
+
+#define OFFSET 224(%rsp)
+#define AORIG  232(%rsp)
+#define KK     240(%rsp)
+#define KKK    248(%rsp)
+
+#endif
+
+
+#define movlpd movsd
+#define movapd movups
+#define movupd movups
+
+#define A_PR1 224
+#define B_PR1 224
+
+#define KERNEL1(xx) \
+        vmovups         -14 * SIZE(AO, %rax, 4),%xmm2 ;\
+        vfmaddpd                %xmm8,%xmm6,%xmm7,%xmm8 ;\
+        vmovddup        -14 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm12,%xmm2,%xmm7,%xmm12 ;\
+        vmovddup        -13 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm9,%xmm6,%xmm3,%xmm9 ;\
+        vmovddup        -12 * SIZE(BO, %rax, 4), %xmm1 ;\
+        vfmaddpd                %xmm13,%xmm2,%xmm3,%xmm13 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup        -11 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+        vmovups         -12 * SIZE(AO, %rax, 4),%xmm0 ;\
+        vfmaddpd                %xmm10,%xmm6,%xmm5,%xmm10 ;\
+        vfmaddpd                %xmm11,%xmm6,%xmm4,%xmm11 ;\
+
+#define KERNEL2(xx) \
+        vmovups         -10 * SIZE(AO, %rax, 4), %xmm2 ;\
+        vfmaddpd                %xmm8, %xmm0, %xmm1,%xmm8 ;\
+        vmovups          -8 * SIZE(AO, %rax, 4),%xmm6 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vmovddup        -10 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm9, %xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         -9 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm10,%xmm0, %xmm5,%xmm10 ;\
+        vmovddup         -8 * SIZE(BO, %rax, 4), %xmm7 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup         -7 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm11,%xmm0, %xmm4,%xmm11 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+
+#define KERNEL3(xx) \
+        vmovups          -6 * SIZE(AO, %rax, 4),%xmm2 ;\
+        vfmaddpd                %xmm8, %xmm6, %xmm7, %xmm8 ;\
+        vmovddup         -6 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm7,%xmm12 ;\
+        vmovddup         -5 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm9, %xmm6, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         -4 * SIZE(BO, %rax, 4), %xmm1 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup         -3 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+        vmovups          -4 * SIZE(AO, %rax, 4),%xmm0 ;\
+        vfmaddpd                %xmm10,%xmm6, %xmm5,%xmm10 ;\
+        vfmaddpd                %xmm11,%xmm6, %xmm4, %xmm11 ;\
+
+#define KERNEL4(xx) \
+        vmovups          -2 * SIZE(AO, %rax, 4), %xmm2 ;\
+        vfmaddpd                %xmm8,%xmm0, %xmm1,%xmm8 ;\
+        vmovups                   (AO, %rax, 4), %xmm6 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm1 ,%xmm12;\
+        vmovddup         -2 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm9,%xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         -1 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm10,%xmm0, %xmm5,%xmm10 ;\
+        vmovddup                  (BO, %rax, 4), %xmm7 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup          1 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm11,%xmm0, %xmm4,%xmm11 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+
+#define KERNEL5(xx) \
+        vmovups           2 * SIZE(AO, %rax, 4),%xmm2 ;\
+        vfmaddpd                %xmm8,%xmm6, %xmm7,%xmm8 ;\
+        vmovddup          2 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm7,%xmm12 ;\
+        vmovddup          3 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm9,%xmm6, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup          4 * SIZE(BO, %rax, 4), %xmm1 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup          5 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+        vmovups           4 * SIZE(AO, %rax, 4),%xmm0 ;\
+        vfmaddpd                %xmm10,%xmm6, %xmm5,%xmm10 ;\
+        vfmaddpd                %xmm11,%xmm6, %xmm4,%xmm11 ;\
+
+#define KERNEL6(xx) \
+        vmovups           6 * SIZE(AO, %rax, 4), %xmm2 ;\
+        vfmaddpd                %xmm8,%xmm0, %xmm1,%xmm8 ;\
+        vmovups           8 * SIZE(AO, %rax, 4), %xmm6 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vmovddup          6 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm9,%xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup          7 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm10,%xmm0, %xmm5,%xmm10 ;\
+        vmovddup          8 * SIZE(BO, %rax, 4), %xmm7 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup          9 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm11,%xmm0, %xmm4,%xmm11 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+
+#define KERNEL7(xx) \
+        vmovups          10 * SIZE(AO, %rax, 4),%xmm2 ;\
+        vfmaddpd                %xmm8,%xmm6, %xmm7,%xmm8 ;\
+        vmovddup         10 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm7,%xmm12 ;\
+        vmovddup         11 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm9,%xmm6, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         12 * SIZE(BO, %rax, 4), %xmm1 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup         13 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+        vmovups          12 * SIZE(AO, %rax, 4), %xmm0 ;\
+        vfmaddpd                %xmm10,%xmm6, %xmm5,%xmm10 ;\
+        vfmaddpd                %xmm11,%xmm6, %xmm4,%xmm11 ;\
+
+#define KERNEL8(xx) \
+        vmovups          14 * SIZE(AO, %rax, 4), %xmm2 ;\
+        vfmaddpd                %xmm8,%xmm0, %xmm1,%xmm8 ;\
+        vmovups          16 * SIZE(AO, %rax, 4),%xmm6 ;\
+        vfmaddpd                %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vmovddup         14 * SIZE(BO, %rax, 4), %xmm5 ;\
+        vfmaddpd                %xmm9,%xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd                %xmm13, %xmm2, %xmm3,%xmm13 ;\
+        vmovddup         15 * SIZE(BO, %rax, 4), %xmm4 ;\
+        vfmaddpd                %xmm10,%xmm0, %xmm5,%xmm10 ;\
+        vmovddup         16 * SIZE(BO, %rax, 4), %xmm7 ;\
+        vfmaddpd                %xmm14,%xmm2, %xmm5,%xmm14 ;\
+        vmovddup         17 * SIZE(BO, %rax, 4), %xmm3 ;\
+        vfmaddpd                %xmm11,%xmm0, %xmm4,%xmm11 ;\
+        vfmaddpd                %xmm15,%xmm2, %xmm4,%xmm15 ;\
+
+#define KERNEL_SUB1(xx) \
+        vmovups         -16 * SIZE(AO),%xmm0 ;\
+        vmovups         -14 * SIZE(AO),%xmm2 ;\
+        vmovddup        -16 * SIZE(BO), %xmm1 ;\
+        vmovddup        -15 * SIZE(BO), %xmm3 ;\
+        vfmaddpd   %xmm8, %xmm0, %xmm1,%xmm8 ;\
+        vfmaddpd   %xmm9, %xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd   %xmm12, %xmm2, %xmm1,%xmm12 ;\
+        vfmaddpd   %xmm13, %xmm2, %xmm3,%xmm13 ;\
+        vmovddup        -14 * SIZE(BO), %xmm1 ;\
+        vmovddup        -13 * SIZE(BO), %xmm3 ;\
+        vfmaddpd   %xmm10, %xmm0, %xmm1,%xmm10 ;\
+        vfmaddpd   %xmm11, %xmm0, %xmm3,%xmm11 ;\
+        vfmaddpd   %xmm14, %xmm2, %xmm1,%xmm14 ;\
+        vfmaddpd   %xmm15, %xmm2, %xmm3,%xmm15 ;\
+
+#define KERNEL_SUB2(xx) \
+        vmovups         -12 * SIZE(AO), %xmm0 ;\
+        vmovups         -10 * SIZE(AO), %xmm2 ;\
+        vmovddup        -12 * SIZE(BO), %xmm1 ;\
+        vmovddup        -11 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm8, %xmm0, %xmm1,%xmm8 ;\
+        vfmaddpd %xmm9, %xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vfmaddpd %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup        -10 * SIZE(BO), %xmm1 ;\
+        vmovddup         -9 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm10,%xmm0, %xmm1,%xmm10 ;\
+        vfmaddpd %xmm11,%xmm0, %xmm3,%xmm11 ;\
+        vfmaddpd %xmm14,%xmm2, %xmm1,%xmm14 ;\
+        vfmaddpd %xmm15,%xmm2, %xmm3,%xmm15 ;\
+
+#define KERNEL_SUB3(xx) \
+        vmovups          -8 * SIZE(AO),%xmm0 ;\
+        vmovups          -6 * SIZE(AO),%xmm2 ;\
+        vmovddup         -8 * SIZE(BO), %xmm1 ;\
+        vmovddup         -7 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm8, %xmm0, %xmm1,%xmm8 ;\
+        vfmaddpd %xmm9, %xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vfmaddpd %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         -6 * SIZE(BO), %xmm1 ;\
+        vmovddup         -5 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm10,%xmm0, %xmm1,%xmm10 ;\
+        vfmaddpd %xmm11,%xmm0, %xmm3,%xmm11 ;\
+        vfmaddpd %xmm14,%xmm2, %xmm1,%xmm14 ;\
+        vfmaddpd %xmm15,%xmm2, %xmm3,%xmm15 ;\
+
+#define KERNEL_SUB4(xx) \
+        vmovups          -4 * SIZE(AO), %xmm0 ;\
+        vmovups          -2 * SIZE(AO), %xmm2 ;\
+        vmovddup         -4 * SIZE(BO), %xmm1 ;\
+        vmovddup         -3 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm8, %xmm0, %xmm1,%xmm8 ;\
+        vfmaddpd %xmm9, %xmm0, %xmm3,%xmm9 ;\
+        vfmaddpd %xmm12,%xmm2, %xmm1,%xmm12 ;\
+        vfmaddpd %xmm13,%xmm2, %xmm3,%xmm13 ;\
+        vmovddup         -2 * SIZE(BO), %xmm1 ;\
+        vmovddup         -1 * SIZE(BO), %xmm3 ;\
+        vfmaddpd %xmm10,%xmm0, %xmm1,%xmm10 ;\
+        vfmaddpd %xmm11,%xmm0, %xmm3,%xmm11 ;\
+        vfmaddpd %xmm14,%xmm2, %xmm1,%xmm14 ;\
+        vfmaddpd %xmm15,%xmm2, %xmm3,%xmm15 ;\
+        vmovups                   (AO), %xmm0 ;\
+        vmovddup                  (BO), %xmm1 ;\
+        vmovddup          1 * SIZE(BO), %xmm3 ;\
+        vmovaps %xmm0, %xmm2
+
+
+
+       PROLOGUE
+       PROFCODE
+       
+       subq    $STACKSIZE, %rsp
+       movq    %rbx,   (%rsp)
+       movq    %rbp,  8(%rsp)
+       movq    %r12, 16(%rsp)
+       movq    %r13, 24(%rsp)
+       movq    %r14, 32(%rsp)
+       movq    %r15, 40(%rsp)
+
+#ifdef WINDOWS_ABI
+       movq    %rdi,    48(%rsp)
+       movq    %rsi,    56(%rsp)
+       movups  %xmm6,   64(%rsp)
+       movups  %xmm7,   80(%rsp)
+       movups  %xmm8,   96(%rsp)
+       movups  %xmm9,  112(%rsp)
+       movups  %xmm10, 128(%rsp)
+       movups  %xmm11, 144(%rsp)
+       movups  %xmm12, 160(%rsp)
+       movups  %xmm13, 176(%rsp)
+       movups  %xmm14, 192(%rsp)
+       movups  %xmm15, 208(%rsp)
+
+       movq    ARG1,      OLD_M
+       movq    ARG2,      OLD_N
+       movq    ARG3,      K
+       movq    OLD_A,     A
+       movq    OLD_B,     B
+       movq    OLD_C,     C
+       movq    OLD_LDC,   LDC
+       movsd   OLD_OFFSET, %xmm12
+#else
+       movq    STACKSIZE +  8(%rsp), LDC
+       movsd   STACKSIZE + 16(%rsp), %xmm12
+#endif
+
+       movq    OLD_M, M
+       movq    OLD_N, N
+
+       subq    $-16 * SIZE, A
+       subq    $-16 * SIZE, B
+
+       movsd   %xmm12, OFFSET
+       movsd   %xmm12, KK
+
+       leaq    (, LDC, SIZE), LDC
+
+#ifdef LN
+       leaq    (, M, SIZE), %rax
+       addq    %rax, C
+       imulq   K, %rax
+       addq    %rax, A
+#endif
+
+#ifdef RT
+       leaq    (, N, SIZE), %rax
+       imulq   K, %rax
+       addq    %rax, B
+       movq    N, %rax
+       imulq   LDC, %rax
+       addq    %rax, C
+#endif
+
+#ifdef RN
+       negq    KK
+#endif 
+
+#ifdef RT
+       movq    N, %rax
+       subq    OFFSET, %rax
+       movq    %rax, KK
+#endif
+
+       testq   $1, N
+       je      .L40
+
+#if defined(LT) || defined(RN)
+       movq    A, AO
+#else
+       movq    A, AORIG
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       subq    %rax, B
+
+       subq    LDC, C
+#endif
+
+       movq    C, CO1                  # coffset1 = c
+#ifndef RT
+       addq    LDC, C
+#endif
+
+#ifdef LN
+       movq    OFFSET, %rax
+       addq    M, %rax
+       movq    %rax, KK
+#endif 
+
+#ifdef LT
+       movq    OFFSET, %rax
+       movq    %rax, KK
+#endif
+
+       movq    M,  I
+       sarq    $2, I   # i = (m >> 2)
+       jle     .L100
+       ALIGN_4
+
+.L91:
+#ifdef LN
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (BO, %rax, SIZE), BO
+#endif 
+
+       movapd  -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movapd   -8 * SIZE(AO), %xmm2
+       pxor    %xmm9, %xmm9
+       movddup -16 * SIZE(BO), %xmm1
+       pxor    %xmm10, %xmm10
+       movddup -15 * SIZE(BO), %xmm5
+       pxor    %xmm11, %xmm11
+       movddup -14 * SIZE(BO), %xmm3
+
+#ifndef LN
+       prefetchw      3 * SIZE(CO1)
+#else
+       prefetchw     -8 * SIZE(CO1)
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       NOBRANCH
+       je      .L96
+       ALIGN_4
+
+.L92:
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd  -12 * SIZE(AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm9
+       movddup -12 * SIZE(BO, %rax, 1), %xmm1
+       mulpd   %xmm5, %xmm0
+       mulpd   -10 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm0, %xmm10
+       movapd    (AO, %rax, 4), %xmm0
+       addpd   %xmm5, %xmm11
+       movddup -13 * SIZE(BO, %rax, 1), %xmm5
+       mulpd   %xmm3, %xmm2
+       mulpd    -6 * SIZE(AO, %rax, 4), %xmm3
+       addpd   %xmm2, %xmm8
+       movapd   -4 * SIZE(AO, %rax, 4), %xmm2
+       addpd   %xmm3, %xmm9
+       movddup -10 * SIZE(BO, %rax, 1), %xmm3
+       mulpd   %xmm5, %xmm2
+       mulpd    -2 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm10
+       movapd    8 * SIZE(AO, %rax, 4), %xmm2
+       addpd   %xmm5, %xmm11
+       movddup -11 * SIZE(BO, %rax, 1), %xmm5
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L92
+       ALIGN_4
+
+.L96:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L99
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       ALIGN_4
+
+.L97:
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd  -12 * SIZE(AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm9
+       movddup -15 * SIZE(BO, %rax, 1), %xmm1
+
+       addq    $SIZE, %rax
+       jl      .L97
+       ALIGN_4
+.L99:
+       addpd   %xmm10, %xmm8
+       addpd   %xmm11, %xmm9
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $4, %rax
+#else
+       subq    $1, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 4), AO
+       leaq    (B,  %rax, 1), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  -16 * SIZE(BO), %xmm10
+       movapd  -14 * SIZE(BO), %xmm11
+
+       subpd   %xmm8,  %xmm10
+       subpd   %xmm9,  %xmm11
+#else
+       movapd  -16 * SIZE(AO), %xmm10
+       movapd  -14 * SIZE(AO), %xmm11
+
+       subpd   %xmm8, %xmm10
+       subpd   %xmm9, %xmm11
+#endif
+
+#ifdef LN
+       movapd  %xmm10, %xmm8
+        unpckhpd %xmm8, %xmm8
+
+       movapd  %xmm11, %xmm9
+        unpckhpd %xmm9, %xmm9
+
+       movsd    -1 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm9
+
+       movsd    -2 * SIZE(AO), %xmm13
+       mulsd    %xmm9, %xmm13
+       subsd    %xmm13, %xmm11
+       movsd    -3 * SIZE(AO), %xmm14
+       mulsd    %xmm9, %xmm14
+       subsd    %xmm14, %xmm8
+       movsd    -4 * SIZE(AO), %xmm15
+       mulsd    %xmm9, %xmm15
+       subsd    %xmm15, %xmm10
+
+       movsd    -6 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm11
+
+       movsd    -7 * SIZE(AO), %xmm13
+       mulsd    %xmm11, %xmm13
+       subsd    %xmm13, %xmm8
+       movsd    -8 * SIZE(AO), %xmm14
+       mulsd    %xmm11, %xmm14
+       subsd    %xmm14, %xmm10
+
+       movsd   -11 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm8
+
+       movsd   -12 * SIZE(AO), %xmm13
+       mulsd    %xmm8, %xmm13
+       subsd    %xmm13, %xmm10
+
+       movsd   -16 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm10
+
+       unpcklpd %xmm8, %xmm10
+       unpcklpd %xmm9, %xmm11
+#endif
+
+#ifdef LT
+       movapd  %xmm10, %xmm8
+        unpckhpd %xmm8, %xmm8
+
+       movapd  %xmm11, %xmm9
+        unpckhpd %xmm9, %xmm9
+
+       movsd   -16 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm10
+
+       movsd   -15 * SIZE(AO), %xmm13
+       mulsd    %xmm10, %xmm13
+       subsd    %xmm13, %xmm8
+       movsd   -14 * SIZE(AO), %xmm14
+       mulsd    %xmm10, %xmm14
+       subsd    %xmm14, %xmm11
+       movsd   -13 * SIZE(AO), %xmm15
+       mulsd    %xmm10, %xmm15
+       subsd    %xmm15, %xmm9
+
+       movsd   -11 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm8
+
+       movsd   -10 * SIZE(AO), %xmm13
+       mulsd    %xmm8, %xmm13
+       subsd    %xmm13, %xmm11
+       movsd    -9 * SIZE(AO), %xmm14
+       mulsd    %xmm8, %xmm14
+       subsd    %xmm14, %xmm9
+
+       movsd    -6 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm11
+
+       movsd    -5 * SIZE(AO), %xmm13
+       mulsd    %xmm11, %xmm13
+       subsd    %xmm13, %xmm9
+
+       movsd    -1 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm9
+
+       unpcklpd %xmm8, %xmm10
+       unpcklpd %xmm9, %xmm11
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm10
+       mulpd    %xmm8, %xmm11
+#endif
+
+#ifdef RT
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm10
+       mulpd    %xmm8, %xmm11
+#endif
+
+#ifdef LN
+       subq    $4 * SIZE, CO1
+#endif
+
+       movlpd  %xmm10,  0 * SIZE(CO1)
+       movhpd  %xmm10,  1 * SIZE(CO1)
+       movlpd  %xmm11,  2 * SIZE(CO1)
+       movhpd  %xmm11,  3 * SIZE(CO1)
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm10, -16 * SIZE(BO)
+       movaps  %xmm11, -14 * SIZE(BO)
+#else
+       movaps  %xmm10, -16 * SIZE(AO)
+       movaps  %xmm11, -14 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $4 * SIZE, CO1
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       addq    %rax, BO
+#endif
+
+#ifdef LN
+       subq    $4, KK
+#endif
+
+#ifdef LT
+       addq    $4, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+
+       decq    I                       # i --
+       jg      .L91
+       ALIGN_4 
+
+.L100:
+       testq   $2, M
+       je      .L110
+
+#ifdef LN 
+      movq     K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (BO, %rax, SIZE), BO
+#endif 
+
+       movddup -16 * SIZE(BO), %xmm0
+       pxor    %xmm8, %xmm8
+       movddup -15 * SIZE(BO), %xmm1
+       pxor    %xmm9, %xmm9
+       movddup -14 * SIZE(BO), %xmm2
+       pxor    %xmm10, %xmm10
+       movddup -13 * SIZE(BO), %xmm3
+       pxor    %xmm11, %xmm11
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       NOBRANCH
+       je      .L106
+       ALIGN_4
+
+.L102:
+       mulpd   -16 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm0, %xmm8
+       movddup -12 * SIZE(BO, %rax, 1), %xmm0
+
+       mulpd   -14 * SIZE(AO, %rax, 2), %xmm1
+       addpd   %xmm1, %xmm9
+       movddup -11 * SIZE(BO, %rax, 1), %xmm1
+
+       mulpd   -12 * SIZE(AO, %rax, 2), %xmm2
+       addpd   %xmm2, %xmm10
+       movddup -10 * SIZE(BO, %rax, 1), %xmm2
+
+       mulpd   -10 * SIZE(AO, %rax, 2), %xmm3
+       addpd   %xmm3, %xmm11
+       movddup  -9 * SIZE(BO, %rax, 1), %xmm3
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L102
+       ALIGN_4
+
+.L106:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L109
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       ALIGN_4
+
+.L107:
+       movddup -16 * SIZE(BO, %rax, 1), %xmm0
+       mulpd   -16 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm0, %xmm8
+
+       addq    $SIZE, %rax
+       jl      .L107
+       ALIGN_4
+
+.L109:
+       addpd   %xmm9, %xmm8
+       addpd   %xmm11, %xmm10
+       addpd   %xmm10, %xmm8
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $2, %rax
+#else
+       subq    $1, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 2), AO
+       leaq    (B,  %rax, 1), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  -16 * SIZE(BO), %xmm10
+       subpd   %xmm8,  %xmm10
+#else
+       movapd  -16 * SIZE(AO), %xmm10
+       subpd   %xmm8, %xmm10
+#endif
+
+#ifdef LN
+       movapd  %xmm10, %xmm8
+        unpckhpd %xmm8, %xmm8
+
+       movsd   -13 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm8
+
+       movsd   -14 * SIZE(AO), %xmm13
+       mulsd    %xmm8, %xmm13
+       subsd    %xmm13, %xmm10
+
+       movsd   -16 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm10
+
+       unpcklpd %xmm8, %xmm10
+#endif
+
+#ifdef LT
+       movapd  %xmm10, %xmm8
+        unpckhpd %xmm8, %xmm8
+
+       movsd   -16 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm10
+
+       movsd   -15 * SIZE(AO), %xmm13
+       mulsd    %xmm10, %xmm13
+       subsd    %xmm13, %xmm8
+
+       movsd   -13 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm8
+
+       unpcklpd %xmm8, %xmm10
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm10
+#endif
+
+#ifdef RT
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm10
+#endif
+
+#ifdef LN
+       subq    $2 * SIZE, CO1
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm10,  0 * SIZE(CO1)
+       movhpd  %xmm10,  1 * SIZE(CO1)
+#else
+       movlpd  %xmm10,  0 * SIZE(CO1)
+       movhpd  %xmm10,  1 * SIZE(CO1)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm10, -16 * SIZE(BO)
+#else
+       movaps  %xmm10, -16 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $2 * SIZE, CO1
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       addq    %rax, BO
+#endif
+
+#ifdef LN
+       subq    $2, KK
+#endif
+
+#ifdef LT
+       addq    $2, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+
+.L110:
+       testq   $1, M
+       je      .L119
+
+#ifdef LN
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (BO, %rax, SIZE), BO
+#endif 
+
+       movapd  -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movapd  -14 * SIZE(AO), %xmm1
+       pxor    %xmm9, %xmm9
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       NOBRANCH
+       je      .L116
+       ALIGN_4
+
+.L112:
+       mulpd   -16 * SIZE(BO, %rax, 1), %xmm0
+       addpd   %xmm0, %xmm8
+       movapd  -12 * SIZE(AO, %rax, 1), %xmm0
+
+       mulpd   -14 * SIZE(BO, %rax, 1), %xmm1
+       addpd   %xmm1, %xmm9
+       movapd  -10 * SIZE(AO, %rax, 1), %xmm1
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L112
+       ALIGN_4
+
+.L116:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L118
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 1), BO
+       negq    %rax
+       ALIGN_4
+
+.L117:
+       mulsd   -16 * SIZE(BO, %rax, 1), %xmm0
+       addsd   %xmm0, %xmm8
+       movsd   -15 * SIZE(AO, %rax, 1), %xmm0
+
+       addq    $SIZE, %rax
+       jl      .L117
+       ALIGN_4
+
+.L118:
+       addpd   %xmm9, %xmm8
+       haddpd  %xmm8, %xmm8
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $1, %rax
+#else
+       subq    $1, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 1), AO
+       leaq    (B,  %rax, 1), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movsd   -16 * SIZE(BO), %xmm10
+       subsd   %xmm8,  %xmm10
+#else
+       movsd   -16 * SIZE(AO), %xmm10
+       subsd   %xmm8, %xmm10
+#endif
+
+#if defined(LN) || defined(LT)
+       movsd   -16 * SIZE(AO), %xmm12
+       mulsd    %xmm12, %xmm10
+#endif
+
+#if defined(RN) || defined(RT)
+       movsd   -16 * SIZE(BO), %xmm8
+       mulsd    %xmm8, %xmm10
+#endif
+
+#ifdef LN
+       subq    $1 * SIZE, CO1
+#endif
+
+       movsd   %xmm10,  0 * SIZE(CO1)
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm10, -16 * SIZE(BO)
+#else
+       movlpd  %xmm10, -16 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $1 * SIZE, CO1
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       addq    %rax, AO
+       addq    %rax, BO
+#endif
+
+#ifdef LN
+       subq    $1, KK
+#endif
+
+#ifdef LT
+       addq    $1, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+
+.L119:
+#ifdef LN
+       leaq    (B, K, SIZE), B
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    BO, B
+#endif
+
+#ifdef RN
+       addq    $1, KK
+#endif
+
+#ifdef RT
+       subq    $1, KK
+#endif
+       ALIGN_4
+
+.L40:  
+       testq   $2, N
+       je      .L80
+
+#if defined(LT) || defined(RN)
+       movq    A, AO
+#else
+       movq    A, AORIG
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       subq    %rax, B
+
+       leaq    (, LDC, 2), %rax
+       subq    %rax, C
+#endif
+
+       movq    C, CO1                  # coffset1 = c
+       leaq    (C, LDC, 1), CO2        # coffset2 = c + ldc
+#ifndef RT
+       leaq    (C, LDC, 2), C
+#endif
+
+#ifdef LN
+       movq    OFFSET, %rax
+       addq    M, %rax
+       movq    %rax, KK
+#endif 
+
+#if defined(LT)
+       movq    OFFSET, %rax
+       movq    %rax, KK
+#endif
+
+       movq    M,  I
+       sarq    $2, I   # i = (m >> 2)
+       jle     .L60
+       ALIGN_4
+
+.L51:
+#ifdef LN
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (BO, %rax, 2), BO
+#endif 
+
+       movddup -16 * SIZE(BO), %xmm1
+       movddup -15 * SIZE(BO), %xmm5
+       pxor    %xmm8, %xmm8
+       movddup -12 * SIZE(BO), %xmm3
+       pxor    %xmm9, %xmm9
+       movapd  -16 * SIZE(AO), %xmm0
+       pxor    %xmm12, %xmm12
+       movapd   -8 * SIZE(AO), %xmm4
+       pxor    %xmm13, %xmm13
+
+#ifndef LN
+       prefetchw      3 * SIZE(CO1)
+       movapd  %xmm0, %xmm2
+       prefetchw      5 * SIZE(CO2)
+#else
+       prefetchw     -4 * SIZE(CO1)
+       movapd  %xmm0, %xmm2
+       prefetchw     -4 * SIZE(CO2)
+#endif
+
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       NOBRANCH
+       je      .L56
+       ALIGN_4
+
+.L52:
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd  -12 * SIZE(AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm12
+       movddup -14 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm5, %xmm2
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm9
+       addpd   %xmm5, %xmm13
+       movddup -13 * SIZE(BO, %rax, 2), %xmm5
+       movapd  %xmm0, %xmm2
+       mulpd   %xmm1, %xmm0
+       mulpd   -10 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd    (AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm12
+       movddup  -8 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm5, %xmm2
+       mulpd   -10 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm9
+       addpd   %xmm5, %xmm13
+       movddup -11 * SIZE(BO, %rax, 2), %xmm5
+       movapd  %xmm4, %xmm2
+       mulpd   %xmm3, %xmm4
+       mulpd    -6 * SIZE(AO, %rax, 4), %xmm3
+       addpd   %xmm4, %xmm8
+       movapd   -4 * SIZE(AO, %rax, 4), %xmm4
+       addpd   %xmm3, %xmm12
+       movddup -10 * SIZE(BO, %rax, 2), %xmm3
+       mulpd   %xmm5, %xmm2
+       mulpd    -6 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm9
+       addpd   %xmm5, %xmm13
+       movddup  -9 * SIZE(BO, %rax, 2), %xmm5
+       movapd  %xmm4, %xmm2
+       mulpd   %xmm3, %xmm4
+       mulpd    -2 * SIZE(AO, %rax, 4), %xmm3
+       addpd   %xmm4, %xmm8
+       movapd    8 * SIZE(AO, %rax, 4), %xmm4
+       addpd   %xmm3, %xmm12
+       movddup  -4 * SIZE(BO, %rax, 2), %xmm3
+       mulpd   %xmm5, %xmm2
+       mulpd    -2 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm9
+       addpd   %xmm5, %xmm13
+       movddup  -7 * SIZE(BO, %rax, 2), %xmm5
+       movapd  %xmm0, %xmm2
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L52
+       ALIGN_4
+
+.L56:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L59
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       ALIGN_4
+
+.L57:
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd  -12 * SIZE(AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm12
+       movddup -14 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm5, %xmm2
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm5
+       addpd   %xmm2, %xmm9
+       addpd   %xmm5, %xmm13
+       movddup -13 * SIZE(BO, %rax, 2), %xmm5
+       movapd  %xmm0, %xmm2
+
+       addq    $SIZE, %rax
+       jl      .L57
+       ALIGN_4
+
+.L59:
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $4, %rax
+#else
+       subq    $2, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 4), AO
+       leaq    (B,  %rax, 2), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  %xmm8, %xmm0
+       unpcklpd %xmm9, %xmm8
+       unpckhpd %xmm9, %xmm0
+
+       movapd  %xmm12, %xmm4
+       unpcklpd %xmm13, %xmm12
+       unpckhpd %xmm13, %xmm4
+
+       movapd  -16 * SIZE(BO), %xmm9
+       movapd  -14 * SIZE(BO), %xmm13
+       movapd  -12 * SIZE(BO), %xmm1
+       movapd  -10 * SIZE(BO), %xmm5
+
+       subpd   %xmm8,  %xmm9
+       subpd   %xmm0,  %xmm13
+       subpd   %xmm12, %xmm1
+       subpd   %xmm4,  %xmm5
+#else
+       movapd  -16 * SIZE(AO), %xmm0
+       movapd  -14 * SIZE(AO), %xmm1
+       movapd  -12 * SIZE(AO), %xmm2
+       movapd  -10 * SIZE(AO), %xmm3
+
+       subpd   %xmm8, %xmm0
+       subpd   %xmm12, %xmm1
+       subpd   %xmm9, %xmm2
+       subpd   %xmm13, %xmm3
+#endif
+
+#ifdef LN
+       movddup  -1 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm5
+       movddup  -2 * SIZE(AO), %xmm10
+       mulpd    %xmm5, %xmm10
+       subpd    %xmm10, %xmm1
+       movddup  -3 * SIZE(AO), %xmm12
+       mulpd    %xmm5, %xmm12
+       subpd    %xmm12, %xmm13
+       movddup  -4 * SIZE(AO), %xmm14
+       mulpd    %xmm5, %xmm14
+       subpd    %xmm14, %xmm9
+
+       movddup  -6 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm1
+       movddup  -7 * SIZE(AO), %xmm10
+       mulpd    %xmm1, %xmm10
+       subpd    %xmm10, %xmm13
+       movddup  -8 * SIZE(AO), %xmm12
+       mulpd    %xmm1, %xmm12
+       subpd    %xmm12, %xmm9
+
+       movddup -11 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+       movddup -12 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm9
+
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+#endif
+
+#ifdef LT
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm9, %xmm10
+       subpd    %xmm10, %xmm13
+       movddup -14 * SIZE(AO), %xmm12
+       mulpd    %xmm9, %xmm12
+       subpd    %xmm12, %xmm1
+       movddup -13 * SIZE(AO), %xmm14
+       mulpd    %xmm9, %xmm14
+       subpd    %xmm14, %xmm5
+
+
+       movddup -11 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+
+       movddup -10 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm1
+       movddup  -9 * SIZE(AO), %xmm12
+       mulpd    %xmm13, %xmm12
+       subpd    %xmm12, %xmm5
+
+       movddup  -6 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm1
+       movddup  -5 * SIZE(AO), %xmm10
+       mulpd    %xmm1, %xmm10
+       subpd    %xmm10, %xmm5
+
+       movddup  -1 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm5
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+       mulpd    %xmm8, %xmm1
+
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm0, %xmm9
+       subpd    %xmm9, %xmm2
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm1, %xmm9
+       subpd    %xmm9, %xmm3
+
+       movddup -13 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       mulpd    %xmm8, %xmm3
+#endif
+
+#ifdef RT
+       movddup -13 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       mulpd    %xmm8, %xmm3
+
+       movddup -14 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm0
+       movddup -14 * SIZE(BO), %xmm9
+       mulpd    %xmm3, %xmm9
+       subpd    %xmm9, %xmm1
+
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+       mulpd    %xmm8, %xmm1
+#endif
+
+#ifdef LN
+       subq    $4 * SIZE, CO1
+       subq    $4 * SIZE, CO2
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm9,  0 * SIZE(CO1)
+       movlpd  %xmm13, 1 * SIZE(CO1)
+       movlpd  %xmm1,  2 * SIZE(CO1)
+       movlpd  %xmm5,  3 * SIZE(CO1)
+
+       movhpd  %xmm9,  0 * SIZE(CO2)
+       movhpd  %xmm13, 1 * SIZE(CO2)
+       movhpd  %xmm1,  2 * SIZE(CO2)
+       movhpd  %xmm5,  3 * SIZE(CO2)
+#else
+       movlpd  %xmm0,  0 * SIZE(CO1)
+       movhpd  %xmm0,  1 * SIZE(CO1)
+       movlpd  %xmm1,  2 * SIZE(CO1)
+       movhpd  %xmm1,  3 * SIZE(CO1)
+
+       movlpd  %xmm2,  0 * SIZE(CO2)
+       movhpd  %xmm2,  1 * SIZE(CO2)
+       movlpd  %xmm3,  2 * SIZE(CO2)
+       movhpd  %xmm3,  3 * SIZE(CO2)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm9, -16 * SIZE(BO)
+       movaps  %xmm13,-14 * SIZE(BO)
+       movaps  %xmm1, -12 * SIZE(BO)
+       movaps  %xmm5, -10 * SIZE(BO)
+#else
+       movaps  %xmm0, -16 * SIZE(AO)
+       movaps  %xmm1, -14 * SIZE(AO)
+       movaps  %xmm2, -12 * SIZE(AO)
+       movaps  %xmm3, -10 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $4 * SIZE, CO1
+       addq    $4 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 2), BO
+#endif
+
+#ifdef LN
+       subq    $4, KK
+#endif
+
+#ifdef LT
+       addq    $4, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+
+       decq    I                       # i --
+       jg      .L51
+       ALIGN_4 
+
+.L60:
+       testq   $2, M
+       je      .L70
+
+#ifdef LN
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (BO, %rax, 2), BO
+#endif 
+
+       movapd  -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movapd  -12 * SIZE(AO), %xmm2
+       pxor    %xmm9, %xmm9
+       movddup -16 * SIZE(BO), %xmm1
+       pxor    %xmm10, %xmm10
+       movddup -15 * SIZE(BO), %xmm3
+       pxor    %xmm11, %xmm11
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       NOBRANCH
+       je      .L66
+       ALIGN_4
+
+.L62:
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -14 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm0, %xmm3
+       movapd  -14 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm3, %xmm9
+       movddup -13 * SIZE(BO, %rax, 2), %xmm3
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm10
+       movddup -12 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm0, %xmm3
+       movapd   -8 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm3, %xmm11
+       movddup -11 * SIZE(BO, %rax, 2), %xmm3
+       mulpd   %xmm2, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -10 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm2, %xmm3
+       movapd  -10 * SIZE(AO, %rax, 2), %xmm2
+       addpd   %xmm3, %xmm9
+       movddup  -9 * SIZE(BO, %rax, 2), %xmm3
+       mulpd   %xmm2, %xmm1
+       addpd   %xmm1, %xmm10
+       movddup  -8 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm2, %xmm3
+       movapd   -4 * SIZE(AO, %rax, 2), %xmm2
+       addpd   %xmm3, %xmm11
+       movddup  -7 * SIZE(BO, %rax, 2), %xmm3
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L62
+       ALIGN_4
+
+.L66:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L69
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       ALIGN_4
+
+.L67:
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -14 * SIZE(BO, %rax, 2), %xmm1
+       mulpd   %xmm0, %xmm3
+       movapd  -14 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm3, %xmm9
+       movddup -13 * SIZE(BO, %rax, 2), %xmm3
+
+       addq    $SIZE, %rax
+       jl      .L67
+       ALIGN_4
+
+.L69:
+       addpd   %xmm10, %xmm8
+       addpd   %xmm11, %xmm9
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $2, %rax
+#else
+       subq    $2, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 2), AO
+       leaq    (B,  %rax, 2), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  %xmm8, %xmm0
+       unpcklpd %xmm9, %xmm8
+       unpckhpd %xmm9, %xmm0
+
+       movapd  -16 * SIZE(BO), %xmm9
+       movapd  -14 * SIZE(BO), %xmm13
+
+       subpd   %xmm8,  %xmm9
+       subpd   %xmm0,  %xmm13
+#else
+       movapd  -16 * SIZE(AO), %xmm0
+       movapd  -14 * SIZE(AO), %xmm2
+
+       subpd   %xmm8, %xmm0
+       subpd   %xmm9, %xmm2
+#endif
+
+
+#ifdef LN
+       movddup -13 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+
+       movddup -14 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm9
+
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+#endif
+
+#ifdef LT
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm9, %xmm10
+       subpd    %xmm10, %xmm13
+
+       movddup -13 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm0, %xmm9
+       subpd    %xmm9, %xmm2
+
+       movddup -13 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+#endif
+
+#ifdef RT
+       movddup -13 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+
+       movddup -14 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm0
+
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+#endif
+
+#ifdef LN
+       subq    $2 * SIZE, CO1
+       subq    $2 * SIZE, CO2
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm9,   0 * SIZE(CO1)
+       movlpd  %xmm13,  1 * SIZE(CO1)
+
+       movhpd  %xmm9,   0 * SIZE(CO2)
+       movhpd  %xmm13,  1 * SIZE(CO2)
+#else
+       movlpd  %xmm0,   0 * SIZE(CO1)
+       movhpd  %xmm0,   1 * SIZE(CO1)
+
+       movlpd  %xmm2,   0 * SIZE(CO2)
+       movhpd  %xmm2,   1 * SIZE(CO2)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm9,  -16 * SIZE(BO)
+       movaps  %xmm13, -14 * SIZE(BO)
+#else
+       movaps  %xmm0,  -16 * SIZE(AO)
+       movaps  %xmm2,  -14 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $2 * SIZE, CO1
+       addq    $2 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 2), BO
+#endif
+
+#ifdef LN
+       subq    $2, KK
+#endif
+
+#ifdef LT
+       addq    $2, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+
+.L70:
+       testq   $1, M
+       je      .L79
+       ALIGN_4
+
+.L71:
+#ifdef LN
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       leaq    (BO, %rax, 1), BO
+#endif 
+
+       movddup -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movddup -15 * SIZE(AO), %xmm1
+       pxor    %xmm9, %xmm9
+       movddup -14 * SIZE(AO), %xmm2
+       pxor    %xmm10, %xmm10
+       movddup -13 * SIZE(AO), %xmm3
+       pxor    %xmm11, %xmm11
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       NOBRANCH
+       je      .L76
+       ALIGN_4
+
+.L72:
+       mulpd   -16 * SIZE(BO, %rax, 2), %xmm0
+       addpd   %xmm0, %xmm8
+       movddup -12 * SIZE(AO, %rax, 1), %xmm0
+
+       mulpd   -14 * SIZE(BO, %rax, 2), %xmm1
+       addpd   %xmm1, %xmm9
+       movddup -11 * SIZE(AO, %rax, 1), %xmm1
+
+       mulpd   -12 * SIZE(BO, %rax, 2), %xmm2
+       addpd   %xmm2, %xmm10
+       movddup -10 * SIZE(AO, %rax, 1), %xmm2
+
+       mulpd   -10 * SIZE(BO, %rax, 2), %xmm3
+       addpd   %xmm3, %xmm11
+       movddup  -9 * SIZE(AO, %rax, 1), %xmm3
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L72
+       ALIGN_4
+
+.L76:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L78
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 2), BO
+       negq    %rax
+       ALIGN_4
+
+.L77:
+       mulpd   -16 * SIZE(BO, %rax, 2), %xmm0
+       addpd   %xmm0, %xmm8
+       movddup -15 * SIZE(AO, %rax, 1), %xmm0
+
+       addq    $SIZE, %rax
+       jl      .L77
+       ALIGN_4
+
+.L78:
+       addpd   %xmm9,  %xmm8
+       addpd   %xmm11, %xmm10
+       addpd   %xmm10, %xmm8
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $1, %rax
+#else
+       subq    $2, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 1), AO
+       leaq    (B,  %rax, 2), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  -16 * SIZE(BO), %xmm2
+#else
+       movapd  -16 * SIZE(AO), %xmm2
+#endif
+
+       subpd   %xmm8,  %xmm2
+
+#if defined(LN) || defined(LT)
+       movddup -16 * SIZE(AO), %xmm0
+
+       mulpd    %xmm0, %xmm2
+#endif
+
+#ifdef RN
+       movapd  %xmm2,  %xmm0
+        unpckhpd %xmm0, %xmm0
+
+       mulsd   -16 * SIZE(BO), %xmm2
+       movsd   -15 * SIZE(BO), %xmm4
+       mulsd    %xmm2, %xmm4
+       subsd    %xmm4, %xmm0
+
+       mulsd   -13 * SIZE(BO), %xmm0
+       unpcklpd %xmm0, %xmm2
+#endif
+
+#ifdef RT
+       movapd  %xmm2,  %xmm0
+        unpckhpd %xmm0, %xmm0
+
+       mulsd   -13 * SIZE(BO), %xmm0
+
+       movlpd  -14 * SIZE(BO), %xmm4
+       mulsd    %xmm0, %xmm4
+       subsd    %xmm4, %xmm2
+
+       mulsd   -16 * SIZE(BO), %xmm2
+       unpcklpd %xmm0, %xmm2
+#endif
+
+#ifdef LN
+       subq    $1 * SIZE, CO1
+       subq    $1 * SIZE, CO2
+#endif
+
+       movlpd  %xmm2,  0 * SIZE(CO1)
+       movhpd  %xmm2,  0 * SIZE(CO2)
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm2, -16 * SIZE(BO)
+#else
+       movaps  %xmm2, -16 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $1 * SIZE, CO1
+       addq    $1 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 2), BO
+#endif
+
+#ifdef LN
+       subq    $1, KK
+#endif
+
+#ifdef LT
+       addq    $1, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+       
+.L79:
+#ifdef LN
+       leaq    (, K, SIZE), %rax
+       leaq    (B, %rax, 2), B
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    BO, B
+#endif
+
+#ifdef RN
+       addq    $2, KK
+#endif
+
+#ifdef RT
+       subq    $2, KK
+#endif
+       ALIGN_4
+
+.L80:
+       movq    N,  J
+       sarq    $2, J           # j = (n >> 2)
+       jle     .L999
+
+.L01:
+#if defined(LT) || defined(RN)
+       movq    A, AO
+#else
+       movq    A, AORIG
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       subq    %rax, B
+
+       leaq    (, LDC, 4), %rax
+       subq    %rax, C
+#endif
+
+       movq    C, CO1                  # coffset1 = c
+       leaq    (C, LDC, 1), CO2        # coffset2 = c + ldc
+#ifndef RT
+       leaq    (C, LDC, 4), C
+#endif
+
+#ifdef LN
+       movq    OFFSET, %rax
+       addq    M, %rax
+       movq    %rax, KK
+#endif 
+
+       movq    K, %rax
+       salq    $BASE_SHIFT + 2, %rax
+       movq    B, BB
+       subq    %rax, BB
+
+#if defined(LT)
+       movq    OFFSET, %rax
+       movq    %rax, KK
+#endif
+
+       movq    M,  I
+       sarq    $2, I   # i = (m >> 2)
+       jle     .L20
+       ALIGN_4
+
+.L11:
+#ifdef LN
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (BO, %rax, 4), BO
+#endif 
+
+       movapd  -16 * SIZE(AO), %xmm0
+       movddup -16 * SIZE(BO), %xmm1
+       pxor    %xmm8, %xmm8
+       movddup -15 * SIZE(BO), %xmm3
+       pxor    %xmm9, %xmm9
+       movapd   -8 * SIZE(AO), %xmm4
+       pxor    %xmm10, %xmm10
+       movddup  -8 * SIZE(BO), %xmm5
+       pxor    %xmm11, %xmm11
+
+#ifndef LN
+       prefetchw      3 * SIZE(CO1)
+       pxor    %xmm12, %xmm12
+       prefetchw      5 * SIZE(CO2)
+       pxor    %xmm13, %xmm13
+       prefetchw      3 * SIZE(CO1, LDC, 2)
+       pxor    %xmm14, %xmm14
+       prefetchw      5 * SIZE(CO2, LDC, 2)
+       pxor    %xmm15, %xmm15
+       movapd  %xmm0, %xmm2
+#else
+       prefetchw     -8 * SIZE(CO1)
+       pxor    %xmm12, %xmm12
+       prefetchw     -8 * SIZE(CO2)
+       pxor    %xmm13, %xmm13
+       prefetchw     -8 * SIZE(CO1, LDC, 2)
+       pxor    %xmm14, %xmm14
+       prefetchw     -8 * SIZE(CO2, LDC, 2)
+       pxor    %xmm15, %xmm15
+       movapd  %xmm0, %xmm2
+#endif
+
+       subq             $-16 * SIZE, BB
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+
+       andq    $-8, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       NOBRANCH
+       je      .L15
+        vmovups         -16 * SIZE(AO, %rax, 4),%xmm6
+        vmovddup        -16 * SIZE(BO, %rax, 4), %xmm7
+        vmovddup        -15 * SIZE(BO, %rax, 4), %xmm3
+
+       ALIGN_4
+
+.L12:
+
+        prefetcht0 A_PR1(AO,%rax,4)
+        prefetcht0 B_PR1(BO,%rax,4)
+        KERNEL1(16 *  0)
+        KERNEL2(16 *  0)
+        prefetcht0 A_PR1+64(AO,%rax,4)
+        prefetcht0 B_PR1+64(BO,%rax,4)
+        KERNEL3(16 *  0)
+        KERNEL4(16 *  0)
+        prefetcht0 A_PR1+128(AO,%rax,4)
+        prefetcht0 B_PR1+128(BO,%rax,4)
+        KERNEL5(16 *  0)
+        KERNEL6(16 *  0)
+        prefetcht0 A_PR1+192(AO,%rax,4)
+        prefetcht0 B_PR1+192(BO,%rax,4)
+        KERNEL7(16 *  0)
+        KERNEL8(16 *  0)
+
+        addq    $8 * SIZE, %rax
+       jl      .L12
+       ALIGN_4
+
+.L15:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       testq   $4, %rax
+       je .L16
+       xorq    %rax, %rax
+       ALIGN_4
+
+       KERNEL_SUB1(16 *  0)
+       KERNEL_SUB2(16 *  0)
+       KERNEL_SUB3(16 *  0)
+       KERNEL_SUB4(16 *  0)
+
+       subq    $-16 * SIZE, BO
+       subq    $-16 * SIZE, AO
+       ALIGN_4
+
+.L16:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L19
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       ALIGN_4
+
+.L17:
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm8
+       movapd  %xmm2, %xmm0
+       addpd   %xmm1, %xmm12
+       movddup -14 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm3, %xmm2
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm3
+       addpd   %xmm2, %xmm9
+       movapd  %xmm0, %xmm2
+       addpd   %xmm3, %xmm13
+       movddup -13 * SIZE(BO, %rax, 4), %xmm3
+       mulpd   %xmm1, %xmm0
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm10
+       movapd  -12 * SIZE(AO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm14
+       movddup -12 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm3, %xmm2
+       mulpd   -14 * SIZE(AO, %rax, 4), %xmm3
+       addpd   %xmm2, %xmm11
+       addpd   %xmm3, %xmm15
+       movddup -11 * SIZE(BO, %rax, 4), %xmm3
+       movapd  %xmm0, %xmm2
+
+       addq    $SIZE, %rax
+       jl      .L17
+       ALIGN_4
+
+.L19:
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $4, %rax
+#else
+       subq    $4, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 4), AO
+       leaq    (B,  %rax, 4), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  %xmm8, %xmm0
+       unpcklpd %xmm9, %xmm8
+       unpckhpd %xmm9, %xmm0
+
+       movapd  %xmm10, %xmm2
+       unpcklpd %xmm11, %xmm10
+       unpckhpd %xmm11, %xmm2
+
+       movapd  %xmm12, %xmm4
+       unpcklpd %xmm13, %xmm12
+       unpckhpd %xmm13, %xmm4
+
+       movapd  %xmm14, %xmm6
+       unpcklpd %xmm15, %xmm14
+       unpckhpd %xmm15, %xmm6
+
+       movapd  -16 * SIZE(BO), %xmm9
+       movapd  -14 * SIZE(BO), %xmm11
+       movapd  -12 * SIZE(BO), %xmm13
+       movapd  -10 * SIZE(BO), %xmm15
+       movapd   -8 * SIZE(BO), %xmm1
+       movapd   -6 * SIZE(BO), %xmm3
+       movapd   -4 * SIZE(BO), %xmm5
+       movapd   -2 * SIZE(BO), %xmm7
+
+       subpd   %xmm8,  %xmm9
+       subpd   %xmm10, %xmm11
+       subpd   %xmm0,  %xmm13
+       subpd   %xmm2,  %xmm15
+       subpd   %xmm12, %xmm1
+       subpd   %xmm14, %xmm3
+       subpd   %xmm4,  %xmm5
+       subpd   %xmm6,  %xmm7
+#else
+       movapd  -16 * SIZE(AO), %xmm0
+       movapd  -14 * SIZE(AO), %xmm1
+       movapd  -12 * SIZE(AO), %xmm2
+       movapd  -10 * SIZE(AO), %xmm3
+
+       movapd   -8 * SIZE(AO), %xmm4
+       movapd   -6 * SIZE(AO), %xmm5
+       movapd   -4 * SIZE(AO), %xmm6
+       movapd   -2 * SIZE(AO), %xmm7
+
+       subpd   %xmm8,  %xmm0
+       subpd   %xmm12, %xmm1
+       subpd   %xmm9,  %xmm2
+       subpd   %xmm13, %xmm3
+       subpd   %xmm10, %xmm4
+       subpd   %xmm14, %xmm5
+       subpd   %xmm11, %xmm6
+       subpd   %xmm15, %xmm7
+#endif
+
+#ifdef LN
+       movddup  -1 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm5
+       mulpd    %xmm8, %xmm7
+
+       movddup  -2 * SIZE(AO), %xmm10
+       mulpd    %xmm5, %xmm10
+       subpd    %xmm10, %xmm1
+       movddup  -2 * SIZE(AO), %xmm10
+       mulpd    %xmm7, %xmm10
+       subpd    %xmm10, %xmm3
+
+       movddup  -3 * SIZE(AO), %xmm12
+       mulpd    %xmm5, %xmm12
+       subpd    %xmm12, %xmm13
+       movddup  -3 * SIZE(AO), %xmm12
+       mulpd    %xmm7, %xmm12
+       subpd    %xmm12, %xmm15
+
+       movddup  -4 * SIZE(AO), %xmm14
+       mulpd    %xmm5, %xmm14
+       subpd    %xmm14, %xmm9
+       movddup  -4 * SIZE(AO), %xmm14
+       mulpd    %xmm7, %xmm14
+       subpd    %xmm14, %xmm11
+
+       movddup  -6 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm1
+       mulpd    %xmm8, %xmm3
+
+       movddup  -7 * SIZE(AO), %xmm10
+       mulpd    %xmm1, %xmm10
+       subpd    %xmm10, %xmm13
+       movddup  -7 * SIZE(AO), %xmm10
+       mulpd    %xmm3, %xmm10
+       subpd    %xmm10, %xmm15
+
+       movddup  -8 * SIZE(AO), %xmm12
+       mulpd    %xmm1, %xmm12
+       subpd    %xmm12, %xmm9
+       movddup  -8 * SIZE(AO), %xmm12
+       mulpd    %xmm3, %xmm12
+       subpd    %xmm12, %xmm11
+
+       movddup -11 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+       mulpd    %xmm8, %xmm15
+
+       movddup -12 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm9
+       movddup -12 * SIZE(AO), %xmm10
+       mulpd    %xmm15, %xmm10
+       subpd    %xmm10, %xmm11
+
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+       mulpd    %xmm8, %xmm11
+#endif
+
+#ifdef LT
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+       mulpd    %xmm8, %xmm11
+
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm9, %xmm10
+       subpd    %xmm10, %xmm13
+
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm11, %xmm10
+       subpd    %xmm10, %xmm15
+
+       movddup -14 * SIZE(AO), %xmm12
+       mulpd    %xmm9, %xmm12
+       subpd    %xmm12, %xmm1
+       movddup -14 * SIZE(AO), %xmm12
+       mulpd    %xmm11, %xmm12
+       subpd    %xmm12, %xmm3
+
+       movddup -13 * SIZE(AO), %xmm14
+       mulpd    %xmm9, %xmm14
+       subpd    %xmm14, %xmm5
+       movddup -13 * SIZE(AO), %xmm14
+       mulpd    %xmm11, %xmm14
+       subpd    %xmm14, %xmm7
+
+       movddup -11 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+       mulpd    %xmm8, %xmm15
+
+       movddup -10 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm1
+       movddup -10 * SIZE(AO), %xmm10
+       mulpd    %xmm15, %xmm10
+       subpd    %xmm10, %xmm3
+
+       movddup  -9 * SIZE(AO), %xmm12
+       mulpd    %xmm13, %xmm12
+       subpd    %xmm12, %xmm5
+       movddup  -9 * SIZE(AO), %xmm12
+       mulpd    %xmm15, %xmm12
+       subpd    %xmm12, %xmm7
+
+       movddup  -6 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm1
+       mulpd    %xmm8, %xmm3
+
+       movddup  -5 * SIZE(AO), %xmm10
+       mulpd    %xmm1, %xmm10
+       subpd    %xmm10, %xmm5
+       movddup  -5 * SIZE(AO), %xmm10
+       mulpd    %xmm3, %xmm10
+       subpd    %xmm10, %xmm7
+
+       movddup  -1 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm5
+       mulpd    %xmm8, %xmm7
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+       mulpd    %xmm8, %xmm1
+
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm0, %xmm9
+       subpd    %xmm9, %xmm2
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm1, %xmm9
+       subpd    %xmm9, %xmm3
+
+       movddup -14 * SIZE(BO), %xmm10
+       mulpd    %xmm0, %xmm10
+       subpd    %xmm10, %xmm4
+       movddup -14 * SIZE(BO), %xmm10
+       mulpd    %xmm1, %xmm10
+       subpd    %xmm10, %xmm5
+
+       movddup  -13 * SIZE(BO), %xmm11
+       mulpd    %xmm0, %xmm11
+       subpd    %xmm11, %xmm6
+       movddup  -13 * SIZE(BO), %xmm11
+       mulpd    %xmm1, %xmm11
+       subpd    %xmm11, %xmm7
+
+       movddup  -11 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       mulpd    %xmm8, %xmm3
+
+       movddup  -10 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm4
+       movddup  -10 * SIZE(BO), %xmm9
+       mulpd    %xmm3, %xmm9
+       subpd    %xmm9, %xmm5
+
+       movddup   -9 * SIZE(BO), %xmm10
+       mulpd    %xmm2, %xmm10
+       subpd    %xmm10, %xmm6
+       movddup   -9 * SIZE(BO), %xmm10
+       mulpd    %xmm3, %xmm10
+       subpd    %xmm10, %xmm7
+
+       movddup  -6 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm4
+       mulpd    %xmm8, %xmm5
+
+       movddup  -5 * SIZE(BO), %xmm9
+       mulpd    %xmm4, %xmm9
+       subpd    %xmm9, %xmm6
+       movddup  -5 * SIZE(BO), %xmm9
+       mulpd    %xmm5, %xmm9
+       subpd    %xmm9, %xmm7
+
+       movddup  -1 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm6
+       mulpd    %xmm8, %xmm7
+#endif
+
+#ifdef RT
+       movddup  -1 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm6
+       mulpd    %xmm8, %xmm7
+
+       movddup  -2 * SIZE(BO), %xmm9
+       mulpd    %xmm6, %xmm9
+       subpd    %xmm9, %xmm4
+       movddup  -2 * SIZE(BO), %xmm9
+       mulpd    %xmm7, %xmm9
+       subpd    %xmm9, %xmm5
+
+       movddup  -3 * SIZE(BO), %xmm10
+       mulpd    %xmm6, %xmm10
+       subpd    %xmm10, %xmm2
+       movddup  -3 * SIZE(BO), %xmm10
+       mulpd    %xmm7, %xmm10
+       subpd    %xmm10, %xmm3
+
+       movddup  -4 * SIZE(BO), %xmm11
+       mulpd    %xmm6, %xmm11
+       subpd    %xmm11, %xmm0
+       movddup  -4 * SIZE(BO), %xmm11
+       mulpd    %xmm7, %xmm11
+       subpd    %xmm11, %xmm1
+
+       movddup  -6 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm4
+       mulpd    %xmm8, %xmm5
+
+       movddup  -7 * SIZE(BO), %xmm9
+       mulpd    %xmm4, %xmm9
+       subpd    %xmm9, %xmm2
+       movddup  -7 * SIZE(BO), %xmm9
+       mulpd    %xmm5, %xmm9
+       subpd    %xmm9, %xmm3
+
+       movddup  -8 * SIZE(BO), %xmm10
+       mulpd    %xmm4, %xmm10
+       subpd    %xmm10, %xmm0
+       movddup  -8 * SIZE(BO), %xmm10
+       mulpd    %xmm5, %xmm10
+       subpd    %xmm10, %xmm1
+
+       movddup -11 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       mulpd    %xmm8, %xmm3
+
+       movddup -12 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm0
+       movddup -12 * SIZE(BO), %xmm9
+       mulpd    %xmm3, %xmm9
+       subpd    %xmm9, %xmm1
+
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+       mulpd    %xmm8, %xmm1
+#endif
+
+#ifdef LN
+       subq    $4 * SIZE, CO1
+       subq    $4 * SIZE, CO2
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm9,  0 * SIZE(CO1)
+       movlpd  %xmm13, 1 * SIZE(CO1)
+       movlpd  %xmm1,  2 * SIZE(CO1)
+       movlpd  %xmm5,  3 * SIZE(CO1)
+
+       movhpd  %xmm9,  0 * SIZE(CO2)
+       movhpd  %xmm13, 1 * SIZE(CO2)
+       movhpd  %xmm1,  2 * SIZE(CO2)
+       movhpd  %xmm5,  3 * SIZE(CO2)
+
+       movlpd  %xmm11, 0 * SIZE(CO1, LDC, 2)
+       movlpd  %xmm15, 1 * SIZE(CO1, LDC, 2)
+       movlpd  %xmm3,  2 * SIZE(CO1, LDC, 2)
+       movlpd  %xmm7,  3 * SIZE(CO1, LDC, 2)
+
+       movhpd  %xmm11, 0 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm15, 1 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm3,  2 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm7,  3 * SIZE(CO2, LDC, 2)
+#else
+       movlpd  %xmm0,  0 * SIZE(CO1)
+       movhpd  %xmm0,  1 * SIZE(CO1)
+       movlpd  %xmm1,  2 * SIZE(CO1)
+       movhpd  %xmm1,  3 * SIZE(CO1)
+
+       movlpd  %xmm2,  0 * SIZE(CO2)
+       movhpd  %xmm2,  1 * SIZE(CO2)
+       movlpd  %xmm3,  2 * SIZE(CO2)
+       movhpd  %xmm3,  3 * SIZE(CO2)
+
+       movlpd  %xmm4,  0 * SIZE(CO1, LDC, 2)
+       movhpd  %xmm4,  1 * SIZE(CO1, LDC, 2)
+       movlpd  %xmm5,  2 * SIZE(CO1, LDC, 2)
+       movhpd  %xmm5,  3 * SIZE(CO1, LDC, 2)
+
+       movlpd  %xmm6,  0 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm6,  1 * SIZE(CO2, LDC, 2)
+       movlpd  %xmm7,  2 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm7,  3 * SIZE(CO2, LDC, 2)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm9,  -16 * SIZE(BO)
+       movaps  %xmm11, -14 * SIZE(BO)
+       movaps  %xmm13, -12 * SIZE(BO)
+       movaps  %xmm15, -10 * SIZE(BO)
+       movaps  %xmm1,   -8 * SIZE(BO)
+       movaps  %xmm3,   -6 * SIZE(BO)
+       movaps  %xmm5,   -4 * SIZE(BO)
+       movaps  %xmm7,   -2 * SIZE(BO)
+#else
+       movaps  %xmm0,  -16 * SIZE(AO)
+       movaps  %xmm1,  -14 * SIZE(AO)
+       movaps  %xmm2,  -12 * SIZE(AO)
+       movaps  %xmm3,  -10 * SIZE(AO)
+       movaps  %xmm4,   -8 * SIZE(AO)
+       movaps  %xmm5,   -6 * SIZE(AO)
+       movaps  %xmm6,   -4 * SIZE(AO)
+       movaps  %xmm7,   -2 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $4 * SIZE, CO1
+       addq    $4 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 4), AO
+       leaq    (BO, %rax, 4), BO
+#endif
+
+#ifdef LN
+       subq    $4, KK
+#endif
+
+#ifdef LT
+       addq    $4, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $2 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+
+       decq    I                       # i --
+       jg      .L11
+       ALIGN_4 
+
+.L20:
+       testq   $3, M
+       je      .L39
+
+       testq   $2, M
+       je      .L30
+       ALIGN_4
+
+.L21:
+#ifdef LN
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (BO, %rax, 4), BO
+#endif 
+
+       movapd  -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movapd  -12 * SIZE(AO), %xmm2
+       pxor    %xmm9, %xmm9
+       movddup -16 * SIZE(BO), %xmm1
+       pxor    %xmm10, %xmm10
+       movddup -15 * SIZE(BO), %xmm5
+       pxor    %xmm11, %xmm11
+       movddup  -8 * SIZE(BO), %xmm3
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       NOBRANCH
+       je      .L26
+       ALIGN_4
+
+.L22:
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -14 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       addpd   %xmm5, %xmm9
+       movddup -13 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm10
+       movddup -12 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       movapd  -14 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm5, %xmm11
+       movddup -11 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -10 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       addpd   %xmm5, %xmm9
+       movddup  -9 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm10
+       movddup   (BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       movapd   -8 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm5, %xmm11
+       movddup  -7 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm2, %xmm3
+       addpd   %xmm3, %xmm8
+       movddup  -6 * SIZE(BO, %rax, 4), %xmm3
+       mulpd   %xmm2, %xmm5
+       addpd   %xmm5, %xmm9
+       movddup  -5 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm2, %xmm3
+       addpd   %xmm3, %xmm10
+       movddup  -4 * SIZE(BO, %rax, 4), %xmm3
+       mulpd   %xmm2, %xmm5
+       movapd  -10 * SIZE(AO, %rax, 2), %xmm2
+       addpd   %xmm5, %xmm11
+       movddup  -3 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm2, %xmm3
+       addpd   %xmm3, %xmm8
+       movddup  -2 * SIZE(BO, %rax, 4), %xmm3
+       mulpd   %xmm2, %xmm5
+       addpd   %xmm5, %xmm9
+       movddup  -1 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm2, %xmm3
+       addpd   %xmm3, %xmm10
+       movddup   8 * SIZE(BO, %rax, 4), %xmm3
+       mulpd   %xmm2, %xmm5
+       movapd   -4 * SIZE(AO, %rax, 2), %xmm2
+       addpd   %xmm5, %xmm11
+       movddup   1 * SIZE(BO, %rax, 4), %xmm5
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L22
+       ALIGN_4
+
+.L26:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L29
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       ALIGN_4
+
+.L27:
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm8
+       movddup -14 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       addpd   %xmm5, %xmm9
+       movddup -13 * SIZE(BO, %rax, 4), %xmm5
+       mulpd   %xmm0, %xmm1
+       addpd   %xmm1, %xmm10
+       movddup -12 * SIZE(BO, %rax, 4), %xmm1
+       mulpd   %xmm0, %xmm5
+       movapd  -14 * SIZE(AO, %rax, 2), %xmm0
+       addpd   %xmm5, %xmm11
+       movddup -11 * SIZE(BO, %rax, 4), %xmm5
+
+       addq    $SIZE, %rax
+       jl      .L27
+       ALIGN_4
+
+.L29:
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $2, %rax
+#else
+       subq    $4, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 2), AO
+       leaq    (B,  %rax, 4), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd   %xmm8,  %xmm0
+       unpcklpd %xmm9,  %xmm8
+       unpckhpd %xmm9,  %xmm0
+
+       movapd   %xmm10, %xmm2
+       unpcklpd %xmm11, %xmm10
+       unpckhpd %xmm11, %xmm2
+
+       movapd  -16 * SIZE(BO), %xmm9
+       movapd  -14 * SIZE(BO), %xmm11
+       movapd  -12 * SIZE(BO), %xmm13
+       movapd  -10 * SIZE(BO), %xmm15
+
+       subpd   %xmm8,  %xmm9
+       subpd   %xmm10, %xmm11
+       subpd   %xmm0,  %xmm13
+       subpd   %xmm2,  %xmm15
+#else
+       movapd  -16 * SIZE(AO), %xmm0
+       movapd  -14 * SIZE(AO), %xmm2
+       movapd  -12 * SIZE(AO), %xmm4
+       movapd  -10 * SIZE(AO), %xmm6
+
+       subpd   %xmm8,  %xmm0
+       subpd   %xmm9,  %xmm2
+       subpd   %xmm10, %xmm4
+       subpd   %xmm11, %xmm6
+#endif
+
+#ifdef LN
+       movddup -13 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+       mulpd    %xmm8, %xmm15
+
+       movddup -14 * SIZE(AO), %xmm10
+       mulpd    %xmm13, %xmm10
+       subpd    %xmm10, %xmm9
+       movddup -14 * SIZE(AO), %xmm10
+       mulpd    %xmm15, %xmm10
+       subpd    %xmm10, %xmm11
+
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+       mulpd    %xmm8, %xmm11
+#endif
+
+#ifdef LT
+       movddup -16 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm9
+       mulpd    %xmm8, %xmm11
+
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm9, %xmm10
+       subpd    %xmm10, %xmm13
+       movddup -15 * SIZE(AO), %xmm10
+       mulpd    %xmm11, %xmm10
+       subpd    %xmm10, %xmm15
+
+       movddup -13 * SIZE(AO), %xmm8
+       mulpd    %xmm8, %xmm13
+       mulpd    %xmm8, %xmm15
+#endif
+
+#ifdef RN
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+
+       movddup -15 * SIZE(BO), %xmm9
+       mulpd    %xmm0, %xmm9
+       subpd    %xmm9, %xmm2
+       movddup -14 * SIZE(BO), %xmm10
+       mulpd    %xmm0, %xmm10
+       subpd    %xmm10, %xmm4
+       movddup -13 * SIZE(BO), %xmm11
+       mulpd    %xmm0, %xmm11
+       subpd    %xmm11, %xmm6
+
+       movddup -11 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       movddup -10 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm4
+       movddup  -9 * SIZE(BO), %xmm10
+       mulpd    %xmm2, %xmm10
+       subpd    %xmm10, %xmm6
+
+       movddup  -6 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm4
+
+       movddup  -5 * SIZE(BO), %xmm9
+       mulpd    %xmm4, %xmm9
+       subpd    %xmm9, %xmm6
+
+       movddup  -1 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm6
+#endif
+
+#ifdef RT
+       movddup  -1 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm6
+
+       movddup  -2 * SIZE(BO), %xmm9
+       mulpd    %xmm6, %xmm9
+       subpd    %xmm9, %xmm4
+       movddup  -3 * SIZE(BO), %xmm10
+       mulpd    %xmm6, %xmm10
+       subpd    %xmm10, %xmm2
+       movddup  -4 * SIZE(BO), %xmm11
+       mulpd    %xmm6, %xmm11
+       subpd    %xmm11, %xmm0
+
+       movddup  -6 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm4
+       movddup  -7 * SIZE(BO), %xmm9
+       mulpd    %xmm4, %xmm9
+       subpd    %xmm9, %xmm2
+       movddup  -8 * SIZE(BO), %xmm10
+       mulpd    %xmm4, %xmm10
+       subpd    %xmm10, %xmm0
+
+       movddup -11 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm2
+       movddup -12 * SIZE(BO), %xmm9
+       mulpd    %xmm2, %xmm9
+       subpd    %xmm9, %xmm0
+
+       movddup -16 * SIZE(BO), %xmm8
+       mulpd    %xmm8, %xmm0
+#endif
+
+#ifdef LN
+       subq    $2 * SIZE, CO1
+       subq    $2 * SIZE, CO2
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm9,   0 * SIZE(CO1)
+       movlpd  %xmm13,  1 * SIZE(CO1)
+
+       movhpd  %xmm9,   0 * SIZE(CO2)
+       movhpd  %xmm13,  1 * SIZE(CO2)
+
+       movlpd  %xmm11,  0 * SIZE(CO1, LDC, 2)
+       movlpd  %xmm15,  1 * SIZE(CO1, LDC, 2)
+
+       movhpd  %xmm11,  0 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm15,  1 * SIZE(CO2, LDC, 2)
+#else
+       movlpd  %xmm0,  0 * SIZE(CO1)
+       movhpd  %xmm0,  1 * SIZE(CO1)
+
+       movlpd  %xmm2,  0 * SIZE(CO2)
+       movhpd  %xmm2,  1 * SIZE(CO2)
+
+       movlpd  %xmm4,  0 * SIZE(CO1, LDC, 2)
+       movhpd  %xmm4,  1 * SIZE(CO1, LDC, 2)
+
+       movlpd  %xmm6,  0 * SIZE(CO2, LDC, 2)
+       movhpd  %xmm6,  1 * SIZE(CO2, LDC, 2)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm9,  -16 * SIZE(BO)
+       movaps  %xmm11, -14 * SIZE(BO)
+       movaps  %xmm13, -12 * SIZE(BO)
+       movaps  %xmm15, -10 * SIZE(BO)
+#else
+       movaps  %xmm0,  -16 * SIZE(AO)
+       movaps  %xmm2,  -14 * SIZE(AO)
+       movaps  %xmm4,  -12 * SIZE(AO)
+       movaps  %xmm6,  -10 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $2 * SIZE, CO1
+       addq    $2 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 2), AO
+       leaq    (BO, %rax, 4), BO
+#endif
+
+#ifdef LN
+       subq    $2, KK
+#endif
+
+#ifdef LT
+       addq    $2, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $1 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+
+.L30:
+       testq   $1, M
+       je      .L39
+
+#ifdef LN
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       subq    %rax, AORIG
+#endif
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       movq    AORIG, AO
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+#endif
+
+       movq    B, BO
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (BO, %rax, 4), BO
+#endif 
+
+       movddup -16 * SIZE(AO), %xmm0
+       pxor    %xmm8, %xmm8
+       movddup -14 * SIZE(AO), %xmm2
+       pxor    %xmm9, %xmm9
+       movddup -15 * SIZE(AO), %xmm4
+       pxor    %xmm10, %xmm10
+       movapd  -16 * SIZE(BO), %xmm1
+       pxor    %xmm11, %xmm11
+       movapd   -8 * SIZE(BO), %xmm3
+
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $-4, %rax
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       NOBRANCH
+       je      .L36
+       ALIGN_4
+
+.L32:
+       mulpd   %xmm0, %xmm1
+       mulpd   -14 * SIZE(BO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm8
+       movapd  -12 * SIZE(BO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm9
+       movddup -12 * SIZE(AO, %rax, 1), %xmm0
+       mulpd   %xmm4, %xmm1
+       mulpd   -10 * SIZE(BO, %rax, 4), %xmm4
+       addpd   %xmm1, %xmm10
+       movapd    (BO, %rax, 4), %xmm1
+       addpd   %xmm4, %xmm11
+       movddup -11 * SIZE(AO, %rax, 1), %xmm4
+       mulpd   %xmm2, %xmm3
+       mulpd    -6 * SIZE(BO, %rax, 4), %xmm2
+       addpd   %xmm3, %xmm8
+       movapd   -4 * SIZE(BO, %rax, 4), %xmm3
+       addpd   %xmm2, %xmm9
+       movddup -13 * SIZE(AO, %rax, 1), %xmm2
+       mulpd   %xmm2, %xmm3
+       mulpd    -2 * SIZE(BO, %rax, 4), %xmm2
+       addpd   %xmm3, %xmm10
+       movapd    8 * SIZE(BO, %rax, 4), %xmm3
+       addpd   %xmm2, %xmm11
+       movddup -10 * SIZE(AO, %rax, 1), %xmm2
+
+       addq    $4 * SIZE, %rax
+       BRANCH
+       jl      .L32
+       ALIGN_4
+
+.L36:
+#if defined(LT) || defined(RN)
+       movq    KK, %rax
+#else
+       movq    K, %rax
+       subq    KK, %rax
+#endif
+       andq    $3, %rax                # if (k & 1)
+       je .L38
+
+       leaq    (, %rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 4), BO
+       negq    %rax
+       ALIGN_4
+
+.L37:
+       mulpd   %xmm0, %xmm1
+       mulpd   -14 * SIZE(BO, %rax, 4), %xmm0
+       addpd   %xmm1, %xmm8
+       movapd  -12 * SIZE(BO, %rax, 4), %xmm1
+       addpd   %xmm0, %xmm9
+       movddup -15 * SIZE(AO, %rax, 1), %xmm0
+
+       addq    $SIZE, %rax
+       jl      .L37
+       ALIGN_4
+
+.L38:
+       addpd   %xmm10, %xmm8
+       addpd   %xmm11, %xmm9
+
+#if defined(LN) || defined(RT)
+       movq    KK, %rax
+#ifdef LN
+       subq    $1, %rax
+#else
+       subq    $4, %rax
+#endif
+
+       leaq    (, %rax, SIZE), %rax
+
+       movq    AORIG, AO
+       leaq    (AO, %rax, 1), AO
+       leaq    (B,  %rax, 4), BO
+#endif
+
+#if defined(LN) || defined(LT)
+       movapd  -16 * SIZE(BO), %xmm2
+       movapd  -14 * SIZE(BO), %xmm3
+
+       subpd   %xmm8,  %xmm2
+       subpd   %xmm9,  %xmm3
+#else
+       movapd  -16 * SIZE(AO), %xmm2
+       movapd  -14 * SIZE(AO), %xmm3
+
+       subpd   %xmm8, %xmm2
+       subpd   %xmm9, %xmm3
+#endif
+
+#if defined(LN) || defined(LT)
+       movddup -16 * SIZE(AO), %xmm0
+       mulpd    %xmm0, %xmm2
+       mulpd    %xmm0, %xmm3
+#endif
+
+#ifdef RN
+       movapd  %xmm2, %xmm0
+        unpckhpd %xmm0, %xmm0
+
+       movapd  %xmm3, %xmm1
+        unpckhpd %xmm1, %xmm1
+
+       movsd   -16 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm2
+
+       movsd   -15 * SIZE(BO), %xmm5
+       mulsd    %xmm2, %xmm5
+       subsd    %xmm5, %xmm0
+       movsd   -14 * SIZE(BO), %xmm6
+       mulsd    %xmm2, %xmm6
+       subsd    %xmm6, %xmm3
+       movsd   -13 * SIZE(BO), %xmm7
+       mulsd    %xmm2, %xmm7
+       subsd    %xmm7, %xmm1
+
+       movsd   -11 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm0
+
+       movsd   -10 * SIZE(BO), %xmm5
+       mulsd    %xmm0, %xmm5
+       subsd    %xmm5, %xmm3
+       movsd    -9 * SIZE(BO), %xmm6
+       mulsd    %xmm0, %xmm6
+       subsd    %xmm6, %xmm1
+
+       movsd    -6 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm3
+
+       movsd    -5 * SIZE(BO), %xmm5
+       mulsd    %xmm3, %xmm5
+       subsd    %xmm5, %xmm1
+
+       movsd    -1 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm1
+
+       unpcklpd %xmm0, %xmm2
+       unpcklpd %xmm1, %xmm3
+#endif
+
+#ifdef RT
+       movapd  %xmm2, %xmm0
+        unpckhpd %xmm0, %xmm0
+
+       movapd  %xmm3, %xmm1
+        unpckhpd %xmm1, %xmm1
+
+       movsd    -1 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm1
+
+       movsd    -2 * SIZE(BO), %xmm5
+       mulsd    %xmm1, %xmm5
+       subsd    %xmm5, %xmm3
+       movsd    -3 * SIZE(BO), %xmm6
+       mulsd    %xmm1, %xmm6
+       subsd    %xmm6, %xmm0
+       movsd    -4 * SIZE(BO), %xmm7
+       mulsd    %xmm1, %xmm7
+       subsd    %xmm7, %xmm2
+
+       movsd    -6 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm3
+
+       movsd    -7 * SIZE(BO), %xmm5
+       mulsd    %xmm3, %xmm5
+       subsd    %xmm5, %xmm0
+       movsd    -8 * SIZE(BO), %xmm6
+       mulsd    %xmm3, %xmm6
+       subsd    %xmm6, %xmm2
+
+       movsd   -11 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm0
+
+       movsd   -12 * SIZE(BO), %xmm5
+       mulsd    %xmm0, %xmm5
+       subsd    %xmm5, %xmm2
+
+       movsd   -16 * SIZE(BO), %xmm4
+       mulsd    %xmm4, %xmm2
+
+       unpcklpd %xmm0, %xmm2
+       unpcklpd %xmm1, %xmm3
+
+#endif
+
+#ifdef LN
+       subq    $1 * SIZE, CO1
+       subq    $1 * SIZE, CO2
+#endif
+
+#if defined(LN) || defined(LT)
+       movlpd  %xmm2,  0 * SIZE(CO1)
+       movhpd  %xmm2,  0 * SIZE(CO2)
+       movlpd  %xmm3,  0 * SIZE(CO1, LDC, 2)
+       movhpd  %xmm3,  0 * SIZE(CO2, LDC, 2)
+#else
+       movlpd  %xmm2,  0 * SIZE(CO1)
+       movhpd  %xmm2,  0 * SIZE(CO2)
+       movlpd  %xmm3,  0 * SIZE(CO1, LDC, 2)
+       movhpd  %xmm3,  0 * SIZE(CO2, LDC, 2)
+#endif
+
+#if defined(LN) || defined(LT)
+       movaps  %xmm2, -16 * SIZE(BO)
+       movaps  %xmm3, -14 * SIZE(BO)
+#else
+       movaps  %xmm2, -16 * SIZE(AO)
+       movaps  %xmm3, -14 * SIZE(AO)
+#endif
+
+#ifndef LN
+       addq    $1 * SIZE, CO1
+       addq    $1 * SIZE, CO2
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    K,  %rax
+       subq    KK, %rax
+       leaq    (,%rax, SIZE), %rax
+       leaq    (AO, %rax, 1), AO
+       leaq    (BO, %rax, 4), BO
+#endif
+
+#ifdef LN
+       subq    $1, KK
+#endif
+
+#ifdef LT
+       addq    $1, KK
+#endif
+
+#ifdef RT
+       movq    K, %rax
+       salq    $0 + BASE_SHIFT, %rax
+       addq    %rax, AORIG
+#endif
+       ALIGN_4 
+       
+.L39:
+#ifdef LN
+       leaq    (, K, SIZE), %rax
+       leaq    (B, %rax, 4), B
+#endif
+
+#if defined(LT) || defined(RN)
+       movq    BO, B
+#endif
+
+#ifdef RN
+       addq    $4, KK
+#endif
+
+#ifdef RT
+       subq    $4, KK
+#endif
+
+       decq    J                       # j --
+       jg      .L01
+       ALIGN_4
+
+.L999:
+       movq       (%rsp), %rbx
+       movq      8(%rsp), %rbp
+       movq     16(%rsp), %r12
+       movq     24(%rsp), %r13
+       movq     32(%rsp), %r14
+       movq     40(%rsp), %r15
+
+#ifdef WINDOWS_ABI
+       movq     48(%rsp), %rdi
+       movq     56(%rsp), %rsi
+       movups   64(%rsp), %xmm6
+       movups   80(%rsp), %xmm7
+       movups   96(%rsp), %xmm8
+       movups  112(%rsp), %xmm9
+       movups  128(%rsp), %xmm10
+       movups  144(%rsp), %xmm11
+       movups  160(%rsp), %xmm12
+       movups  176(%rsp), %xmm13
+       movups  192(%rsp), %xmm14
+       movups  208(%rsp), %xmm15
+#endif
+
+       addq    $STACKSIZE, %rsp
+       ret
+
+       EPILOGUE