Support AMD Piledriver by bulldozer kernels.
[platform/upstream/openblas.git] / kernel / x86 / trsm_kernel_RT_2x4_sse2.S
1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin.           */
3 /* All rights reserved.                                              */
4 /*                                                                   */
5 /* Redistribution and use in source and binary forms, with or        */
6 /* without modification, are permitted provided that the following   */
7 /* conditions are met:                                               */
8 /*                                                                   */
9 /*   1. Redistributions of source code must retain the above         */
10 /*      copyright notice, this list of conditions and the following  */
11 /*      disclaimer.                                                  */
12 /*                                                                   */
13 /*   2. Redistributions in binary form must reproduce the above      */
14 /*      copyright notice, this list of conditions and the following  */
15 /*      disclaimer in the documentation and/or other materials       */
16 /*      provided with the distribution.                              */
17 /*                                                                   */
18 /*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19 /*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20 /*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21 /*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22 /*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23 /*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24 /*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25 /*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26 /*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27 /*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28 /*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29 /*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30 /*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31 /*    POSSIBILITY OF SUCH DAMAGE.                                    */
32 /*                                                                   */
33 /* The views and conclusions contained in the software and           */
34 /* documentation are those of the authors and should not be          */
35 /* interpreted as representing official policies, either expressed   */
36 /* or implied, of The University of Texas at Austin.                 */
37 /*********************************************************************/
38
39 #define ASSEMBLER
40 #include "common.h"
41
42 #define STACK   16
43 #define ARGS     0
44         
45 #define OLD_M    4 + STACK + ARGS(%esi)
46 #define OLD_N    8 + STACK + ARGS(%esi)
47 #define OLD_K   12 + STACK + ARGS(%esi)
48 #define OLD_ALPHA       16 + STACK + ARGS(%esi)
49 #define OLD_A   24 + STACK + ARGS(%esi)
50 #define OLD_B   28 + STACK + ARGS(%esi)
51 #define OLD_C   32 + STACK + ARGS(%esi)
52 #define OLD_LDC 36 + STACK + ARGS(%esi)
53 #define OLD_OFFT        40 + STACK + ARGS(%esi)
54
55 #define K       16(%esp)
56 #define N       20(%esp)
57 #define M       24(%esp)
58 #define A       28(%esp)
59 #define C       32(%esp)
60 #define J       36(%esp)
61 #define OLD_STACK 40(%esp)
62 #define OFFSET  44(%esp)
63 #define KK      48(%esp)
64 #define KKK     52(%esp)
65 #define AORIG   56(%esp)
66 #define BORIG   60(%esp)
67 #define BUFFER 128(%esp)
68
69 #define STACK_ALIGN     4096
70 #define STACK_OFFSET    1024
71
72 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
73 #define PREFETCH     prefetch
74 #define PREFETCHSIZE (8 * 10 + 4)
75 #endif
76
77 #define B       %edi
78 #define AA      %edx
79 #define BB      %ecx
80 #define LDC     %ebp
81 #define CO1     %esi
82
83 #define KERNEL1(address) \
84         mulpd   %xmm0, %xmm2; \
85         addpd   %xmm2, %xmm4; \
86         PREFETCH (PREFETCHSIZE +  0) * SIZE + (address) * 1 * SIZE(AA); \
87         movapd   2 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
88         mulpd   %xmm0, %xmm2; \
89         addpd   %xmm2, %xmm5; \
90         movapd   4 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
91         mulpd   %xmm0, %xmm2; \
92         mulpd    6 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
93         addpd   %xmm2, %xmm6; \
94         movapd  16 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
95         addpd   %xmm0, %xmm7; \
96         movapd   2 * SIZE + (address) * 1 * SIZE(AA), %xmm0
97
98 #define KERNEL2(address) \
99         mulpd   %xmm0, %xmm3; \
100         addpd   %xmm3, %xmm4; \
101         movapd  10 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
102         mulpd   %xmm0, %xmm3; \
103         addpd   %xmm3, %xmm5; \
104         movapd  12 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
105         mulpd   %xmm0, %xmm3; \
106         mulpd   14 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
107         addpd   %xmm3, %xmm6; \
108         movapd  24 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
109         addpd   %xmm0, %xmm7; \
110         movapd   4 * SIZE + (address) * 1 * SIZE(AA), %xmm0
111
112 #define KERNEL3(address) \
113         mulpd   %xmm0, %xmm2; \
114         addpd   %xmm2, %xmm4; \
115         movapd  18 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
116         mulpd   %xmm0, %xmm2; \
117         addpd   %xmm2, %xmm5; \
118         movapd  20 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
119         mulpd   %xmm0, %xmm2; \
120         mulpd   22 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
121         addpd   %xmm2, %xmm6; \
122         movapd  32 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
123         addpd   %xmm0, %xmm7; \
124         movapd   6 * SIZE + (address) * 1 * SIZE(AA), %xmm0
125
126 #define KERNEL4(address) \
127         mulpd   %xmm0, %xmm3; \
128         addpd   %xmm3, %xmm4; \
129         movapd  26 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
130         mulpd   %xmm0, %xmm3; \
131         addpd   %xmm3, %xmm5; \
132         movapd  28 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
133         mulpd   %xmm0, %xmm3; \
134         mulpd   30 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
135         addpd   %xmm3, %xmm6; \
136         movapd  40 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
137         addpd   %xmm0, %xmm7; \
138         movapd  16 * SIZE + (address) * 1 * SIZE(AA), %xmm0
139
140 #define KERNEL5(address) \
141         PREFETCH (PREFETCHSIZE + 8) * SIZE + (address) * 1 * SIZE(AA); \
142         mulpd   %xmm1, %xmm2; \
143         addpd   %xmm2, %xmm4; \
144         movapd  34 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
145         mulpd   %xmm1, %xmm2; \
146         addpd   %xmm2, %xmm5; \
147         movapd  36 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
148         mulpd   %xmm1, %xmm2; \
149         mulpd   38 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
150         addpd   %xmm2, %xmm6; \
151         movapd  48 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
152         addpd   %xmm1, %xmm7; \
153         movapd  10 * SIZE + (address) * 1 * SIZE(AA), %xmm1
154
155 #define KERNEL6(address) \
156         mulpd   %xmm1, %xmm3; \
157         addpd   %xmm3, %xmm4; \
158         movapd  42 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
159         mulpd   %xmm1, %xmm3; \
160         addpd   %xmm3, %xmm5; \
161         movapd  44 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
162         mulpd   %xmm1, %xmm3; \
163         mulpd   46 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
164         addpd   %xmm3, %xmm6; \
165         movapd  56 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
166         addpd   %xmm1, %xmm7; \
167         movapd  12 * SIZE + (address) * 1 * SIZE(AA), %xmm1
168
169 #define KERNEL7(address) \
170         mulpd   %xmm1, %xmm2; \
171         addpd   %xmm2, %xmm4; \
172         movapd  50 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
173         mulpd   %xmm1, %xmm2; \
174         addpd   %xmm2, %xmm5; \
175         movapd  52 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
176         mulpd   %xmm1, %xmm2; \
177         mulpd   54 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
178         addpd   %xmm2, %xmm6; \
179         movapd  64 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
180         addpd   %xmm1, %xmm7; \
181         movapd  14 * SIZE + (address) * 1 * SIZE(AA), %xmm1
182
183 #define KERNEL8(address) \
184         mulpd   %xmm1, %xmm3; \
185         addpd   %xmm3, %xmm4; \
186         movapd  58 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
187         mulpd   %xmm1, %xmm3; \
188         addpd   %xmm3, %xmm5; \
189         movapd  60 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
190         mulpd   %xmm1, %xmm3; \
191         mulpd   62 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
192         addpd   %xmm3, %xmm6; \
193         movapd  72 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
194         addpd   %xmm1, %xmm7; \
195         movapd  24 * SIZE + (address) * 1 * SIZE(AA), %xmm1
196
197         PROLOGUE
198
199         pushl   %ebp
200         pushl   %edi
201         pushl   %esi
202         pushl   %ebx
203
204         PROFCODE
205
206         EMMS
207
208         movl    %esp, %esi      # save old stack
209
210         subl    $128 + LOCAL_BUFFER_SIZE + STACK_OFFSET, %esp
211         andl    $-STACK_ALIGN, %esp
212         addl    $STACK_OFFSET, %esp
213
214         STACK_TOUCHING
215
216         movl    OLD_M, %ebx
217         movl    OLD_N, %eax
218         movl    OLD_K, %ecx
219         movl    OLD_A, %edx
220
221         movl    %ebx, M
222         movl    %eax, N
223         movl    %ecx, K
224         movl    %edx, A
225         movl    %esi, OLD_STACK
226         movd    OLD_OFFT, %mm4
227
228         movl    OLD_B, B
229         movl    OLD_C, %ebx
230
231         movl    %ebx, C
232         movl    OLD_LDC, LDC
233
234         movd    %mm4, OFFSET
235         movd    %mm4, KK
236
237         leal    (, LDC, SIZE), LDC
238
239 #ifdef LN
240        movl     M, %eax
241        leal     (, %eax, SIZE), %eax
242        addl     %eax, C
243        imull    K, %eax
244        addl     %eax, A
245 #endif
246
247 #ifdef RT
248        movl     N, %eax
249        leal     (, %eax, SIZE), %eax
250        imull    K, %eax
251        addl     %eax, B
252        movl     N, %eax
253        imull    LDC, %eax
254        addl     %eax, C
255 #endif
256
257 #ifdef RN
258         negl    KK
259 #endif  
260
261 #ifdef RT
262        movl     N, %eax
263        subl     OFFSET, %eax
264        movl     %eax, KK
265 #endif
266
267         testl   $1, N
268         je      .L30
269
270 #ifdef LN
271         movl    OFFSET, %eax
272         addl    M, %eax
273         movl    %eax, KK
274 #endif  
275
276         leal    BUFFER, BB
277
278 #ifdef RT
279        movl     K, %eax
280        sall     $BASE_SHIFT, %eax
281        subl     %eax, B
282 #endif
283
284 #if defined(LN) || defined(RT)
285         movl    KK, %eax
286         movl    B, BORIG
287         leal    (, %eax, SIZE), %eax
288         leal    (B,  %eax, 1), B
289         leal    (BB, %eax, 2), BB
290 #endif  
291
292 #ifdef LT
293         movl    OFFSET, %eax
294         movl    %eax, KK
295 #endif
296
297 #if defined(LT) || defined(RN)
298         movl    KK, %eax
299 #else
300         movl    K, %eax
301         subl    KK, %eax
302 #endif
303         sarl    $3, %eax
304         jle     .L65
305         ALIGN_4
306         
307 .L62:
308 #define COPYPREFETCH 40
309
310         prefetchnta     (COPYPREFETCH) * SIZE(B)
311
312         movq     0 * SIZE(B), %mm0
313         movq     1 * SIZE(B), %mm1
314         movq     2 * SIZE(B), %mm2
315         movq     3 * SIZE(B), %mm3
316         movq     4 * SIZE(B), %mm4
317         movq     5 * SIZE(B), %mm5
318         movq     6 * SIZE(B), %mm6
319         movq     7 * SIZE(B), %mm7
320
321         movq    %mm0,  0 * SIZE(BB)
322         movq    %mm0,  1 * SIZE(BB)
323         movq    %mm1,  2 * SIZE(BB)
324         movq    %mm1,  3 * SIZE(BB)
325         movq    %mm2,  4 * SIZE(BB)
326         movq    %mm2,  5 * SIZE(BB)
327         movq    %mm3,  6 * SIZE(BB)
328         movq    %mm3,  7 * SIZE(BB)
329
330         movq    %mm4,  8 * SIZE(BB)
331         movq    %mm4,  9 * SIZE(BB)
332         movq    %mm5, 10 * SIZE(BB)
333         movq    %mm5, 11 * SIZE(BB)
334         movq    %mm6, 12 * SIZE(BB)
335         movq    %mm6, 13 * SIZE(BB)
336         movq    %mm7, 14 * SIZE(BB)
337         movq    %mm7, 15 * SIZE(BB)
338
339         addl    $ 8 * SIZE, B
340         addl    $16 * SIZE, BB
341         decl    %eax
342         jne     .L62
343         ALIGN_2
344
345 .L65:
346 #if defined(LT) || defined(RN)
347         movl    KK, %eax
348 #else
349         movl    K, %eax
350         subl    KK, %eax
351 #endif
352         andl    $7, %eax
353         BRANCH
354         jle     .L70
355         ALIGN_2
356
357 .L66:
358         movq     0 * SIZE(B), %mm0
359
360         movq    %mm0,  0 * SIZE(BB)
361         movq    %mm0,  1 * SIZE(BB)
362
363         addl    $1 * SIZE, B
364         addl    $2 * SIZE, BB
365         decl    %eax
366         jne     .L66
367         ALIGN_4
368         
369 .L70:
370 #if defined(LT) || defined(RN)
371         movl    A, AA
372 #else
373         movl    A, %eax
374         movl    %eax, AORIG
375 #endif
376
377 #ifdef RT
378         subl    LDC, C
379 #endif
380         movl    C, CO1
381 #ifndef RT
382         addl    LDC, C
383 #endif
384
385         movl    M,  %ebx
386         sarl    $1, %ebx        # i = (m >> 2)
387         jle     .L80
388         ALIGN_4
389
390 .L71:
391 #ifdef LN
392        movl     K, %eax
393        sall     $1 + BASE_SHIFT, %eax
394        subl     %eax, AORIG
395 #endif
396
397 #if defined(LN) || defined(RT)
398         movl    KK, %eax
399         movl    AORIG, AA
400         leal    (, %eax, SIZE), %eax
401         leal    (AA, %eax, 2), AA
402 #endif
403
404         leal    BUFFER, BB
405
406 #if defined(LN) || defined(RT)
407         movl    KK, %eax
408         sall    $1 + BASE_SHIFT, %eax
409         addl    %eax, BB
410 #endif  
411
412         pxor    %xmm4, %xmm4
413         pxor    %xmm5, %xmm5
414         pxor    %xmm6, %xmm6
415         pxor    %xmm7, %xmm7
416
417         movapd   0 * SIZE(AA), %xmm0
418         movapd   8 * SIZE(AA), %xmm1
419         movapd   0 * SIZE(BB), %xmm2
420         movapd   8 * SIZE(BB), %xmm3
421
422 #ifdef LN
423         prefetchw       -2 * SIZE(CO1)
424 #else
425         prefetchw        1 * SIZE(CO1)
426 #endif
427
428 #if defined(LT) || defined(RN)
429         movl    KK, %eax
430 #else
431         movl    K, %eax
432         subl    KK, %eax
433 #endif
434         sarl    $3, %eax
435         je      .L75
436         ALIGN_4
437
438 .L72:
439         mulpd   %xmm0, %xmm2
440         addpd   %xmm2, %xmm4
441         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
442         movapd  16 * SIZE(BB), %xmm2
443
444         movapd   2 * SIZE(AA), %xmm0
445         mulpd    2 * SIZE(BB), %xmm0
446         addpd   %xmm0, %xmm4
447         movapd   4 * SIZE(AA), %xmm0
448         mulpd    4 * SIZE(BB), %xmm0
449         addpd   %xmm0, %xmm4
450         movapd   6 * SIZE(AA), %xmm0
451         mulpd    6 * SIZE(BB), %xmm0
452         addpd   %xmm0, %xmm4
453
454         movapd  16 * SIZE(AA), %xmm0
455         prefetcht0 (PREFETCHSIZE  + 8) * SIZE(AA)
456         mulpd   %xmm1, %xmm3
457         addpd   %xmm3, %xmm4
458         movapd  24 * SIZE(BB), %xmm3
459
460         movapd  10 * SIZE(AA), %xmm1
461         mulpd   10 * SIZE(BB), %xmm1
462         addpd   %xmm1, %xmm4
463         movapd  12 * SIZE(AA), %xmm1
464         mulpd   12 * SIZE(BB), %xmm1
465         addpd   %xmm1, %xmm4
466         movapd  14 * SIZE(AA), %xmm1
467         mulpd   14 * SIZE(BB), %xmm1
468         addpd   %xmm1, %xmm4
469         movapd  24 * SIZE(AA), %xmm1
470
471         addl   $16 * SIZE, AA
472         addl   $16 * SIZE, BB
473         decl   %eax
474         jne    .L72
475         ALIGN_4
476
477 .L75:
478 #if defined(LT) || defined(RN)
479         movl    KK, %eax
480 #else
481         movl    K, %eax
482         subl    KK, %eax
483 #endif
484         andl    $7, %eax                # if (k & 1)
485         BRANCH
486         je .L78
487         ALIGN_3
488
489 .L76:
490         mulpd   %xmm0, %xmm2
491         addpd   %xmm2, %xmm4
492         movapd   2 * SIZE(AA), %xmm0
493         movapd   2 * SIZE(BB), %xmm2
494
495         addl    $2 * SIZE, AA
496         addl    $2 * SIZE, BB
497         decl    %eax
498         jg      .L76
499         ALIGN_4
500
501 .L78:
502 #if defined(LN) || defined(RT)
503         movl    KK, %eax
504 #ifdef LN
505         subl    $2, %eax
506 #else
507         subl    $1, %eax
508 #endif
509
510         movl    AORIG, AA
511         movl    BORIG, B
512         leal    BUFFER, BB
513
514         leal    (, %eax, SIZE), %eax
515         leal    (AA, %eax, 2), AA
516         leal    (B,  %eax, 1), B
517         leal    (BB, %eax, 2), BB
518 #endif
519
520 #if defined(LN) || defined(LT)
521         movapd   0 * SIZE(B), %xmm2
522
523         subpd   %xmm4,  %xmm2
524 #else
525         movapd   0 * SIZE(AA), %xmm0
526
527         subpd   %xmm4, %xmm0
528 #endif
529
530 #ifdef LN
531         movapd   %xmm2, %xmm3
532         unpckhpd %xmm3, %xmm3
533
534         movlpd   3 * SIZE(AA), %xmm4
535         mulsd    %xmm4, %xmm3
536
537         movlpd   2 * SIZE(AA), %xmm4
538         mulsd    %xmm3, %xmm4
539         subsd    %xmm4, %xmm2
540
541         movlpd   0 * SIZE(AA), %xmm4
542         mulsd    %xmm4, %xmm2
543
544         unpcklpd %xmm3, %xmm2
545 #endif
546
547 #ifdef LT
548         movapd   %xmm2, %xmm3
549         unpckhpd %xmm3, %xmm3
550
551         movlpd   0 * SIZE(AA), %xmm4
552         mulsd    %xmm4, %xmm2
553
554         movlpd   1 * SIZE(AA), %xmm4
555         mulsd    %xmm2, %xmm4
556         subsd    %xmm4, %xmm3
557
558         movlpd   3 * SIZE(AA), %xmm4
559         mulsd    %xmm4, %xmm3
560
561         unpcklpd %xmm3, %xmm2
562 #endif
563
564 #ifdef RN
565         movlpd   0 * SIZE(B), %xmm4
566         movhpd   0 * SIZE(B), %xmm4
567         mulpd    %xmm4, %xmm0
568 #endif
569
570 #ifdef RT
571         movlpd   0 * SIZE(B), %xmm4
572         movhpd   0 * SIZE(B), %xmm4
573         mulpd    %xmm4, %xmm0
574 #endif
575
576 #if defined(LN) || defined(LT)
577         movapd  %xmm2,   0 * SIZE(B)
578
579         movlpd  %xmm2,   0 * SIZE(BB)
580         movlpd  %xmm2,   1 * SIZE(BB)
581         movhpd  %xmm2,   2 * SIZE(BB)
582         movhpd  %xmm2,   3 * SIZE(BB)
583 #else
584         movapd  %xmm0,   0 * SIZE(AA)
585 #endif
586
587 #ifdef LN
588         subl    $2 * SIZE, CO1
589 #endif
590
591 #if defined(LN) || defined(LT)
592         movlpd  %xmm2, 0 * SIZE(CO1)
593         movhpd  %xmm2, 1 * SIZE(CO1)
594 #else
595         movlpd  %xmm0, 0 * SIZE(CO1)
596         movhpd  %xmm0, 1 * SIZE(CO1)
597 #endif
598
599 #ifndef LN
600         addl    $2 * SIZE, CO1
601 #endif
602
603 #if defined(LT) || defined(RN)
604         movl    K,  %eax
605         subl    KK, %eax
606         leal    (,%eax, SIZE), %eax
607         leal    (AA, %eax, 2), AA
608 #ifdef LT
609         addl    $2 * SIZE, B
610 #endif
611 #endif
612
613 #ifdef LN
614         subl    $2, KK
615         movl    BORIG, B
616 #endif
617
618 #ifdef LT
619         addl    $2, KK
620 #endif
621
622 #ifdef RT
623         movl    K, %eax
624         movl    BORIG, B
625         sall    $1 + BASE_SHIFT, %eax
626         addl    %eax, AORIG
627 #endif
628
629         decl    %ebx                    # i --
630         jg      .L71
631         ALIGN_4
632
633 .L80:
634         movl    M,  %ebx
635         testl   $1, %ebx        # i = (m >> 2)
636         jle     .L99
637
638 #ifdef LN
639        movl     K, %eax
640        sall     $BASE_SHIFT, %eax
641        subl     %eax, AORIG
642 #endif
643
644 #if defined(LN) || defined(RT)
645         movl    KK, %eax
646         movl    AORIG, AA
647         leal    (AA, %eax, SIZE), AA
648 #endif
649
650         leal    BUFFER, BB
651
652 #if defined(LN) || defined(RT)
653         movl    KK, %eax
654         sall    $1 + BASE_SHIFT, %eax
655         addl    %eax, BB
656 #endif  
657
658         pxor    %xmm4, %xmm4
659         pxor    %xmm5, %xmm5
660         pxor    %xmm6, %xmm6
661         pxor    %xmm7, %xmm7
662
663         movlpd   0 * SIZE(AA), %xmm0
664         movlpd   4 * SIZE(AA), %xmm1
665         movlpd   0 * SIZE(BB), %xmm2
666         movlpd   8 * SIZE(BB), %xmm3
667
668 #if defined(LT) || defined(RN)
669         movl    KK, %eax
670 #else
671         movl    K, %eax
672         subl    KK, %eax
673 #endif
674         sarl    $3, %eax
675         je      .L85
676         ALIGN_4
677
678 .L82:
679         mulsd   %xmm0, %xmm2
680         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
681         movlpd   1 * SIZE(AA), %xmm0
682         mulsd    2 * SIZE(BB), %xmm0
683         addsd   %xmm2, %xmm4
684         movlpd  16 * SIZE(BB), %xmm2
685         addsd   %xmm0, %xmm5
686         movlpd   2 * SIZE(AA), %xmm0
687         mulsd    4 * SIZE(BB), %xmm0
688         addsd   %xmm0, %xmm6
689         movlpd   3 * SIZE(AA), %xmm0
690         mulsd    6 * SIZE(BB), %xmm0
691         addsd   %xmm0, %xmm7
692         movlpd   8 * SIZE(AA), %xmm0
693         mulsd   %xmm1, %xmm3
694         movlpd   5 * SIZE(AA), %xmm1
695         mulsd   10 * SIZE(BB), %xmm1
696         addsd   %xmm3, %xmm4
697         movlpd  24 * SIZE(BB), %xmm3
698         addsd   %xmm1, %xmm5
699         movlpd   6 * SIZE(AA), %xmm1
700         mulsd   12 * SIZE(BB), %xmm1
701         addsd   %xmm1, %xmm6
702         movlpd   7 * SIZE(AA), %xmm1
703         mulsd   14 * SIZE(BB), %xmm1
704         addsd   %xmm1, %xmm7
705         movlpd  12 * SIZE(AA), %xmm1
706
707         addl   $ 8 * SIZE, AA
708         addl   $16 * SIZE, BB
709         decl   %eax
710         jne    .L82
711         ALIGN_4
712
713 .L85:
714 #if defined(LT) || defined(RN)
715         movl    KK, %eax
716 #else
717         movl    K, %eax
718         subl    KK, %eax
719 #endif
720         andl    $7, %eax                # if (k & 1)
721         BRANCH
722         je .L88
723
724 .L86:
725         mulsd   %xmm0, %xmm2
726         addsd   %xmm2, %xmm4
727         movlpd   2 * SIZE(BB), %xmm2
728         movlpd   1 * SIZE(AA), %xmm0
729
730         addl    $1 * SIZE, AA
731         addl    $2 * SIZE, BB
732         decl    %eax
733         jg      .L86
734         ALIGN_4
735
736 .L88:
737         addsd   %xmm5, %xmm4
738         addsd   %xmm7, %xmm6
739         addsd   %xmm6, %xmm4
740
741 #if defined(LN) || defined(RT)
742         movl    KK, %eax
743 #ifdef LN
744         subl    $1, %eax
745 #else
746         subl    $1, %eax
747 #endif
748
749         movl    AORIG, AA
750         movl    BORIG, B
751         leal    BUFFER, BB
752
753         leal    (, %eax, SIZE), %eax
754         addl    %eax, AA
755         addl    %eax, B
756         leal    (BB, %eax, 2), BB
757 #endif
758
759 #if defined(LN) || defined(LT)
760         movlpd   0 * SIZE(B), %xmm2
761         subsd   %xmm4, %xmm2
762 #else
763         movlpd   0 * SIZE(AA), %xmm0
764         subsd   %xmm4, %xmm0
765 #endif
766
767 #ifdef LN
768         movlpd   0 * SIZE(AA), %xmm4
769         mulsd    %xmm4, %xmm2
770 #endif
771
772 #ifdef LT
773         movlpd   0 * SIZE(AA), %xmm4
774         mulsd    %xmm4, %xmm2
775 #endif
776
777 #ifdef RN
778         movlpd   0 * SIZE(B), %xmm4
779         mulsd    %xmm4, %xmm0
780 #endif
781
782 #ifdef RT
783         movlpd   0 * SIZE(B), %xmm4
784         mulsd    %xmm4, %xmm0
785 #endif
786
787 #if defined(LN) || defined(LT)
788         movlpd  %xmm2,   0 * SIZE(B)
789
790         movlpd  %xmm2,   0 * SIZE(BB)
791         movlpd  %xmm2,   1 * SIZE(BB)
792 #else
793         movlpd  %xmm0,   0 * SIZE(AA)
794 #endif
795
796 #ifdef LN
797         subl    $1 * SIZE, CO1
798 #endif
799
800 #if defined(LN) || defined(LT)
801         movlpd  %xmm2, 0 * SIZE(CO1)
802 #else
803         movlpd  %xmm0, 0 * SIZE(CO1)
804 #endif
805
806 #ifndef LN
807         addl    $1 * SIZE, CO1
808 #endif
809
810 #if defined(LT) || defined(RN)
811         movl    K,  %eax
812         subl    KK, %eax
813         leal    (AA,%eax, SIZE), AA
814 #ifdef LT
815         addl    $1 * SIZE, B
816 #endif
817 #endif
818
819 #ifdef LN
820         subl    $1, KK
821         movl    BORIG, B
822 #endif
823
824 #ifdef LT
825         addl    $1, KK
826 #endif
827
828 #ifdef RT
829         movl    K, %eax
830         movl    BORIG, B
831         sall    $BASE_SHIFT, %eax
832         addl    %eax, AORIG
833 #endif
834         ALIGN_4
835
836 .L99:
837 #ifdef LN
838        movl     K, %eax
839        leal     (B, %eax, SIZE), B
840 #endif
841
842 #if defined(LT) || defined(RN)
843         movl    K,  %eax
844         subl    KK, %eax
845         leal    (B,%eax, SIZE), B
846 #endif
847
848 #ifdef RN
849         addl    $1, KK
850 #endif
851
852 #ifdef RT
853         subl    $1, KK
854 #endif
855         ALIGN_4
856
857
858 .L30:
859         testl   $2, N
860         je      .L60
861
862 #ifdef LN
863         movl    OFFSET, %eax
864         addl    M, %eax
865         movl    %eax, KK
866 #endif  
867
868         leal    BUFFER, BB
869
870 #ifdef RT
871        movl     K, %eax
872        sall     $1 + BASE_SHIFT, %eax
873        subl     %eax, B
874 #endif
875
876 #if defined(LN) || defined(RT)
877         movl    KK, %eax
878         movl    B, BORIG
879         leal    (, %eax, SIZE), %eax
880         leal    (B,  %eax, 2), B
881         leal    (BB, %eax, 4), BB
882 #endif  
883
884 #ifdef LT
885         movl    OFFSET, %eax
886         movl    %eax, KK
887 #endif
888
889 #if defined(LT) || defined(RN)
890         movl    KK, %eax
891 #else
892         movl    K, %eax
893         subl    KK, %eax
894 #endif
895         sarl    $2, %eax
896         jle     .L35
897         ALIGN_4
898         
899 .L32:
900 #define COPYPREFETCH 40
901
902         prefetchnta     (COPYPREFETCH) * SIZE(B)
903
904         movq     0 * SIZE(B), %mm0
905         movq     1 * SIZE(B), %mm1
906         movq     2 * SIZE(B), %mm2
907         movq     3 * SIZE(B), %mm3
908         movq     4 * SIZE(B), %mm4
909         movq     5 * SIZE(B), %mm5
910         movq     6 * SIZE(B), %mm6
911         movq     7 * SIZE(B), %mm7
912
913         movq    %mm0,  0 * SIZE(BB)
914         movq    %mm0,  1 * SIZE(BB)
915         movq    %mm1,  2 * SIZE(BB)
916         movq    %mm1,  3 * SIZE(BB)
917         movq    %mm2,  4 * SIZE(BB)
918         movq    %mm2,  5 * SIZE(BB)
919         movq    %mm3,  6 * SIZE(BB)
920         movq    %mm3,  7 * SIZE(BB)
921
922         movq    %mm4,  8 * SIZE(BB)
923         movq    %mm4,  9 * SIZE(BB)
924         movq    %mm5, 10 * SIZE(BB)
925         movq    %mm5, 11 * SIZE(BB)
926         movq    %mm6, 12 * SIZE(BB)
927         movq    %mm6, 13 * SIZE(BB)
928         movq    %mm7, 14 * SIZE(BB)
929         movq    %mm7, 15 * SIZE(BB)
930
931         addl    $ 8 * SIZE, B
932         addl    $16 * SIZE, BB
933         decl    %eax
934         jne     .L32
935         ALIGN_2
936
937 .L35:
938 #if defined(LT) || defined(RN)
939         movl    KK, %eax
940 #else
941         movl    K, %eax
942         subl    KK, %eax
943 #endif
944         andl    $3, %eax
945         BRANCH
946         jle     .L40
947         ALIGN_2
948
949 .L36:
950         movq     0 * SIZE(B), %mm0
951         movq     1 * SIZE(B), %mm1
952
953         movq    %mm0,  0 * SIZE(BB)
954         movq    %mm0,  1 * SIZE(BB)
955         movq    %mm1,  2 * SIZE(BB)
956         movq    %mm1,  3 * SIZE(BB)
957
958         addl    $2 * SIZE, B
959         addl    $4 * SIZE, BB
960         decl    %eax
961         jne     .L36
962         ALIGN_4
963         
964 .L40:
965 #if defined(LT) || defined(RN)
966         movl    A, AA
967 #else
968         movl    A, %eax
969         movl    %eax, AORIG
970 #endif
971
972         leal    (, LDC, 2), %eax
973
974 #ifdef RT
975         subl    %eax, C
976 #endif
977         movl    C, CO1
978 #ifndef RT
979         addl    %eax, C
980 #endif
981
982         movl    M,  %ebx
983         sarl    $1, %ebx        # i = (m >> 2)
984         jle     .L50
985         ALIGN_4
986
987 .L41:
988 #ifdef LN
989        movl     K, %eax
990        sall     $1 + BASE_SHIFT, %eax
991        subl     %eax, AORIG
992 #endif
993
994 #if defined(LN) || defined(RT)
995         movl    KK, %eax
996         movl    AORIG, AA
997         leal    (, %eax, SIZE), %eax
998         leal    (AA, %eax, 2), AA
999 #endif
1000
1001         leal    BUFFER, BB
1002
1003 #if defined(LN) || defined(RT)
1004         movl    KK, %eax
1005         sall    $2 + BASE_SHIFT, %eax
1006         addl    %eax, BB
1007 #endif  
1008
1009         pxor    %xmm4, %xmm4
1010         pxor    %xmm5, %xmm5
1011         pxor    %xmm6, %xmm6
1012         pxor    %xmm7, %xmm7
1013
1014         movapd   0 * SIZE(AA), %xmm0
1015         movapd   8 * SIZE(AA), %xmm1
1016         movapd   0 * SIZE(BB), %xmm2
1017         movapd   8 * SIZE(BB), %xmm3
1018
1019 #ifdef LN
1020         prefetchw       -2 * SIZE(CO1)
1021         prefetchw       -2 * SIZE(CO1, LDC)
1022 #else
1023         prefetchw        1 * SIZE(CO1)
1024         prefetchw        1 * SIZE(CO1, LDC)
1025 #endif
1026
1027 #if defined(LT) || defined(RN)
1028         movl    KK, %eax
1029 #else
1030         movl    K, %eax
1031         subl    KK, %eax
1032 #endif
1033         sarl    $3, %eax
1034         je      .L45
1035         ALIGN_4
1036
1037 .L42:
1038         mulpd   %xmm0, %xmm2
1039 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
1040         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
1041 #endif
1042         mulpd    2 * SIZE(BB), %xmm0
1043         addpd   %xmm2, %xmm4
1044         movapd   4 * SIZE(BB), %xmm2
1045         addpd   %xmm0, %xmm5
1046         movapd   2 * SIZE(AA), %xmm0
1047
1048         mulpd   %xmm0, %xmm2
1049         mulpd    6 * SIZE(BB), %xmm0
1050         addpd   %xmm2, %xmm6
1051         movapd  16 * SIZE(BB), %xmm2
1052         addpd   %xmm0, %xmm7
1053         movapd   4 * SIZE(AA), %xmm0
1054
1055         mulpd   %xmm0, %xmm3
1056         mulpd   10 * SIZE(BB), %xmm0
1057         addpd   %xmm3, %xmm4
1058         movapd  12 * SIZE(BB), %xmm3
1059         addpd   %xmm0, %xmm5
1060         movapd   6 * SIZE(AA), %xmm0
1061
1062         mulpd   %xmm0, %xmm3
1063         mulpd   14 * SIZE(BB), %xmm0
1064         addpd   %xmm3, %xmm6
1065         movapd  24 * SIZE(BB), %xmm3
1066         addpd   %xmm0, %xmm7
1067         movapd  16 * SIZE(AA), %xmm0
1068
1069 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
1070         prefetcht0 (PREFETCHSIZE  + 8) * SIZE(AA)
1071 #endif
1072         mulpd   %xmm1, %xmm2
1073         mulpd   18 * SIZE(BB), %xmm1
1074         addpd   %xmm2, %xmm4
1075         movapd  20 * SIZE(BB), %xmm2
1076         addpd   %xmm1, %xmm5
1077         movapd  10 * SIZE(AA), %xmm1
1078
1079         mulpd   %xmm1, %xmm2
1080         mulpd   22 * SIZE(BB), %xmm1
1081         addpd   %xmm2, %xmm6
1082         movapd  32 * SIZE(BB), %xmm2
1083         addpd   %xmm1, %xmm7
1084         movapd  12 * SIZE(AA), %xmm1
1085
1086         mulpd   %xmm1, %xmm3
1087         mulpd   26 * SIZE(BB), %xmm1
1088         addpd   %xmm3, %xmm4
1089         movapd  28 * SIZE(BB), %xmm3
1090         addpd   %xmm1, %xmm5
1091         movapd  14 * SIZE(AA), %xmm1
1092
1093         mulpd   %xmm1, %xmm3
1094         mulpd   30 * SIZE(BB), %xmm1
1095         addpd   %xmm3, %xmm6
1096         movapd  40 * SIZE(BB), %xmm3
1097         addpd   %xmm1, %xmm7
1098         movapd  24 * SIZE(AA), %xmm1
1099
1100         addl   $16 * SIZE, AA
1101         addl   $32 * SIZE, BB
1102         decl   %eax
1103         jne    .L42
1104         ALIGN_4
1105
1106 .L45:
1107 #if defined(LT) || defined(RN)
1108         movl    KK, %eax
1109 #else
1110         movl    K, %eax
1111         subl    KK, %eax
1112 #endif
1113         andl    $7, %eax                # if (k & 1)
1114         BRANCH
1115         je .L48
1116         ALIGN_3
1117
1118 .L46:
1119         mulpd   %xmm0, %xmm2
1120         mulpd    2 * SIZE(BB), %xmm0
1121         addpd   %xmm2, %xmm4
1122         movapd   4 * SIZE(BB), %xmm2
1123         addpd   %xmm0, %xmm5
1124         movapd   2 * SIZE(AA), %xmm0
1125
1126         addl    $2 * SIZE, AA
1127         addl    $4 * SIZE, BB
1128         decl    %eax
1129         jg      .L46
1130         ALIGN_4
1131
1132 .L48:
1133         addpd   %xmm6, %xmm4
1134         addpd   %xmm7, %xmm5
1135
1136 #if defined(LN) || defined(RT)
1137         movl    KK, %eax
1138 #ifdef LN
1139         subl    $2, %eax
1140 #else
1141         subl    $2, %eax
1142 #endif
1143
1144         movl    AORIG, AA
1145         movl    BORIG, B
1146         leal    BUFFER, BB
1147
1148         leal    (, %eax, SIZE), %eax
1149         leal    (AA, %eax, 2), AA
1150         leal    (B,  %eax, 2), B
1151         leal    (BB, %eax, 4), BB
1152 #endif
1153
1154 #if defined(LN) || defined(LT)
1155         movapd   %xmm4, %xmm0
1156         unpcklpd %xmm5, %xmm4
1157         unpckhpd %xmm5, %xmm0
1158
1159         movapd   0 * SIZE(B), %xmm2
1160         movapd   2 * SIZE(B), %xmm3
1161
1162         subpd   %xmm4,  %xmm2
1163         subpd   %xmm0,  %xmm3
1164 #else
1165         movapd   0 * SIZE(AA), %xmm0
1166         movapd   2 * SIZE(AA), %xmm1
1167
1168         subpd   %xmm4, %xmm0
1169         subpd   %xmm5, %xmm1
1170 #endif
1171
1172 #ifdef LN
1173         movlpd   3 * SIZE(AA), %xmm4
1174         movhpd   3 * SIZE(AA), %xmm4
1175         mulpd    %xmm4, %xmm3
1176
1177         movlpd   2 * SIZE(AA), %xmm4
1178         movhpd   2 * SIZE(AA), %xmm4
1179         mulpd    %xmm3, %xmm4
1180         subpd    %xmm4, %xmm2
1181
1182         movlpd   0 * SIZE(AA), %xmm4
1183         movhpd   0 * SIZE(AA), %xmm4
1184         mulpd    %xmm4, %xmm2
1185
1186 #endif
1187
1188 #ifdef LT
1189         movlpd   0 * SIZE(AA), %xmm4
1190         movhpd   0 * SIZE(AA), %xmm4
1191         mulpd    %xmm4, %xmm2
1192
1193         movlpd   1 * SIZE(AA), %xmm4
1194         movhpd   1 * SIZE(AA), %xmm4
1195         mulpd    %xmm2, %xmm4
1196         subpd    %xmm4, %xmm3
1197
1198         movlpd   3 * SIZE(AA), %xmm4
1199         movhpd   3 * SIZE(AA), %xmm4
1200         mulpd    %xmm4, %xmm3
1201 #endif
1202
1203 #ifdef RN
1204         movlpd   0 * SIZE(B), %xmm4
1205         movhpd   0 * SIZE(B), %xmm4
1206         mulpd    %xmm4, %xmm0
1207         movlpd   1 * SIZE(B), %xmm4
1208         movhpd   1 * SIZE(B), %xmm4
1209         mulpd    %xmm0, %xmm4
1210         subpd    %xmm4, %xmm1
1211
1212         movlpd   3 * SIZE(B), %xmm4
1213         movhpd   3 * SIZE(B), %xmm4
1214         mulpd    %xmm4, %xmm1
1215 #endif
1216
1217 #ifdef RT
1218         movlpd   3 * SIZE(B), %xmm4
1219         movhpd   3 * SIZE(B), %xmm4
1220         mulpd    %xmm4, %xmm1
1221         movlpd   2 * SIZE(B), %xmm4
1222         movhpd   2 * SIZE(B), %xmm4
1223         mulpd    %xmm1, %xmm4
1224         subpd    %xmm4, %xmm0
1225
1226         movlpd   0 * SIZE(B), %xmm4
1227         movhpd   0 * SIZE(B), %xmm4
1228         mulpd    %xmm4, %xmm0
1229 #endif
1230
1231 #if defined(LN) || defined(LT)
1232         movapd  %xmm2,   0 * SIZE(B)
1233         movapd  %xmm3,   2 * SIZE(B)
1234
1235         movlpd  %xmm2,   0 * SIZE(BB)
1236         movlpd  %xmm2,   1 * SIZE(BB)
1237         movhpd  %xmm2,   2 * SIZE(BB)
1238         movhpd  %xmm2,   3 * SIZE(BB)
1239         movlpd  %xmm3,   4 * SIZE(BB)
1240         movlpd  %xmm3,   5 * SIZE(BB)
1241         movhpd  %xmm3,   6 * SIZE(BB)
1242         movhpd  %xmm3,   7 * SIZE(BB)
1243 #else
1244         movapd  %xmm0,   0 * SIZE(AA)
1245         movapd  %xmm1,   2 * SIZE(AA)
1246 #endif
1247
1248 #ifdef LN
1249         subl    $2 * SIZE, CO1
1250 #endif
1251
1252 #if defined(LN) || defined(LT)
1253         movlpd  %xmm2, 0 * SIZE(CO1)
1254         movlpd  %xmm3, 1 * SIZE(CO1)
1255         movhpd  %xmm2, 0 * SIZE(CO1, LDC, 1)
1256         movhpd  %xmm3, 1 * SIZE(CO1, LDC, 1)
1257 #else
1258         movlpd  %xmm0, 0 * SIZE(CO1)
1259         movhpd  %xmm0, 1 * SIZE(CO1)
1260         movlpd  %xmm1, 0 * SIZE(CO1, LDC, 1)
1261         movhpd  %xmm1, 1 * SIZE(CO1, LDC, 1)
1262 #endif
1263
1264 #ifndef LN
1265         addl    $2 * SIZE, CO1
1266 #endif
1267
1268 #if defined(LT) || defined(RN)
1269         movl    K,  %eax
1270         subl    KK, %eax
1271         leal    (,%eax, SIZE), %eax
1272         leal    (AA, %eax, 2), AA
1273 #ifdef LT
1274         addl    $4 * SIZE, B
1275 #endif
1276 #endif
1277
1278 #ifdef LN
1279         subl    $2, KK
1280         movl    BORIG, B
1281 #endif
1282
1283 #ifdef LT
1284         addl    $2, KK
1285 #endif
1286
1287 #ifdef RT
1288         movl    K, %eax
1289         movl    BORIG, B
1290         sall    $1 + BASE_SHIFT, %eax
1291         addl    %eax, AORIG
1292 #endif
1293
1294         decl    %ebx                    # i --
1295         jg      .L41
1296         ALIGN_4
1297
1298 .L50:
1299         movl    M,  %ebx
1300         testl   $1, %ebx        # i = (m >> 2)
1301         jle     .L59
1302
1303 #ifdef LN
1304        movl     K, %eax
1305        sall     $BASE_SHIFT, %eax
1306        subl     %eax, AORIG
1307 #endif
1308
1309 #if defined(LN) || defined(RT)
1310         movl    KK, %eax
1311         movl    AORIG, AA
1312         leal    (AA, %eax, SIZE), AA
1313 #endif
1314
1315         leal    BUFFER, BB
1316
1317 #if defined(LN) || defined(RT)
1318         movl    KK, %eax
1319         sall    $2 + BASE_SHIFT, %eax
1320         addl    %eax, BB
1321 #endif  
1322
1323         pxor    %xmm4, %xmm4
1324         pxor    %xmm5, %xmm5
1325         pxor    %xmm6, %xmm6
1326         pxor    %xmm7, %xmm7
1327
1328         movlpd   0 * SIZE(AA), %xmm0
1329         movlpd   4 * SIZE(AA), %xmm1
1330         movlpd   0 * SIZE(BB), %xmm2
1331         movlpd   8 * SIZE(BB), %xmm3
1332
1333 #if defined(LT) || defined(RN)
1334         movl    KK, %eax
1335 #else
1336         movl    K, %eax
1337         subl    KK, %eax
1338 #endif
1339         sarl    $3, %eax
1340         je      .L55
1341         ALIGN_4
1342
1343 .L52:
1344         mulsd   %xmm0, %xmm2
1345         PREFETCH (PREFETCHSIZE  + 0) * SIZE(AA)
1346         mulsd    2 * SIZE(BB), %xmm0
1347         addsd   %xmm2, %xmm4
1348         movlpd   4 * SIZE(BB), %xmm2
1349         addsd   %xmm0, %xmm5
1350         movlpd   1 * SIZE(AA), %xmm0
1351
1352         mulsd   %xmm0, %xmm2
1353         mulsd    6 * SIZE(BB), %xmm0
1354         addsd   %xmm2, %xmm6
1355         movlpd  16 * SIZE(BB), %xmm2
1356         addsd   %xmm0, %xmm7
1357         movlpd   2 * SIZE(AA), %xmm0
1358
1359         mulsd   %xmm0, %xmm3
1360         mulsd   10 * SIZE(BB), %xmm0
1361         addsd   %xmm3, %xmm4
1362         movlpd  12 * SIZE(BB), %xmm3
1363         addsd   %xmm0, %xmm5
1364         movlpd   3 * SIZE(AA), %xmm0
1365
1366         mulsd   %xmm0, %xmm3
1367         mulsd   14 * SIZE(BB), %xmm0
1368         addsd   %xmm3, %xmm6
1369         movlpd  24 * SIZE(BB), %xmm3
1370         addsd   %xmm0, %xmm7
1371         movlpd   8 * SIZE(AA), %xmm0
1372
1373         mulsd   %xmm1, %xmm2
1374         mulsd   18 * SIZE(BB), %xmm1
1375         addsd   %xmm2, %xmm4
1376         movlpd  20 * SIZE(BB), %xmm2
1377         addsd   %xmm1, %xmm5
1378         movlpd   5 * SIZE(AA), %xmm1
1379
1380         mulsd   %xmm1, %xmm2
1381         mulsd   22 * SIZE(BB), %xmm1
1382         addsd   %xmm2, %xmm6
1383         movlpd  32 * SIZE(BB), %xmm2
1384         addsd   %xmm1, %xmm7
1385         movlpd   6 * SIZE(AA), %xmm1
1386
1387         mulsd   %xmm1, %xmm3
1388         mulsd   26 * SIZE(BB), %xmm1
1389         addsd   %xmm3, %xmm4
1390         movlpd  28 * SIZE(BB), %xmm3
1391         addsd   %xmm1, %xmm5
1392         movlpd   7 * SIZE(AA), %xmm1
1393
1394         mulsd   %xmm1, %xmm3
1395         mulsd   30 * SIZE(BB), %xmm1
1396         addsd   %xmm3, %xmm6
1397         movlpd  40 * SIZE(BB), %xmm3
1398         addsd   %xmm1, %xmm7
1399         movlpd  12 * SIZE(AA), %xmm1
1400
1401         addl   $ 8 * SIZE, AA
1402         addl   $32 * SIZE, BB
1403         decl   %eax
1404         jne    .L52
1405         ALIGN_4
1406
1407 .L55:
1408 #if defined(LT) || defined(RN)
1409         movl    KK, %eax
1410 #else
1411         movl    K, %eax
1412         subl    KK, %eax
1413 #endif
1414         andl    $7, %eax                # if (k & 1)
1415         BRANCH
1416         je .L58
1417
1418 .L56:
1419         mulsd   %xmm0, %xmm2
1420         mulsd    2 * SIZE(BB), %xmm0
1421         addsd   %xmm2, %xmm4
1422         movlpd   4 * SIZE(BB), %xmm2
1423         addsd   %xmm0, %xmm5
1424         movlpd   1 * SIZE(AA), %xmm0
1425
1426         addl    $1 * SIZE, AA
1427         addl    $4 * SIZE, BB
1428         decl    %eax
1429         jg      .L56
1430         ALIGN_4
1431
1432 .L58:
1433         addsd   %xmm6, %xmm4
1434         addsd   %xmm7, %xmm5
1435
1436 #if defined(LN) || defined(RT)
1437         movl    KK, %eax
1438 #ifdef LN
1439         subl    $1, %eax
1440 #else
1441         subl    $2, %eax
1442 #endif
1443
1444         movl    AORIG, AA
1445         movl    BORIG, B
1446         leal    BUFFER, BB
1447
1448         leal    (, %eax, SIZE), %eax
1449         addl    %eax, AA
1450         leal    (B,  %eax, 2), B
1451         leal    (BB, %eax, 4), BB
1452 #endif
1453
1454 #if defined(LN) || defined(LT)
1455         unpcklpd %xmm5, %xmm4
1456
1457         movapd   0 * SIZE(B), %xmm2
1458
1459         subpd   %xmm4,  %xmm2
1460 #else
1461         movlpd   0 * SIZE(AA), %xmm0
1462         movlpd   1 * SIZE(AA), %xmm1
1463
1464         subsd   %xmm4, %xmm0
1465         subsd   %xmm5, %xmm1
1466 #endif
1467
1468 #ifdef LN
1469         movlpd   0 * SIZE(AA), %xmm4
1470         movhpd   0 * SIZE(AA), %xmm4
1471         mulpd    %xmm4, %xmm2
1472 #endif
1473
1474 #ifdef LT
1475         movlpd   0 * SIZE(AA), %xmm4
1476         movhpd   0 * SIZE(AA), %xmm4
1477         mulpd    %xmm4, %xmm2
1478 #endif
1479
1480 #ifdef RN
1481         movlpd   0 * SIZE(B), %xmm4
1482         mulsd    %xmm4, %xmm0
1483         movlpd   1 * SIZE(B), %xmm4
1484         mulsd    %xmm0, %xmm4
1485         subsd    %xmm4, %xmm1
1486
1487         movlpd   3 * SIZE(B), %xmm4
1488         mulsd    %xmm4, %xmm1
1489 #endif
1490
1491 #ifdef RT
1492         movlpd   3 * SIZE(B), %xmm4
1493         mulsd    %xmm4, %xmm1
1494         movlpd   2 * SIZE(B), %xmm4
1495         mulsd    %xmm1, %xmm4
1496         subsd    %xmm4, %xmm0
1497
1498         movlpd   0 * SIZE(B), %xmm4
1499         mulsd    %xmm4, %xmm0
1500 #endif
1501
1502 #if defined(LN) || defined(LT)
1503         movapd  %xmm2,   0 * SIZE(B)
1504
1505         movlpd  %xmm2,   0 * SIZE(BB)
1506         movlpd  %xmm2,   1 * SIZE(BB)
1507         movhpd  %xmm2,   2 * SIZE(BB)
1508         movhpd  %xmm2,   3 * SIZE(BB)
1509 #else
1510         movlpd  %xmm0,   0 * SIZE(AA)
1511         movlpd  %xmm1,   1 * SIZE(AA)
1512 #endif
1513
1514 #ifdef LN
1515         subl    $1 * SIZE, CO1
1516 #endif
1517
1518 #if defined(LN) || defined(LT)
1519         movlpd  %xmm2, 0 * SIZE(CO1)
1520         movhpd  %xmm2, 0 * SIZE(CO1, LDC, 1)
1521 #else
1522         movlpd  %xmm0, 0 * SIZE(CO1)
1523         movlpd  %xmm1, 0 * SIZE(CO1, LDC, 1)
1524 #endif
1525
1526 #ifndef LN
1527         addl    $1 * SIZE, CO1
1528 #endif
1529
1530 #if defined(LT) || defined(RN)
1531         movl    K,  %eax
1532         subl    KK, %eax
1533         leal    (AA,%eax, SIZE), AA
1534 #ifdef LT
1535         addl    $2 * SIZE, B
1536 #endif
1537 #endif
1538
1539 #ifdef LN
1540         subl    $1, KK
1541         movl    BORIG, B
1542 #endif
1543
1544 #ifdef LT
1545         addl    $1, KK
1546 #endif
1547
1548 #ifdef RT
1549         movl    K, %eax
1550         movl    BORIG, B
1551         sall    $BASE_SHIFT, %eax
1552         addl    %eax, AORIG
1553 #endif
1554         ALIGN_4
1555
1556 .L59:
1557 #ifdef LN
1558        movl     K, %eax
1559        leal     (, %eax, SIZE), %eax
1560        leal     (B, %eax, 2), B
1561 #endif
1562
1563 #if defined(LT) || defined(RN)
1564         movl    K,  %eax
1565         subl    KK, %eax
1566         leal    (,%eax, SIZE), %eax
1567         leal    (B,  %eax, 2), B
1568 #endif
1569
1570 #ifdef RN
1571         addl    $2, KK
1572 #endif
1573
1574 #ifdef RT
1575         subl    $2, KK
1576 #endif
1577         ALIGN_4
1578
1579 .L60:
1580         movl    N,  %eax
1581         sarl    $2, %eax
1582         movl    %eax, J
1583         jle     .L999
1584         ALIGN_2
1585
1586 .L01:
1587 #ifdef LN
1588         movl    OFFSET, %eax
1589         addl    M, %eax
1590         movl    %eax, KK
1591 #endif  
1592
1593         leal    BUFFER, BB
1594
1595 #ifdef RT
1596        movl     K, %eax
1597        sall     $2 + BASE_SHIFT, %eax
1598        subl     %eax, B
1599 #endif
1600
1601 #if defined(LN) || defined(RT)
1602         movl    KK, %eax
1603         movl    B, BORIG
1604         leal    (, %eax, SIZE), %eax
1605         leal    (B,  %eax, 4), B
1606         leal    (BB, %eax, 8), BB
1607 #endif  
1608
1609 #ifdef LT
1610         movl    OFFSET, %eax
1611         movl    %eax, KK
1612 #endif
1613
1614 #if defined(LT) || defined(RN)
1615         movl    KK, %eax
1616 #else
1617         movl    K, %eax
1618         subl    KK, %eax
1619 #endif
1620         sarl    $1, %eax
1621         jle     .L05
1622         ALIGN_4
1623         
1624 .L02:
1625 #define COPYPREFETCH 40
1626
1627         prefetchnta     (COPYPREFETCH) * SIZE(B)
1628
1629         movq     0 * SIZE(B), %mm0
1630         movq     1 * SIZE(B), %mm1
1631         movq     2 * SIZE(B), %mm2
1632         movq     3 * SIZE(B), %mm3
1633         movq     4 * SIZE(B), %mm4
1634         movq     5 * SIZE(B), %mm5
1635         movq     6 * SIZE(B), %mm6
1636         movq     7 * SIZE(B), %mm7
1637
1638         movq    %mm0,  0 * SIZE(BB)
1639         movq    %mm0,  1 * SIZE(BB)
1640         movq    %mm1,  2 * SIZE(BB)
1641         movq    %mm1,  3 * SIZE(BB)
1642         movq    %mm2,  4 * SIZE(BB)
1643         movq    %mm2,  5 * SIZE(BB)
1644         movq    %mm3,  6 * SIZE(BB)
1645         movq    %mm3,  7 * SIZE(BB)
1646
1647         movq    %mm4,  8 * SIZE(BB)
1648         movq    %mm4,  9 * SIZE(BB)
1649         movq    %mm5, 10 * SIZE(BB)
1650         movq    %mm5, 11 * SIZE(BB)
1651         movq    %mm6, 12 * SIZE(BB)
1652         movq    %mm6, 13 * SIZE(BB)
1653         movq    %mm7, 14 * SIZE(BB)
1654         movq    %mm7, 15 * SIZE(BB)
1655
1656         addl    $ 8 * SIZE, B
1657         addl    $16 * SIZE, BB
1658         decl    %eax
1659         jne     .L02
1660         ALIGN_2
1661
1662 .L05:
1663 #if defined(LT) || defined(RN)
1664         movl    KK, %eax
1665 #else
1666         movl    K, %eax
1667         subl    KK, %eax
1668 #endif
1669         andl    $1, %eax
1670         BRANCH
1671         jle     .L10
1672
1673         movq     0 * SIZE(B), %mm0
1674         movq     1 * SIZE(B), %mm1
1675         movq     2 * SIZE(B), %mm2
1676         movq     3 * SIZE(B), %mm3
1677
1678         movq    %mm0,  0 * SIZE(BB)
1679         movq    %mm0,  1 * SIZE(BB)
1680         movq    %mm1,  2 * SIZE(BB)
1681         movq    %mm1,  3 * SIZE(BB)
1682         movq    %mm2,  4 * SIZE(BB)
1683         movq    %mm2,  5 * SIZE(BB)
1684         movq    %mm3,  6 * SIZE(BB)
1685         movq    %mm3,  7 * SIZE(BB)
1686
1687         addl    $4 * SIZE, B
1688         ALIGN_4
1689         
1690 .L10:
1691 #if defined(LT) || defined(RN)
1692         movl    A, AA
1693 #else
1694         movl    A, %eax
1695         movl    %eax, AORIG
1696 #endif
1697
1698         leal    (, LDC, 4), %eax
1699
1700 #ifdef RT
1701         subl    %eax, C
1702 #endif
1703         movl    C, CO1
1704 #ifndef RT
1705         addl    %eax, C
1706 #endif
1707
1708         movl    M,  %ebx
1709         sarl    $1, %ebx        # i = (m >> 2)
1710         jle     .L20
1711         ALIGN_4
1712
1713 .L11:
1714 #ifdef LN
1715        movl     K, %eax
1716        sall     $1 + BASE_SHIFT, %eax
1717        subl     %eax, AORIG
1718 #endif
1719
1720 #if defined(LN) || defined(RT)
1721         movl    KK, %eax
1722         movl    AORIG, AA
1723         leal    (, %eax, SIZE), %eax
1724         leal    (AA, %eax, 2), AA
1725 #endif
1726
1727         leal    BUFFER, BB
1728
1729 #if defined(LN) || defined(RT)
1730         movl    KK, %eax
1731         sall    $3 + BASE_SHIFT, %eax
1732         addl    %eax, BB
1733 #endif  
1734
1735         pxor    %xmm4, %xmm4
1736         pxor    %xmm5, %xmm5
1737         pxor    %xmm6, %xmm6
1738         pxor    %xmm7, %xmm7
1739
1740         movapd   0 * SIZE(AA), %xmm0
1741         movapd   8 * SIZE(AA), %xmm1
1742         movapd   0 * SIZE(BB), %xmm2
1743         movapd   8 * SIZE(BB), %xmm3
1744
1745         leal    (LDC, LDC, 2), %eax
1746
1747 #ifdef LN
1748         prefetchw       -2 * SIZE(CO1)
1749         prefetchw       -2 * SIZE(CO1, LDC)
1750         prefetchw       -2 * SIZE(CO1, LDC, 2)
1751         prefetchw       -2 * SIZE(CO1, %eax)
1752 #else
1753         prefetchw        1 * SIZE(CO1)
1754         prefetchw        1 * SIZE(CO1, LDC)
1755         prefetchw        1 * SIZE(CO1, LDC, 2)
1756         prefetchw        1 * SIZE(CO1, %eax)
1757 #endif
1758
1759 #if defined(LT) || defined(RN)
1760         movl    KK, %eax
1761 #else
1762         movl    K, %eax
1763         subl    KK, %eax
1764 #endif
1765
1766 #if 1
1767         andl    $-8, %eax
1768         sall    $4, %eax
1769         je      .L15
1770 .L1X:   
1771         KERNEL1(16  *  0)
1772         KERNEL2(16  *  0)
1773         KERNEL3(16  *  0)
1774         KERNEL4(16  *  0)
1775         KERNEL5(16  *  0)
1776         KERNEL6(16  *  0)
1777         KERNEL7(16  *  0)
1778         KERNEL8(16  *  0)
1779         cmpl    $128 *  1, %eax
1780         jle     .L12
1781         KERNEL1(16  *  1)
1782         KERNEL2(16  *  1)
1783         KERNEL3(16  *  1)
1784         KERNEL4(16  *  1)
1785         KERNEL5(16  *  1)
1786         KERNEL6(16  *  1)
1787         KERNEL7(16  *  1)
1788         KERNEL8(16  *  1)
1789         cmpl    $128 *  2, %eax
1790         jle     .L12
1791         KERNEL1(16  *  2)
1792         KERNEL2(16  *  2)
1793         KERNEL3(16  *  2)
1794         KERNEL4(16  *  2)
1795         KERNEL5(16  *  2)
1796         KERNEL6(16  *  2)
1797         KERNEL7(16  *  2)
1798         KERNEL8(16  *  2)
1799         cmpl    $128 *  3, %eax
1800         jle     .L12
1801         KERNEL1(16  *  3)
1802         KERNEL2(16  *  3)
1803         KERNEL3(16  *  3)
1804         KERNEL4(16  *  3)
1805         KERNEL5(16  *  3)
1806         KERNEL6(16  *  3)
1807         KERNEL7(16  *  3)
1808         KERNEL8(16  *  3)
1809         cmpl    $128 *  4, %eax
1810         jle     .L12
1811         KERNEL1(16  *  4)
1812         KERNEL2(16  *  4)
1813         KERNEL3(16  *  4)
1814         KERNEL4(16  *  4)
1815         KERNEL5(16  *  4)
1816         KERNEL6(16  *  4)
1817         KERNEL7(16  *  4)
1818         KERNEL8(16  *  4)
1819         cmpl    $128 *  5, %eax
1820         jle     .L12
1821         KERNEL1(16  *  5)
1822         KERNEL2(16  *  5)
1823         KERNEL3(16  *  5)
1824         KERNEL4(16  *  5)
1825         KERNEL5(16  *  5)
1826         KERNEL6(16  *  5)
1827         KERNEL7(16  *  5)
1828         KERNEL8(16  *  5)
1829         cmpl    $128 *  6, %eax
1830         jle     .L12
1831         KERNEL1(16  *  6)
1832         KERNEL2(16  *  6)
1833         KERNEL3(16  *  6)
1834         KERNEL4(16  *  6)
1835         KERNEL5(16  *  6)
1836         KERNEL6(16  *  6)
1837         KERNEL7(16  *  6)
1838         KERNEL8(16  *  6)
1839         cmpl    $128 *  7, %eax
1840         jle     .L12
1841         KERNEL1(16  *  7)
1842         KERNEL2(16  *  7)
1843         KERNEL3(16  *  7)
1844         KERNEL4(16  *  7)
1845         KERNEL5(16  *  7)
1846         KERNEL6(16  *  7)
1847         KERNEL7(16  *  7)
1848         KERNEL8(16  *  7)
1849
1850         addl    $128 * 4  * SIZE, BB
1851         addl    $128 * 1  * SIZE, AA
1852         subl    $128 * 8, %eax
1853         jg      .L1X
1854         jmp     .L15
1855
1856 .L12:
1857         leal    (AA, %eax, 1), AA
1858         leal    (BB, %eax, 4), BB
1859         ALIGN_4
1860 #else
1861
1862         sarl    $3, %eax
1863         je      .L15
1864         ALIGN_4
1865
1866 .L12:
1867         KERNEL1(16  *  0)
1868         KERNEL2(16  *  0)
1869         KERNEL3(16  *  0)
1870         KERNEL4(16  *  0)
1871         KERNEL5(16  *  0)
1872         KERNEL6(16  *  0)
1873         KERNEL7(16  *  0)
1874         KERNEL8(16  *  0)
1875
1876
1877         addl   $64 * SIZE, BB
1878         addl   $16 * SIZE, AA
1879         decl   %eax
1880         jne    .L12
1881         ALIGN_4
1882 #endif
1883
1884 .L15:
1885 #if defined(LT) || defined(RN)
1886         movl    KK, %eax
1887 #else
1888         movl    K, %eax
1889         subl    KK, %eax
1890 #endif
1891         andl    $7, %eax                # if (k & 1)
1892         BRANCH
1893         je .L18
1894         ALIGN_3
1895
1896 .L16:
1897         mulpd    %xmm0, %xmm2
1898         addpd    %xmm2, %xmm4
1899         movapd   2 * SIZE(BB), %xmm2
1900         mulpd    %xmm0, %xmm2
1901         addpd    %xmm2, %xmm5
1902         movapd   4 * SIZE(BB), %xmm2
1903         mulpd    %xmm0, %xmm2
1904         mulpd    6 * SIZE(BB), %xmm0
1905         addpd    %xmm2, %xmm6
1906         movapd   8 * SIZE(BB), %xmm2
1907         addpd    %xmm0, %xmm7
1908         movapd   2 * SIZE(AA), %xmm0
1909
1910         addl    $2 * SIZE, AA
1911         addl    $8 * SIZE, BB
1912         decl    %eax
1913         jg      .L16
1914         ALIGN_4
1915
1916 .L18:
1917 #if defined(LN) || defined(RT)
1918         movl    KK, %eax
1919 #ifdef LN
1920         subl    $2, %eax
1921 #else
1922         subl    $4, %eax
1923 #endif
1924
1925         movl    AORIG, AA
1926         movl    BORIG, B
1927         leal    BUFFER, BB
1928
1929         leal    (, %eax, SIZE), %eax
1930         leal    (AA, %eax, 2), AA
1931         leal    (B,  %eax, 4), B
1932         leal    (BB, %eax, 8), BB
1933 #endif
1934
1935 #if defined(LN) || defined(LT)
1936         movapd   %xmm4, %xmm0
1937         unpcklpd %xmm5, %xmm4
1938         unpckhpd %xmm5, %xmm0
1939
1940         movapd   %xmm6, %xmm1
1941         unpcklpd %xmm7, %xmm6
1942         unpckhpd %xmm7, %xmm1
1943
1944         movapd   0 * SIZE(B), %xmm2
1945         movapd   2 * SIZE(B), %xmm5
1946         movapd   4 * SIZE(B), %xmm3
1947         movapd   6 * SIZE(B), %xmm7
1948
1949         subpd   %xmm4,  %xmm2
1950         subpd   %xmm6,  %xmm5
1951         subpd   %xmm0,  %xmm3
1952         subpd   %xmm1,  %xmm7
1953 #else
1954         movapd   0 * SIZE(AA), %xmm0
1955         movapd   2 * SIZE(AA), %xmm1
1956         movapd   4 * SIZE(AA), %xmm2
1957         movapd   6 * SIZE(AA), %xmm3
1958
1959         subpd   %xmm4, %xmm0
1960         subpd   %xmm5, %xmm1
1961         subpd   %xmm6, %xmm2
1962         subpd   %xmm7, %xmm3
1963 #endif
1964
1965 #ifdef LN
1966         movlpd   3 * SIZE(AA), %xmm4
1967         movhpd   3 * SIZE(AA), %xmm4
1968         mulpd    %xmm4, %xmm3
1969         mulpd    %xmm4, %xmm7
1970
1971         movlpd   2 * SIZE(AA), %xmm4
1972         movhpd   2 * SIZE(AA), %xmm4
1973         movapd   %xmm4, %xmm6
1974         mulpd    %xmm3, %xmm4
1975         subpd    %xmm4, %xmm2
1976         mulpd    %xmm7, %xmm6
1977         subpd    %xmm6, %xmm5
1978
1979         movlpd   0 * SIZE(AA), %xmm4
1980         movhpd   0 * SIZE(AA), %xmm4
1981         mulpd    %xmm4, %xmm2
1982         mulpd    %xmm4, %xmm5
1983
1984 #endif
1985
1986 #ifdef LT
1987         movlpd   0 * SIZE(AA), %xmm4
1988         movhpd   0 * SIZE(AA), %xmm4
1989         mulpd    %xmm4, %xmm2
1990         mulpd    %xmm4, %xmm5
1991
1992         movlpd   1 * SIZE(AA), %xmm4
1993         movhpd   1 * SIZE(AA), %xmm4
1994         movapd   %xmm4, %xmm6
1995         mulpd    %xmm2, %xmm4
1996         subpd    %xmm4, %xmm3
1997         mulpd    %xmm5, %xmm6
1998         subpd    %xmm6, %xmm7
1999
2000         movlpd   3 * SIZE(AA), %xmm4
2001         movhpd   3 * SIZE(AA), %xmm4
2002         mulpd    %xmm4, %xmm3
2003         mulpd    %xmm4, %xmm7
2004 #endif
2005
2006 #ifdef RN
2007         movlpd   0 * SIZE(B), %xmm4
2008         movhpd   0 * SIZE(B), %xmm4
2009         mulpd    %xmm4, %xmm0
2010         movlpd   1 * SIZE(B), %xmm4
2011         movhpd   1 * SIZE(B), %xmm4
2012         mulpd    %xmm0, %xmm4
2013         subpd    %xmm4, %xmm1
2014         movlpd   2 * SIZE(B), %xmm4
2015         movhpd   2 * SIZE(B), %xmm4
2016         mulpd    %xmm0, %xmm4
2017         subpd    %xmm4, %xmm2
2018         movlpd   3 * SIZE(B), %xmm4
2019         movhpd   3 * SIZE(B), %xmm4
2020         mulpd    %xmm0, %xmm4
2021         subpd    %xmm4, %xmm3
2022
2023         movlpd   5 * SIZE(B), %xmm4
2024         movhpd   5 * SIZE(B), %xmm4
2025         mulpd    %xmm4, %xmm1
2026         movlpd   6 * SIZE(B), %xmm4
2027         movhpd   6 * SIZE(B), %xmm4
2028         mulpd    %xmm1, %xmm4
2029         subpd    %xmm4, %xmm2
2030         movlpd   7 * SIZE(B), %xmm4
2031         movhpd   7 * SIZE(B), %xmm4
2032         mulpd    %xmm1, %xmm4
2033         subpd    %xmm4, %xmm3
2034
2035         movlpd  10 * SIZE(B), %xmm4
2036         movhpd  10 * SIZE(B), %xmm4
2037         mulpd    %xmm4, %xmm2
2038         movlpd  11 * SIZE(B), %xmm4
2039         movhpd  11 * SIZE(B), %xmm4
2040         mulpd    %xmm2, %xmm4
2041         subpd    %xmm4, %xmm3
2042
2043         movlpd  15 * SIZE(B), %xmm4
2044         movhpd  15 * SIZE(B), %xmm4
2045         mulpd    %xmm4, %xmm3
2046 #endif
2047
2048 #ifdef RT
2049         movlpd  15 * SIZE(B), %xmm4
2050         movhpd  15 * SIZE(B), %xmm4
2051         mulpd    %xmm4, %xmm3
2052         movlpd  14 * SIZE(B), %xmm4
2053         movhpd  14 * SIZE(B), %xmm4
2054         mulpd    %xmm3, %xmm4
2055         subpd    %xmm4, %xmm2
2056         movlpd  13 * SIZE(B), %xmm4
2057         movhpd  13 * SIZE(B), %xmm4
2058         mulpd    %xmm3, %xmm4
2059         subpd    %xmm4, %xmm1
2060         movlpd  12 * SIZE(B), %xmm4
2061         movhpd  12 * SIZE(B), %xmm4
2062         mulpd    %xmm3, %xmm4
2063         subpd    %xmm4, %xmm0
2064
2065         movlpd  10 * SIZE(B), %xmm4
2066         movhpd  10 * SIZE(B), %xmm4
2067         mulpd    %xmm4, %xmm2
2068         movlpd   9 * SIZE(B), %xmm4
2069         movhpd   9 * SIZE(B), %xmm4
2070         mulpd    %xmm2, %xmm4
2071         subpd    %xmm4, %xmm1
2072         movlpd   8 * SIZE(B), %xmm4
2073         movhpd   8 * SIZE(B), %xmm4
2074         mulpd    %xmm2, %xmm4
2075         subpd    %xmm4, %xmm0
2076
2077         movlpd   5 * SIZE(B), %xmm4
2078         movhpd   5 * SIZE(B), %xmm4
2079         mulpd    %xmm4, %xmm1
2080         movlpd   4 * SIZE(B), %xmm4
2081         movhpd   4 * SIZE(B), %xmm4
2082         mulpd    %xmm1, %xmm4
2083         subpd    %xmm4, %xmm0
2084
2085         movlpd   0 * SIZE(B), %xmm4
2086         movhpd   0 * SIZE(B), %xmm4
2087         mulpd    %xmm4, %xmm0
2088 #endif
2089
2090 #if defined(LN) || defined(LT)
2091         movapd  %xmm2,   0 * SIZE(B)
2092         movapd  %xmm5,   2 * SIZE(B)
2093         movapd  %xmm3,   4 * SIZE(B)
2094         movapd  %xmm7,   6 * SIZE(B)
2095
2096         movlpd  %xmm2,   0 * SIZE(BB)
2097         movlpd  %xmm2,   1 * SIZE(BB)
2098         movhpd  %xmm2,   2 * SIZE(BB)
2099         movhpd  %xmm2,   3 * SIZE(BB)
2100         movlpd  %xmm5,   4 * SIZE(BB)
2101         movlpd  %xmm5,   5 * SIZE(BB)
2102         movhpd  %xmm5,   6 * SIZE(BB)
2103         movhpd  %xmm5,   7 * SIZE(BB)
2104         movlpd  %xmm3,   8 * SIZE(BB)
2105         movlpd  %xmm3,   9 * SIZE(BB)
2106         movhpd  %xmm3,  10 * SIZE(BB)
2107         movhpd  %xmm3,  11 * SIZE(BB)
2108         movlpd  %xmm7,  12 * SIZE(BB)
2109         movlpd  %xmm7,  13 * SIZE(BB)
2110         movhpd  %xmm7,  14 * SIZE(BB)
2111         movhpd  %xmm7,  15 * SIZE(BB)
2112 #else
2113         movapd  %xmm0,   0 * SIZE(AA)
2114         movapd  %xmm1,   2 * SIZE(AA)
2115         movapd  %xmm2,   4 * SIZE(AA)
2116         movapd  %xmm3,   6 * SIZE(AA)
2117 #endif
2118
2119 #ifdef LN
2120         subl    $2 * SIZE, CO1
2121 #endif
2122
2123         leal    (LDC, LDC, 2), %eax
2124
2125 #if defined(LN) || defined(LT)
2126         movlpd  %xmm2, 0 * SIZE(CO1)
2127         movlpd  %xmm3, 1 * SIZE(CO1)
2128         movhpd  %xmm2, 0 * SIZE(CO1, LDC, 1)
2129         movhpd  %xmm3, 1 * SIZE(CO1, LDC, 1)
2130         movlpd  %xmm5, 0 * SIZE(CO1, LDC, 2)
2131         movlpd  %xmm7, 1 * SIZE(CO1, LDC, 2)
2132         movhpd  %xmm5, 0 * SIZE(CO1, %eax, 1)
2133         movhpd  %xmm7, 1 * SIZE(CO1, %eax, 1)
2134 #else
2135         movlpd  %xmm0, 0 * SIZE(CO1)
2136         movhpd  %xmm0, 1 * SIZE(CO1)
2137         movlpd  %xmm1, 0 * SIZE(CO1, LDC, 1)
2138         movhpd  %xmm1, 1 * SIZE(CO1, LDC, 1)
2139         movlpd  %xmm2, 0 * SIZE(CO1, LDC, 2)
2140         movhpd  %xmm2, 1 * SIZE(CO1, LDC, 2)
2141         movlpd  %xmm3, 0 * SIZE(CO1, %eax, 1)
2142         movhpd  %xmm3, 1 * SIZE(CO1, %eax, 1)
2143 #endif
2144
2145 #ifndef LN
2146         addl    $2 * SIZE, CO1
2147 #endif
2148
2149 #if defined(LT) || defined(RN)
2150         movl    K,  %eax
2151         subl    KK, %eax
2152         leal    (,%eax, SIZE), %eax
2153         leal    (AA, %eax, 2), AA
2154 #ifdef LT
2155         addl    $8 * SIZE, B
2156 #endif
2157 #endif
2158
2159 #ifdef LN
2160         subl    $2, KK
2161         movl    BORIG, B
2162 #endif
2163
2164 #ifdef LT
2165         addl    $2, KK
2166 #endif
2167
2168 #ifdef RT
2169         movl    K, %eax
2170         movl    BORIG, B
2171         sall    $1 + BASE_SHIFT, %eax
2172         addl    %eax, AORIG
2173 #endif
2174
2175         decl    %ebx                    # i --
2176         jg      .L11
2177         ALIGN_4
2178
2179 .L20:
2180         movl    M,  %ebx
2181         testl   $1, %ebx        # i = (m >> 2)
2182         jle     .L29
2183
2184 #ifdef LN
2185        movl     K, %eax
2186        sall     $BASE_SHIFT, %eax
2187        subl     %eax, AORIG
2188 #endif
2189
2190 #if defined(LN) || defined(RT)
2191         movl    KK, %eax
2192         movl    AORIG, AA
2193         leal    (AA, %eax, SIZE), AA
2194 #endif
2195
2196         leal    BUFFER, BB
2197
2198 #if defined(LN) || defined(RT)
2199         movl    KK, %eax
2200         sall    $3 + BASE_SHIFT, %eax
2201         addl    %eax, BB
2202 #endif  
2203
2204         pxor    %xmm4, %xmm4
2205         pxor    %xmm5, %xmm5
2206         pxor    %xmm6, %xmm6
2207         pxor    %xmm7, %xmm7
2208
2209         movlpd   0 * SIZE(AA), %xmm0
2210         movlpd   4 * SIZE(AA), %xmm1
2211         movlpd   0 * SIZE(BB), %xmm2
2212         movlpd   8 * SIZE(BB), %xmm3
2213
2214 #if defined(LT) || defined(RN)
2215         movl    KK, %eax
2216 #else
2217         movl    K, %eax
2218         subl    KK, %eax
2219 #endif
2220         sarl    $3, %eax
2221         je      .L25
2222         ALIGN_4
2223
2224 .L22:
2225         mulsd   %xmm0, %xmm2
2226         addsd   %xmm2, %xmm4
2227 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
2228         PREFETCH (PREFETCHSIZE  + 0) * SIZE(AA)
2229 #endif
2230         movlpd   2 * SIZE(BB), %xmm2
2231         mulsd   %xmm0, %xmm2
2232         addsd   %xmm2, %xmm5
2233         movlpd   4 * SIZE(BB), %xmm2
2234         mulsd   %xmm0, %xmm2
2235         mulsd    6 * SIZE(BB), %xmm0
2236         addsd   %xmm2, %xmm6
2237         movlpd  16 * SIZE(BB), %xmm2
2238         addsd   %xmm0, %xmm7
2239         movlpd   1 * SIZE(AA), %xmm0
2240         mulsd   %xmm0, %xmm3
2241         addsd   %xmm3, %xmm4
2242         movlpd  10 * SIZE(BB), %xmm3
2243         mulsd   %xmm0, %xmm3
2244         addsd   %xmm3, %xmm5
2245         movlpd  12 * SIZE(BB), %xmm3
2246         mulsd   %xmm0, %xmm3
2247         mulsd   14 * SIZE(BB), %xmm0
2248         addsd   %xmm3, %xmm6
2249         movlpd  24 * SIZE(BB), %xmm3
2250         addsd   %xmm0, %xmm7
2251         movlpd   2 * SIZE(AA), %xmm0
2252         mulsd   %xmm0, %xmm2
2253         addsd   %xmm2, %xmm4
2254         movlpd  18 * SIZE(BB), %xmm2
2255         mulsd   %xmm0, %xmm2
2256         addsd   %xmm2, %xmm5
2257         movlpd  20 * SIZE(BB), %xmm2
2258         mulsd   %xmm0, %xmm2
2259         mulsd   22 * SIZE(BB), %xmm0
2260         addsd   %xmm2, %xmm6
2261         movlpd  32 * SIZE(BB), %xmm2
2262         addsd   %xmm0, %xmm7
2263         movlpd   3 * SIZE(AA), %xmm0
2264         mulsd   %xmm0, %xmm3
2265         addsd   %xmm3, %xmm4
2266         movlpd  26 * SIZE(BB), %xmm3
2267         mulsd   %xmm0, %xmm3
2268         addsd   %xmm3, %xmm5
2269         movlpd  28 * SIZE(BB), %xmm3
2270         mulsd   %xmm0, %xmm3
2271         mulsd   30 * SIZE(BB), %xmm0
2272         addsd   %xmm3, %xmm6
2273         movlpd  40 * SIZE(BB), %xmm3
2274         addsd   %xmm0, %xmm7
2275         movlpd   8 * SIZE(AA), %xmm0
2276 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
2277         PREFETCH (PREFETCHSIZE  + 8) * SIZE(AA)
2278 #endif
2279         mulsd   %xmm1, %xmm2
2280         addsd   %xmm2, %xmm4
2281         movlpd  34 * SIZE(BB), %xmm2
2282         mulsd   %xmm1, %xmm2
2283         addsd   %xmm2, %xmm5
2284         movlpd  36 * SIZE(BB), %xmm2
2285         mulsd   %xmm1, %xmm2
2286         mulsd   38 * SIZE(BB), %xmm1
2287         addsd   %xmm2, %xmm6
2288         movlpd  48 * SIZE(BB), %xmm2
2289         addsd   %xmm1, %xmm7
2290         movlpd   5 * SIZE(AA), %xmm1
2291         mulsd   %xmm1, %xmm3
2292         addsd   %xmm3, %xmm4
2293         movlpd  42 * SIZE(BB), %xmm3
2294         mulsd   %xmm1, %xmm3
2295         addsd   %xmm3, %xmm5
2296         movlpd  44 * SIZE(BB), %xmm3
2297         mulsd   %xmm1, %xmm3
2298         mulsd   46 * SIZE(BB), %xmm1
2299         addsd   %xmm3, %xmm6
2300         movlpd  56 * SIZE(BB), %xmm3
2301         addsd   %xmm1, %xmm7
2302         movlpd   6 * SIZE(AA), %xmm1
2303         mulsd   %xmm1, %xmm2
2304         addsd   %xmm2, %xmm4
2305         movlpd  50 * SIZE(BB), %xmm2
2306         mulsd   %xmm1, %xmm2
2307         addsd   %xmm2, %xmm5
2308         movlpd  52 * SIZE(BB), %xmm2
2309         mulsd   %xmm1, %xmm2
2310         mulsd   54 * SIZE(BB), %xmm1
2311         addsd   %xmm2, %xmm6
2312         movlpd  64 * SIZE(BB), %xmm2
2313         addsd   %xmm1, %xmm7
2314         movlpd   7 * SIZE(AA), %xmm1
2315         mulsd   %xmm1, %xmm3
2316         addsd   %xmm3, %xmm4
2317         movlpd  58 * SIZE(BB), %xmm3
2318         mulsd   %xmm1, %xmm3
2319         addsd   %xmm3, %xmm5
2320         movlpd  60 * SIZE(BB), %xmm3
2321         mulsd   %xmm1, %xmm3
2322         mulsd   62 * SIZE(BB), %xmm1
2323         addsd   %xmm3, %xmm6
2324         movlpd  72 * SIZE(BB), %xmm3
2325         addl   $64 * SIZE, BB
2326         addsd   %xmm1, %xmm7
2327         movlpd  12 * SIZE(AA), %xmm1
2328         addl   $8 * SIZE, AA
2329         decl   %eax
2330         jne    .L22
2331         ALIGN_4
2332
2333 .L25:
2334 #if defined(LT) || defined(RN)
2335         movl    KK, %eax
2336 #else
2337         movl    K, %eax
2338         subl    KK, %eax
2339 #endif
2340         andl    $7, %eax                # if (k & 1)
2341         BRANCH
2342         je .L28
2343
2344 .L26:
2345         mulsd   %xmm0, %xmm2
2346         addsd   %xmm2, %xmm4
2347         movlpd   2 * SIZE(BB), %xmm2
2348         mulsd   %xmm0, %xmm2
2349         addsd   %xmm2, %xmm5
2350         movlpd   4 * SIZE(BB), %xmm2
2351         mulsd   %xmm0, %xmm2
2352         mulsd    6 * SIZE(BB), %xmm0
2353         addsd   %xmm2, %xmm6
2354         movlpd   8 * SIZE(BB), %xmm2
2355         addsd   %xmm0, %xmm7
2356         movlpd   1 * SIZE(AA), %xmm0
2357
2358         addl    $1 * SIZE, AA
2359         addl    $8 * SIZE, BB
2360         decl    %eax
2361         jg      .L26
2362         ALIGN_4
2363
2364 .L28:
2365 #if defined(LN) || defined(RT)
2366         movl    KK, %eax
2367 #ifdef LN
2368         subl    $1, %eax
2369 #else
2370         subl    $4, %eax
2371 #endif
2372
2373         movl    AORIG, AA
2374         movl    BORIG, B
2375         leal    BUFFER, BB
2376
2377         leal    (, %eax, SIZE), %eax
2378         addl    %eax, AA
2379         leal    (B,  %eax, 4), B
2380         leal    (BB, %eax, 8), BB
2381 #endif
2382
2383 #if defined(LN) || defined(LT)
2384         unpcklpd %xmm5, %xmm4
2385         unpcklpd %xmm7, %xmm6
2386
2387         movapd   0 * SIZE(B), %xmm2
2388         movapd   2 * SIZE(B), %xmm5
2389
2390         subpd   %xmm4,  %xmm2
2391         subpd   %xmm6,  %xmm5
2392 #else
2393         movlpd   0 * SIZE(AA), %xmm0
2394         movlpd   1 * SIZE(AA), %xmm1
2395         movlpd   2 * SIZE(AA), %xmm2
2396         movlpd   3 * SIZE(AA), %xmm3
2397
2398         subsd   %xmm4, %xmm0
2399         subsd   %xmm5, %xmm1
2400         subsd   %xmm6, %xmm2
2401         subsd   %xmm7, %xmm3
2402 #endif
2403
2404 #ifdef LN
2405         movlpd   0 * SIZE(AA), %xmm4
2406         movhpd   0 * SIZE(AA), %xmm4
2407         mulpd    %xmm4, %xmm2
2408         mulpd    %xmm4, %xmm5
2409 #endif
2410
2411 #ifdef LT
2412         movlpd   0 * SIZE(AA), %xmm4
2413         movhpd   0 * SIZE(AA), %xmm4
2414         mulpd    %xmm4, %xmm2
2415         mulpd    %xmm4, %xmm5
2416 #endif
2417
2418 #ifdef RN
2419         movlpd   0 * SIZE(B), %xmm4
2420         mulsd    %xmm4, %xmm0
2421         movlpd   1 * SIZE(B), %xmm4
2422         mulsd    %xmm0, %xmm4
2423         subsd    %xmm4, %xmm1
2424         movlpd   2 * SIZE(B), %xmm4
2425         mulsd    %xmm0, %xmm4
2426         subsd    %xmm4, %xmm2
2427         movlpd   3 * SIZE(B), %xmm4
2428         mulsd    %xmm0, %xmm4
2429         subsd    %xmm4, %xmm3
2430
2431         movlpd   5 * SIZE(B), %xmm4
2432         mulsd    %xmm4, %xmm1
2433         movlpd   6 * SIZE(B), %xmm4
2434         mulsd    %xmm1, %xmm4
2435         subsd    %xmm4, %xmm2
2436         movlpd   7 * SIZE(B), %xmm4
2437         mulsd    %xmm1, %xmm4
2438         subsd    %xmm4, %xmm3
2439
2440         movlpd  10 * SIZE(B), %xmm4
2441         mulsd    %xmm4, %xmm2
2442         movlpd  11 * SIZE(B), %xmm4
2443         mulsd    %xmm2, %xmm4
2444         subsd    %xmm4, %xmm3
2445
2446         movlpd  15 * SIZE(B), %xmm4
2447         mulsd    %xmm4, %xmm3
2448 #endif
2449
2450 #ifdef RT
2451         movlpd  15 * SIZE(B), %xmm4
2452         mulsd    %xmm4, %xmm3
2453         movlpd  14 * SIZE(B), %xmm4
2454         mulsd    %xmm3, %xmm4
2455         subsd    %xmm4, %xmm2
2456         movlpd  13 * SIZE(B), %xmm4
2457         mulsd    %xmm3, %xmm4
2458         subsd    %xmm4, %xmm1
2459         movlpd  12 * SIZE(B), %xmm4
2460         mulsd    %xmm3, %xmm4
2461         subsd    %xmm4, %xmm0
2462
2463         movlpd  10 * SIZE(B), %xmm4
2464         mulsd    %xmm4, %xmm2
2465         movlpd   9 * SIZE(B), %xmm4
2466         mulsd    %xmm2, %xmm4
2467         subsd    %xmm4, %xmm1
2468         movlpd   8 * SIZE(B), %xmm4
2469         mulsd    %xmm2, %xmm4
2470         subsd    %xmm4, %xmm0
2471
2472         movlpd   5 * SIZE(B), %xmm4
2473         mulsd    %xmm4, %xmm1
2474         movlpd   4 * SIZE(B), %xmm4
2475         mulsd    %xmm1, %xmm4
2476         subsd    %xmm4, %xmm0
2477
2478         movlpd   0 * SIZE(B), %xmm4
2479         mulsd    %xmm4, %xmm0
2480 #endif
2481
2482 #if defined(LN) || defined(LT)
2483         movapd  %xmm2,   0 * SIZE(B)
2484         movapd  %xmm5,   2 * SIZE(B)
2485
2486         movlpd  %xmm2,   0 * SIZE(BB)
2487         movlpd  %xmm2,   1 * SIZE(BB)
2488         movhpd  %xmm2,   2 * SIZE(BB)
2489         movhpd  %xmm2,   3 * SIZE(BB)
2490         movlpd  %xmm5,   4 * SIZE(BB)
2491         movlpd  %xmm5,   5 * SIZE(BB)
2492         movhpd  %xmm5,   6 * SIZE(BB)
2493         movhpd  %xmm5,   7 * SIZE(BB)
2494 #else
2495         movlpd  %xmm0,   0 * SIZE(AA)
2496         movlpd  %xmm1,   1 * SIZE(AA)
2497         movlpd  %xmm2,   2 * SIZE(AA)
2498         movlpd  %xmm3,   3 * SIZE(AA)
2499 #endif
2500
2501 #ifdef LN
2502         subl    $1 * SIZE, CO1
2503 #endif
2504
2505         leal    (LDC, LDC, 2), %eax
2506
2507 #if defined(LN) || defined(LT)
2508         movlpd  %xmm2, 0 * SIZE(CO1)
2509         movhpd  %xmm2, 0 * SIZE(CO1, LDC, 1)
2510         movlpd  %xmm5, 0 * SIZE(CO1, LDC, 2)
2511         movhpd  %xmm5, 0 * SIZE(CO1, %eax, 1)
2512 #else
2513         movlpd  %xmm0, 0 * SIZE(CO1)
2514         movlpd  %xmm1, 0 * SIZE(CO1, LDC, 1)
2515         movlpd  %xmm2, 0 * SIZE(CO1, LDC, 2)
2516         movlpd  %xmm3, 0 * SIZE(CO1, %eax, 1)
2517 #endif
2518
2519 #ifndef LN
2520         addl    $1 * SIZE, CO1
2521 #endif
2522
2523 #if defined(LT) || defined(RN)
2524         movl    K,  %eax
2525         subl    KK, %eax
2526         leal    (AA,%eax, SIZE), AA
2527 #ifdef LT
2528         addl    $4 * SIZE, B
2529 #endif
2530 #endif
2531
2532 #ifdef LN
2533         subl    $1, KK
2534         movl    BORIG, B
2535 #endif
2536
2537 #ifdef LT
2538         addl    $1, KK
2539 #endif
2540
2541 #ifdef RT
2542         movl    K, %eax
2543         movl    BORIG, B
2544         sall    $BASE_SHIFT, %eax
2545         addl    %eax, AORIG
2546 #endif
2547         ALIGN_4
2548
2549 .L29:
2550 #ifdef LN
2551        movl     K, %eax
2552        leal     (, %eax, SIZE), %eax
2553        leal     (B, %eax, 4), B
2554 #endif
2555
2556 #if defined(LT) || defined(RN)
2557         movl    K,  %eax
2558         subl    KK, %eax
2559         leal    (,%eax, SIZE), %eax
2560         leal    (B,  %eax, 4), B
2561 #endif
2562
2563 #ifdef RN
2564         addl    $4, KK
2565 #endif
2566
2567 #ifdef RT
2568         subl    $4, KK
2569 #endif
2570
2571         decl    J                       # j --
2572         jg      .L01
2573         ALIGN_4
2574
2575
2576 .L999:
2577         movl    OLD_STACK, %esp
2578         EMMS
2579         
2580         popl    %ebx
2581         popl    %esi
2582         popl    %edi
2583         popl    %ebp
2584         ret
2585
2586         EPILOGUE