5c2dcd0d68b4e9ad97bed245f3bbd13bd5ee9137
[platform/upstream/openblas.git] / kernel / x86 / trsm_kernel_RT_4x4_sse.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         
44 #define OLD_M    4 + STACK(%esi)
45 #define OLD_N    8 + STACK(%esi)
46 #define OLD_K   12 + STACK(%esi)
47 #define OLD_A   20 + STACK(%esi)
48 #define OLD_B   24 + STACK(%esi)
49 #define OLD_C   28 + STACK(%esi)
50 #define OLD_LDC 32 + STACK(%esi)
51 #define STACK_OFFT      36 + STACK(%esi)
52
53 #define K       16(%esp)
54 #define N       20(%esp)
55 #define M       24(%esp)
56 #define A       28(%esp)
57 #define C       32(%esp)
58 #define J       36(%esp)
59 #define OLD_STACK 40(%esp)
60 #define OFFSET  44(%esp)
61 #define KK      48(%esp)
62 #define KKK     52(%esp)
63 #define AORIG   56(%esp)
64 #define BORIG   60(%esp)
65 #define BUFFER 128(%esp)
66
67 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
68 #define PREFETCH     prefetch
69 #define PREFETCHW    prefetchw
70 #define PREFETCHSIZE (16 * 10 + 8)
71 #endif
72
73 #if defined(PENTIUM4) || defined(PENTIUMM)
74 #define PREFETCH     prefetcht0
75 #define PREFETCHW    prefetcht0
76 #define PREFETCHSIZE   96
77 #endif
78
79 #if defined(PENRYN) || defined(DUNNINGTON)
80 #define PREFETCH     prefetcht0
81 #define PREFETCHW    prefetcht0
82 #define PREFETCHSIZE   96
83 #endif
84
85 #define B       %edi
86 #define AA      %edx
87 #define BB      %ecx
88 #define LDC     %ebp
89 #define CO1     %esi
90
91 #if defined(OPTERON) || !defined(HAVE_SSE2)
92 #define movsd   movlps
93 #endif
94
95 #ifdef HAVE_SSE2
96 #define xorps   pxor
97 #endif
98
99 #define KERNEL1(address) \
100         mulps   %xmm0, %xmm2; \
101         addps   %xmm2, %xmm4; \
102         movaps   4 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
103         mulps   %xmm0, %xmm2; \
104         PREFETCH (PREFETCHSIZE +  0) * SIZE + (address) * 1 * SIZE(AA); \
105         addps   %xmm2, %xmm5; \
106         movaps   8 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
107         mulps   %xmm0, %xmm2; \
108         mulps   12 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
109         addps   %xmm2, %xmm6; \
110         movaps  32 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
111         addps   %xmm0, %xmm7; \
112         movaps   4 * SIZE + (address) * 1 * SIZE(AA), %xmm0
113
114 #define KERNEL2(address) \
115         mulps   %xmm0, %xmm3; \
116         addps   %xmm3, %xmm4; \
117         movaps  20 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
118         mulps   %xmm0, %xmm3; \
119         addps   %xmm3, %xmm5; \
120         movaps  24 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
121         mulps   %xmm0, %xmm3; \
122         mulps   28 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
123         addps   %xmm3, %xmm6; \
124         movaps  48 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
125         addps   %xmm0, %xmm7; \
126         movaps   8 * SIZE + (address) * 1 * SIZE(AA), %xmm0
127
128 #define KERNEL3(address) \
129         mulps   %xmm0, %xmm2; \
130         addps   %xmm2, %xmm4; \
131         movaps  36 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
132         mulps   %xmm0, %xmm2; \
133         addps   %xmm2, %xmm5; \
134         movaps  40 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
135         mulps   %xmm0, %xmm2; \
136         mulps   44 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
137         addps   %xmm2, %xmm6; \
138         movaps  64 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
139         addps   %xmm0, %xmm7; \
140         movaps  12 * SIZE + (address) * 1 * SIZE(AA), %xmm0
141
142 #define KERNEL4(address) \
143         mulps   %xmm0, %xmm3; \
144         addps   %xmm3, %xmm4; \
145         movaps  52 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
146         mulps   %xmm0, %xmm3; \
147         addps   %xmm3, %xmm5; \
148         movaps  56 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
149         mulps   %xmm0, %xmm3; \
150         mulps   60 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
151         addps   %xmm3, %xmm6; \
152         movaps  80 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
153         addps   %xmm0, %xmm7; \
154         movaps   32 * SIZE + (address) * 1 * SIZE(AA), %xmm0
155
156 #define KERNEL5(address) \
157         mulps   %xmm1, %xmm2; \
158         addps   %xmm2, %xmm4; \
159         movaps  68 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
160         mulps   %xmm1, %xmm2; \
161         addps   %xmm2, %xmm5; \
162         movaps  72 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
163         mulps   %xmm1, %xmm2; \
164         mulps   76 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
165         addps   %xmm2, %xmm6; \
166         movaps   96 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
167         addps   %xmm1, %xmm7; \
168         movaps  20 * SIZE + (address) * 1 * SIZE(AA), %xmm1
169
170 #define KERNEL6(address) \
171         mulps   %xmm1, %xmm3; \
172         addps   %xmm3, %xmm4; \
173         movaps  84 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
174         mulps   %xmm1, %xmm3; \
175         addps   %xmm3, %xmm5; \
176         movaps  88 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
177         mulps   %xmm1, %xmm3; \
178         mulps   92 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
179         addps   %xmm3, %xmm6; \
180         movaps  112 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
181         addps   %xmm1, %xmm7; \
182         movaps   24 * SIZE + (address) * 1 * SIZE(AA), %xmm1
183
184 #define KERNEL7(address) \
185         mulps   %xmm1, %xmm2; \
186         addps   %xmm2, %xmm4; \
187         movaps  100 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
188         mulps   %xmm1, %xmm2; \
189         addps   %xmm2, %xmm5; \
190         movaps  104 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
191         mulps   %xmm1, %xmm2; \
192         mulps   108 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
193         addps   %xmm2, %xmm6; \
194         movaps  128 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
195         addps   %xmm1, %xmm7; \
196         movaps  28 * SIZE + (address) * 1 * SIZE(AA), %xmm1
197
198 #define KERNEL8(address) \
199         mulps   %xmm1, %xmm3; \
200         addps   %xmm3, %xmm4; \
201         movaps  116 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
202         mulps   %xmm1, %xmm3; \
203         addps   %xmm3, %xmm5; \
204         movaps  120 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
205         mulps   %xmm1, %xmm3; \
206         mulps   124 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
207         addps   %xmm3, %xmm6; \
208         movaps  144 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
209         addps   %xmm1, %xmm7; \
210         movaps   48 * SIZE + (address) * 1 * SIZE(AA), %xmm1;
211
212         PROLOGUE
213
214         pushl   %ebp
215         pushl   %edi
216         pushl   %esi
217         pushl   %ebx
218
219         PROFCODE
220
221         movl    %esp, %esi
222
223         subl    $128 + LOCAL_BUFFER_SIZE, %esp
224         andl    $-1024, %esp
225
226         STACK_TOUCHING
227
228         movl    OLD_M, %ebx
229         movl    OLD_N, %eax
230         movl    OLD_K, %ecx
231         movl    OLD_A, %edx
232
233         movl    %ebx, M
234         movl    %eax, N
235         movl    %ecx, K
236         movl    %edx, A
237         movl    %esi, OLD_STACK
238         movss   STACK_OFFT, %xmm4
239
240         movl    OLD_B, B
241         movl    OLD_C, %ebx
242
243         movl    %ebx, C
244         movl    OLD_LDC, LDC
245
246         movss   %xmm4, OFFSET
247         movss   %xmm4, KK
248
249         leal    (, LDC, SIZE), LDC
250
251 #ifdef LN
252        movl     M, %eax
253        leal     (, %eax, SIZE), %eax
254        addl     %eax, C
255        imull    K, %eax
256        addl     %eax, A
257 #endif
258
259 #ifdef RT
260        movl     N, %eax
261        leal     (, %eax, SIZE), %eax
262        imull    K, %eax
263        addl     %eax, B
264        movl     N, %eax
265        imull    LDC, %eax
266        addl     %eax, C
267 #endif
268
269 #ifdef RN
270         negl    KK
271 #endif  
272
273 #ifdef RT
274        movl     N, %eax
275        subl     OFFSET, %eax
276        movl     %eax, KK
277 #endif
278
279         testl   $1, N
280         je      .L40
281
282 #ifdef LN
283         movl    OFFSET, %eax
284         addl    M, %eax
285         movl    %eax, KK
286 #endif  
287
288         leal    BUFFER, %ecx
289
290 #ifdef RT
291        movl     K, %eax
292        sall     $BASE_SHIFT, %eax
293        subl     %eax, B
294 #endif
295
296 #if defined(LN) || defined(RT)
297         movl    KK, %eax
298         movl    B, BORIG
299         sall    $BASE_SHIFT, %eax
300         leal    (B,  %eax, 1), B
301         leal    (BB, %eax, 4), BB
302 #endif  
303
304 #ifdef LT
305         movl    OFFSET, %eax
306         movl    %eax, KK
307 #endif
308
309 #if defined(LT) || defined(RN)
310         movl    KK, %eax
311 #else
312         movl    K, %eax
313         subl    KK, %eax
314 #endif
315         sarl    $3, %eax
316         jle     .L85
317         ALIGN_4
318         
319 .L82:
320         movsd    0 * SIZE(B), %xmm3
321         movhps   2 * SIZE(B), %xmm3
322         movsd    4 * SIZE(B), %xmm7
323         movhps   6 * SIZE(B), %xmm7
324
325         pshufd   $0x00, %xmm3, %xmm0
326         pshufd   $0x55, %xmm3, %xmm1
327         pshufd   $0xaa, %xmm3, %xmm2
328         pshufd   $0xff, %xmm3, %xmm3
329
330         pshufd   $0x00, %xmm7, %xmm4
331         pshufd   $0x55, %xmm7, %xmm5
332         pshufd   $0xaa, %xmm7, %xmm6
333         pshufd   $0xff, %xmm7, %xmm7
334
335         movaps  %xmm0,  0 * SIZE(BB)
336         movaps  %xmm1,  4 * SIZE(BB)
337         movaps  %xmm2,  8 * SIZE(BB)
338         movaps  %xmm3, 12 * SIZE(BB)
339         movaps  %xmm4, 16 * SIZE(BB)
340         movaps  %xmm5, 20 * SIZE(BB)
341         movaps  %xmm6, 24 * SIZE(BB)
342         movaps  %xmm7, 28 * SIZE(BB)
343
344         addl    $ 8 * SIZE, B
345         addl    $32 * SIZE, BB
346         decl    %eax
347         jne     .L82
348         ALIGN_4
349
350 .L85:
351 #if defined(LT) || defined(RN)
352         movl    KK, %eax
353 #else
354         movl    K, %eax
355         subl    KK, %eax
356 #endif
357         andl    $7, %eax
358         BRANCH
359         jle     .L90
360         ALIGN_4
361
362 .L86:
363         movss    0 * SIZE(B), %xmm3
364
365         pshufd   $0x00, %xmm3, %xmm0
366
367         movaps  %xmm0,  0 * SIZE(BB)
368
369         addl    $1 * SIZE, B
370         addl    $4 * SIZE, BB
371         decl    %eax
372         jne     .L86
373         ALIGN_4
374         
375 .L90:
376 #if defined(LT) || defined(RN)
377         movl    A, AA
378 #else
379         movl    A, %eax
380         movl    %eax, AORIG
381 #endif
382
383 #ifdef RT
384         subl    LDC, C
385 #endif
386         movl    C, CO1
387 #ifndef RT
388         addl    LDC, C
389 #endif
390
391         movl    M,  %ebx
392         sarl    $2, %ebx        # i = (m >> 2)
393         jle     .L100
394         ALIGN_4
395
396 .L91:
397 #ifdef LN
398        movl     K, %eax
399        sall     $2 + BASE_SHIFT, %eax
400        subl     %eax, AORIG
401 #endif
402
403 #if defined(LN) || defined(RT)
404         movl    KK, %eax
405         movl    AORIG, AA
406         leal    (, %eax, SIZE), %eax
407         leal    (AA, %eax, 4), AA
408 #endif
409
410         leal    BUFFER, BB
411
412 #if defined(LN) || defined(RT)
413         movl    KK, %eax
414         sall    $BASE_SHIFT, %eax
415         leal    (BB, %eax, 4), BB
416 #endif  
417
418         xorps   %xmm4, %xmm4
419         xorps   %xmm5, %xmm5
420         xorps   %xmm6, %xmm6
421         xorps   %xmm7, %xmm7
422
423         movaps   0 * SIZE(AA), %xmm0
424         movaps  16 * SIZE(AA), %xmm1
425         movaps   0 * SIZE(BB), %xmm2
426         movaps  16 * SIZE(BB), %xmm3
427
428         PREFETCHW       3 * SIZE(CO1)
429
430 #if defined(LT) || defined(RN)
431         movl    KK, %eax
432 #else
433         movl    K, %eax
434         subl    KK, %eax
435 #endif
436         sarl    $3, %eax
437         je      .L95
438         ALIGN_4
439
440 .L92:
441         mulps   %xmm0, %xmm2
442 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
443         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
444 #endif
445         movaps   4 * SIZE(AA), %xmm0
446         addps   %xmm2, %xmm4
447         movaps  32 * SIZE(BB), %xmm2
448         mulps    4 * SIZE(BB), %xmm0
449         addps   %xmm0, %xmm5
450         movaps   8 * SIZE(AA), %xmm0
451         mulps    8 * SIZE(BB), %xmm0
452         addps   %xmm0, %xmm6
453         movaps  12 * SIZE(AA), %xmm0
454         mulps   12 * SIZE(BB), %xmm0
455         addps   %xmm0, %xmm7
456         movaps  32 * SIZE(AA), %xmm0
457 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
458         prefetcht0 (PREFETCHSIZE  + 16) * SIZE(AA)
459 #endif
460         mulps   %xmm1, %xmm3
461         movaps  20 * SIZE(AA), %xmm1
462         addps   %xmm3, %xmm4
463         movaps  48 * SIZE(BB), %xmm3
464         mulps   20 * SIZE(BB), %xmm1
465         addps   %xmm1, %xmm5
466         movaps  24 * SIZE(AA), %xmm1
467         mulps   24 * SIZE(BB), %xmm1
468         addps   %xmm1, %xmm6
469         movaps  28 * SIZE(AA), %xmm1
470         mulps   28 * SIZE(BB), %xmm1
471         addps   %xmm1, %xmm7
472         movaps  48 * SIZE(AA), %xmm1
473
474         addl    $32 * SIZE, AA
475         addl    $32 * SIZE, BB
476         decl   %eax
477         jne    .L92
478         ALIGN_4
479
480 .L95:
481 #if defined(LT) || defined(RN)
482         movl    KK, %eax
483 #else
484         movl    K, %eax
485         subl    KK, %eax
486 #endif
487         andl    $7, %eax                # if (k & 1)
488         BRANCH
489         je .L98
490         ALIGN_4
491
492 .L96:
493         mulps   %xmm0, %xmm2
494         addps   %xmm2, %xmm4
495         movaps   4 * SIZE(AA), %xmm0
496         movaps   4 * SIZE(BB), %xmm2
497
498         addl    $4 * SIZE, AA
499         addl    $4 * SIZE, BB
500         decl    %eax
501         jg      .L96
502         ALIGN_4
503
504 .L98:
505         addps   %xmm5, %xmm4
506         addps   %xmm7, %xmm6
507         addps   %xmm6, %xmm4
508
509 #if defined(LN) || defined(RT)
510         movl    KK, %eax
511 #ifdef LN
512         subl    $4, %eax
513 #else
514         subl    $1, %eax
515 #endif
516
517         movl    AORIG, AA
518         movl    BORIG, B
519         leal    BUFFER, BB
520
521         sall    $ BASE_SHIFT, %eax
522         leal    (AA, %eax, 4), AA
523         leal    (B,  %eax, 1), B
524         leal    (BB, %eax, 4), BB
525 #endif
526
527 #if defined(LN) || defined(LT)
528         movaps   %xmm4, %xmm0
529         unpcklps %xmm6, %xmm4
530         unpckhps %xmm6, %xmm0
531
532         movaps   %xmm5, %xmm1
533         unpcklps %xmm7, %xmm5
534         unpckhps %xmm7, %xmm1
535
536         movaps   %xmm4, %xmm6
537         unpcklps %xmm5, %xmm4
538         unpckhps %xmm5, %xmm6
539
540         movaps   %xmm0, %xmm2
541         unpcklps %xmm1, %xmm0
542         unpckhps %xmm1, %xmm2
543
544         movss    0 * SIZE(B), %xmm1
545         movss    1 * SIZE(B), %xmm3
546         movss    2 * SIZE(B), %xmm5
547         movss    3 * SIZE(B), %xmm7
548
549         subss   %xmm4,  %xmm1
550         subss   %xmm6,  %xmm3
551         subss   %xmm0,  %xmm5
552         subss   %xmm2,  %xmm7
553 #else
554         movaps   0 * SIZE(AA), %xmm0
555
556         subps   %xmm4, %xmm0
557 #endif
558
559 #ifdef LN
560         movaps   12 * SIZE(AA), %xmm4
561         pshufd   $0xff, %xmm4, %xmm6
562         mulss    %xmm6, %xmm7
563         pshufd   $0xaa, %xmm4, %xmm6
564         mulss    %xmm7, %xmm6
565         subss    %xmm6, %xmm5
566         pshufd   $0x55, %xmm4, %xmm6
567         mulss    %xmm7, %xmm6
568         subss    %xmm6, %xmm3
569         pshufd   $0x00, %xmm4, %xmm6
570         mulss    %xmm7, %xmm6
571         subss    %xmm6, %xmm1
572
573         movaps    8 * SIZE(AA), %xmm4
574         pshufd   $0xaa, %xmm4, %xmm6
575         mulss    %xmm6, %xmm5
576         pshufd   $0x55, %xmm4, %xmm6
577         mulss    %xmm5, %xmm6
578         subss    %xmm6, %xmm3
579         pshufd   $0x00, %xmm4, %xmm6
580         mulss    %xmm5, %xmm6
581         subss    %xmm6, %xmm1
582
583         movaps    4 * SIZE(AA), %xmm4
584         pshufd   $0x55, %xmm4, %xmm6
585         mulss    %xmm6, %xmm3
586         pshufd   $0x00, %xmm4, %xmm6
587         mulss    %xmm3, %xmm6
588         subss    %xmm6, %xmm1
589
590         movaps    0 * SIZE(AA), %xmm4
591         pshufd   $0x00, %xmm4, %xmm6
592         mulss    %xmm6, %xmm1
593 #endif
594
595 #ifdef LT
596         movaps   0 * SIZE(AA), %xmm4
597         pshufd   $0x00, %xmm4, %xmm6
598         mulss    %xmm6, %xmm1
599
600         pshufd   $0x55, %xmm4, %xmm6
601         mulss    %xmm1, %xmm6
602         subss    %xmm6, %xmm3
603         pshufd   $0xaa, %xmm4, %xmm6
604         mulss    %xmm1, %xmm6
605         subss    %xmm6, %xmm5
606         pshufd   $0xff, %xmm4, %xmm6
607         mulss    %xmm1, %xmm6
608         subss    %xmm6, %xmm7
609
610         movaps   4 * SIZE(AA), %xmm4
611         pshufd   $0x55, %xmm4, %xmm6
612         mulss    %xmm6, %xmm3
613         pshufd   $0xaa, %xmm4, %xmm6
614         mulss    %xmm3, %xmm6
615         subss    %xmm6, %xmm5
616         pshufd   $0xff, %xmm4, %xmm6
617         mulss    %xmm3, %xmm6
618         subss    %xmm6, %xmm7
619
620         movaps   8 * SIZE(AA), %xmm4
621         pshufd   $0xaa, %xmm4, %xmm6
622         mulss    %xmm6, %xmm5
623         pshufd   $0xff, %xmm4, %xmm6
624         mulss    %xmm5, %xmm6
625         subss    %xmm6, %xmm7
626
627         movaps  12 * SIZE(AA), %xmm4
628         pshufd   $0xff, %xmm4, %xmm6
629         mulss    %xmm6, %xmm7
630 #endif
631
632 #if defined(RN) || defined(RT)
633         movss    0 * SIZE(B), %xmm6
634         pshufd   $0x00, %xmm6, %xmm7
635         mulps    %xmm7, %xmm0
636 #endif
637
638 #if defined(LN) || defined(LT)
639         movss   %xmm1,   0 * SIZE(B)
640         movss   %xmm3,   1 * SIZE(B)
641         movss   %xmm5,   2 * SIZE(B)
642         movss   %xmm7,   3 * SIZE(B)
643
644         pshufd  $0x00, %xmm1, %xmm0
645         movaps  %xmm0,   0 * SIZE(BB)
646         pshufd  $0x00, %xmm3, %xmm0
647         movaps  %xmm0,   4 * SIZE(BB)
648
649         pshufd  $0x00, %xmm5, %xmm0
650         movaps  %xmm0,   8 * SIZE(BB)
651         pshufd  $0x00, %xmm7, %xmm0
652         movaps  %xmm0,  12 * SIZE(BB)
653 #else
654         movaps  %xmm0,   0 * SIZE(AA)
655 #endif
656
657 #ifdef LN
658         subl    $4 * SIZE, CO1
659 #endif
660
661 #if defined(LN) || defined(LT)
662         unpcklps %xmm5, %xmm1
663         unpcklps %xmm7, %xmm3
664
665         unpcklps %xmm3, %xmm1
666
667         movlps  %xmm1, 0 * SIZE(CO1)
668         movhps  %xmm1, 2 * SIZE(CO1)
669 #else
670         movlps  %xmm0, 0 * SIZE(CO1)
671         movhps  %xmm0, 2 * SIZE(CO1)
672 #endif
673
674 #ifndef LN
675         addl    $4 * SIZE, CO1
676 #endif
677
678 #if defined(LT) || defined(RN)
679         movl    K,  %eax
680         subl    KK, %eax
681         leal    (,%eax, SIZE), %eax
682         leal    (AA, %eax, 4), AA
683 #ifdef LT
684         addl    $4 * SIZE, B
685 #endif
686 #endif
687
688 #ifdef LN
689         subl    $4, KK
690         movl    BORIG, B
691 #endif
692
693 #ifdef LT
694         addl    $4, KK
695 #endif
696
697 #ifdef RT
698         movl    K, %eax
699         movl    BORIG, B
700         sall    $2 + BASE_SHIFT, %eax
701         addl    %eax, AORIG
702 #endif
703
704         decl    %ebx                    # i --
705         jg      .L91
706         ALIGN_4
707
708 .L100:
709         testl   $2, M
710         je      .L110
711
712 #ifdef LN
713        movl     K, %eax
714        sall     $1 + BASE_SHIFT, %eax
715        subl     %eax, AORIG
716 #endif
717
718 #if defined(LN) || defined(RT)
719         movl    KK, %eax
720         movl    AORIG, AA
721         leal    (, %eax, SIZE), %eax
722         leal    (AA, %eax, 2), AA
723 #endif
724
725         leal    BUFFER, BB
726
727 #if defined(LN) || defined(RT)
728         movl    KK, %eax
729         sall    $BASE_SHIFT, %eax
730         leal    (BB, %eax, 4), BB
731 #endif  
732
733         xorps   %xmm4, %xmm4
734         xorps   %xmm5, %xmm5
735         xorps   %xmm6, %xmm6
736         xorps   %xmm7, %xmm7
737
738 #ifdef  movsd
739         xorps   %xmm0, %xmm0
740 #endif
741         movsd    0 * SIZE(AA), %xmm0
742 #ifdef  movsd
743         xorps   %xmm1, %xmm1
744 #endif
745         movsd    8 * SIZE(AA), %xmm1
746         movaps   0 * SIZE(BB), %xmm2
747         movaps  16 * SIZE(BB), %xmm3
748
749 #if defined(LT) || defined(RN)
750         movl    KK, %eax
751 #else
752         movl    K, %eax
753         subl    KK, %eax
754 #endif
755         sarl    $3, %eax
756         je      .L105
757         ALIGN_4
758
759 .L102:
760         mulps   %xmm0, %xmm2
761 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
762         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
763 #endif
764         movsd    2 * SIZE(AA), %xmm0
765         addps   %xmm2, %xmm4
766         movaps   4 * SIZE(BB), %xmm2
767         mulps   %xmm0, %xmm2
768         movsd    4 * SIZE(AA), %xmm0
769         addps   %xmm2, %xmm5
770         movaps   8 * SIZE(BB), %xmm2
771         mulps   %xmm0, %xmm2
772         movsd    6 * SIZE(AA), %xmm0
773         addps   %xmm2, %xmm6
774         movaps  12 * SIZE(BB), %xmm2
775         mulps   %xmm0, %xmm2
776         movsd   16 * SIZE(AA), %xmm0
777         addps   %xmm2, %xmm7
778         movaps  32 * SIZE(BB), %xmm2
779         mulps   %xmm1, %xmm3
780         movsd   10 * SIZE(AA), %xmm1
781         addps   %xmm3, %xmm4
782         movaps  20 * SIZE(BB), %xmm3
783         mulps   %xmm1, %xmm3
784         movsd   12 * SIZE(AA), %xmm1
785         addps   %xmm3, %xmm5
786         movaps  24 * SIZE(BB), %xmm3
787         mulps   %xmm1, %xmm3
788         movsd   14 * SIZE(AA), %xmm1
789         addps   %xmm3, %xmm6
790         movaps  28 * SIZE(BB), %xmm3
791         mulps   %xmm1, %xmm3
792         movsd   24 * SIZE(AA), %xmm1
793         addps   %xmm3, %xmm7
794         movaps  48 * SIZE(BB), %xmm3
795
796         addl    $16 * SIZE, AA
797         addl    $32 * SIZE, BB
798         decl   %eax
799         jne    .L102
800         ALIGN_4
801
802 .L105:
803 #if defined(LT) || defined(RN)
804         movl    KK, %eax
805 #else
806         movl    K, %eax
807         subl    KK, %eax
808 #endif
809         andl    $7, %eax                # if (k & 1)
810         BRANCH
811         je .L108
812         ALIGN_4
813
814 .L106:
815         mulps   %xmm0, %xmm2
816         addps   %xmm2, %xmm4
817         movsd    2 * SIZE(AA), %xmm0
818         movaps   4 * SIZE(BB), %xmm2
819
820         addl    $2 * SIZE, AA
821         addl    $4 * SIZE, BB
822         decl    %eax
823         jg      .L106
824         ALIGN_4
825
826 .L108:
827         addps   %xmm5, %xmm4
828         addps   %xmm7, %xmm6
829         addps   %xmm6, %xmm4
830
831 #if defined(LN) || defined(RT)
832         movl    KK, %eax
833 #ifdef LN
834         subl    $2, %eax
835 #else
836         subl    $1, %eax
837 #endif
838
839         movl    AORIG, AA
840         movl    BORIG, B
841         leal    BUFFER, BB
842
843         sall    $ BASE_SHIFT, %eax
844         leal    (AA, %eax, 2), AA
845         leal    (B,  %eax, 1), B
846         leal    (BB, %eax, 4), BB
847 #endif
848
849 #if defined(LN) || defined(LT)
850         pshufd  $1, %xmm4, %xmm6
851
852         movss    0 * SIZE(B), %xmm1
853         movss    1 * SIZE(B), %xmm3
854
855         subss   %xmm4,  %xmm1
856         subss   %xmm6,  %xmm3
857 #else
858 #ifdef  movsd
859         xorps   %xmm0, %xmm0
860 #endif
861         movsd    0 * SIZE(AA), %xmm0
862
863         subps   %xmm4, %xmm0
864 #endif
865
866 #ifdef LN
867         movaps    0 * SIZE(AA), %xmm4
868         pshufd   $0xff, %xmm4, %xmm6
869         mulss    %xmm6, %xmm3
870         pshufd   $0xaa, %xmm4, %xmm6
871         mulss    %xmm3, %xmm6
872         subss    %xmm6, %xmm1
873
874         pshufd   $0x00, %xmm4, %xmm6
875         mulss    %xmm6, %xmm1
876 #endif
877
878 #ifdef LT
879         movaps   0 * SIZE(AA), %xmm4
880         pshufd   $0x00, %xmm4, %xmm6
881         mulss    %xmm6, %xmm1
882         pshufd   $0x55, %xmm4, %xmm6
883         mulss    %xmm1, %xmm6
884         subss    %xmm6, %xmm3
885
886         pshufd   $0xff, %xmm4, %xmm6
887         mulss    %xmm6, %xmm3
888 #endif
889
890 #if defined(RN) || defined(RT)
891         movss    0 * SIZE(B), %xmm6
892         pshufd   $0x00, %xmm6, %xmm7
893         mulps    %xmm7, %xmm0
894 #endif
895
896 #if defined(LN) || defined(LT)
897         movss   %xmm1,   0 * SIZE(B)
898         movss   %xmm3,   1 * SIZE(B)
899
900         pshufd  $0x00, %xmm1, %xmm0
901         movaps  %xmm0,   0 * SIZE(BB)
902         pshufd  $0x00, %xmm3, %xmm0
903         movaps  %xmm0,   4 * SIZE(BB)
904 #else
905         movlps  %xmm0,   0 * SIZE(AA)
906 #endif
907
908 #ifdef LN
909         subl    $2 * SIZE, CO1
910 #endif
911
912 #if defined(LN) || defined(LT)
913         movss   %xmm1, 0 * SIZE(CO1)
914         movss   %xmm3, 1 * SIZE(CO1)
915 #else
916         movlps  %xmm0, 0 * SIZE(CO1)
917 #endif
918
919 #ifndef LN
920         addl    $2 * SIZE, CO1
921 #endif
922
923 #if defined(LT) || defined(RN)
924         movl    K,  %eax
925         subl    KK, %eax
926         leal    (,%eax, SIZE), %eax
927         leal    (AA, %eax, 2), AA
928 #ifdef LT
929         addl    $2 * SIZE, B
930 #endif
931 #endif
932
933 #ifdef LN
934         subl    $2, KK
935         movl    BORIG, B
936 #endif
937
938 #ifdef LT
939         addl    $2, KK
940 #endif
941
942 #ifdef RT
943         movl    K, %eax
944         movl    BORIG, B
945         sall    $1 + BASE_SHIFT, %eax
946         addl    %eax, AORIG
947 #endif
948         ALIGN_4
949
950 .L110:
951         testl   $1, M
952         je      .L119
953
954 #ifdef LN
955        movl     K, %eax
956        sall     $BASE_SHIFT, %eax
957        subl     %eax, AORIG
958 #endif
959
960 #if defined(LN) || defined(RT)
961         movl    KK, %eax
962         movl    AORIG, AA
963         leal    (AA, %eax, SIZE), AA
964 #endif
965
966         leal    BUFFER, BB
967
968 #if defined(LN) || defined(RT)
969         movl    KK, %eax
970         sall    $BASE_SHIFT, %eax
971         leal    (BB, %eax, 4), BB
972 #endif  
973
974         xorps   %xmm4, %xmm4
975         xorps   %xmm5, %xmm5
976         xorps   %xmm6, %xmm6
977         xorps   %xmm7, %xmm7
978
979         movss    0 * SIZE(AA), %xmm0
980         movss    4 * SIZE(AA), %xmm1
981         movss    0 * SIZE(BB), %xmm2
982         movss   16 * SIZE(BB), %xmm3
983
984 #if defined(LT) || defined(RN)
985         movl    KK, %eax
986 #else
987         movl    K, %eax
988         subl    KK, %eax
989 #endif
990         sarl    $3, %eax
991         je      .L115
992         ALIGN_4
993
994 .L112:
995         mulss   %xmm0, %xmm2
996 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
997         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
998 #endif
999         movss    1 * SIZE(AA), %xmm0
1000         addss   %xmm2, %xmm4
1001         movss   32 * SIZE(BB), %xmm2
1002         mulss    4 * SIZE(BB), %xmm0
1003         addss   %xmm0, %xmm5
1004         movss    2 * SIZE(AA), %xmm0
1005         mulss    8 * SIZE(BB), %xmm0
1006         addss   %xmm0, %xmm6
1007         movss    3 * SIZE(AA), %xmm0
1008         mulss   12 * SIZE(BB), %xmm0
1009         addss   %xmm0, %xmm7
1010         movss    8 * SIZE(AA), %xmm0
1011         mulss   %xmm1, %xmm3
1012         movss    5 * SIZE(AA), %xmm1
1013         addss   %xmm3, %xmm4
1014         movss   48 * SIZE(BB), %xmm3
1015         mulss   20 * SIZE(BB), %xmm1
1016         addss   %xmm1, %xmm5
1017         movss    6 * SIZE(AA), %xmm1
1018         mulss   24 * SIZE(BB), %xmm1
1019         addss   %xmm1, %xmm6
1020         movss    7 * SIZE(AA), %xmm1
1021         mulss   28 * SIZE(BB), %xmm1
1022         addss   %xmm1, %xmm7
1023         movss   12 * SIZE(AA), %xmm1
1024
1025         addl    $ 8 * SIZE, AA
1026         addl    $32 * SIZE, BB
1027         decl   %eax
1028         jne    .L112
1029         ALIGN_4
1030
1031 .L115:
1032 #if defined(LT) || defined(RN)
1033         movl    KK, %eax
1034 #else
1035         movl    K, %eax
1036         subl    KK, %eax
1037 #endif
1038         andl    $7, %eax                # if (k & 1)
1039         BRANCH
1040         je .L118
1041         ALIGN_4
1042
1043 .L116:
1044         mulss   %xmm0, %xmm2
1045         movss    1 * SIZE(AA), %xmm0
1046         addss   %xmm2, %xmm4
1047         movss    4 * SIZE(BB), %xmm2
1048
1049         addl    $ 1 * SIZE, AA
1050         addl    $ 4 * SIZE, BB
1051         decl    %eax
1052         jg      .L116
1053         ALIGN_4
1054
1055 .L118:
1056         addss   %xmm5, %xmm4
1057         addss   %xmm7, %xmm6
1058         addss   %xmm6, %xmm4
1059
1060 #if defined(LN) || defined(RT)
1061         movl    KK, %eax
1062         subl    $1, %eax
1063
1064         movl    AORIG, AA
1065         movl    BORIG, B
1066         leal    BUFFER, BB
1067
1068         sall    $ BASE_SHIFT, %eax
1069         leal    (AA, %eax, 1), AA
1070         leal    (B,  %eax, 1), B
1071         leal    (BB, %eax, 4), BB
1072 #endif
1073
1074 #if defined(LN) || defined(LT)
1075         movss    0 * SIZE(B), %xmm1
1076         subss   %xmm4,  %xmm1
1077 #else
1078         movss    0 * SIZE(AA), %xmm0
1079         subss   %xmm4, %xmm0
1080 #endif
1081
1082 #if defined(LN) || defined(LT)
1083         mulss    0 * SIZE(AA), %xmm1
1084 #endif
1085
1086 #if defined(RN) || defined(RT)
1087         mulss    0 * SIZE(B), %xmm0
1088 #endif
1089
1090 #if defined(LN) || defined(LT)
1091         movss   %xmm1,   0 * SIZE(B)
1092
1093         pshufd  $0x00, %xmm1, %xmm0
1094         movaps  %xmm0,   0 * SIZE(BB)
1095 #else
1096         movss   %xmm0,   0 * SIZE(AA)
1097 #endif
1098
1099 #ifdef LN
1100         subl    $1 * SIZE, CO1
1101 #endif
1102
1103 #if defined(LN) || defined(LT)
1104         movss   %xmm1, 0 * SIZE(CO1)
1105 #else
1106         movss   %xmm0, 0 * SIZE(CO1)
1107 #endif
1108
1109 #ifndef LN
1110         addl    $1 * SIZE, CO1
1111 #endif
1112
1113 #if defined(LT) || defined(RN)
1114         movl    K,  %eax
1115         subl    KK, %eax
1116         leal    (AA, %eax, SIZE), AA
1117 #ifdef LT
1118         addl    $1 * SIZE, B
1119 #endif
1120 #endif
1121
1122 #ifdef LN
1123         subl    $1, KK
1124         movl    BORIG, B
1125 #endif
1126
1127 #ifdef LT
1128         addl    $1, KK
1129 #endif
1130
1131 #ifdef RT
1132         movl    K, %eax
1133         movl    BORIG, B
1134         sall    $BASE_SHIFT, %eax
1135         addl    %eax, AORIG
1136 #endif
1137         ALIGN_4
1138
1139 .L119:
1140 #ifdef LN
1141        movl     K, %eax
1142        leal     (B, %eax, SIZE), B
1143 #endif
1144
1145 #if defined(LT) || defined(RN)
1146         movl    K,  %eax
1147         subl    KK, %eax
1148         leal    (B,  %eax, SIZE), B
1149 #endif
1150
1151 #ifdef RN
1152         addl    $1, KK
1153 #endif
1154
1155 #ifdef RT
1156         subl    $1, KK
1157 #endif
1158         ALIGN_4
1159
1160 .L40:
1161         testl   $2, N
1162         je      .L80
1163
1164 #ifdef LN
1165         movl    OFFSET, %eax
1166         addl    M, %eax
1167         movl    %eax, KK
1168 #endif  
1169
1170         leal    BUFFER, %ecx
1171
1172 #ifdef RT
1173        movl     K, %eax
1174        sall     $1 + BASE_SHIFT, %eax
1175        subl     %eax, B
1176 #endif
1177
1178 #if defined(LN) || defined(RT)
1179         movl    KK, %eax
1180         movl    B, BORIG
1181         sall    $1 + BASE_SHIFT, %eax
1182         leal    (B,  %eax, 1), B
1183         leal    (BB, %eax, 4), BB
1184 #endif  
1185
1186 #ifdef LT
1187         movl    OFFSET, %eax
1188         movl    %eax, KK
1189 #endif
1190
1191 #if defined(LT) || defined(RN)
1192         movl    KK, %eax
1193 #else
1194         movl    K, %eax
1195         subl    KK, %eax
1196 #endif
1197         sarl    $2, %eax
1198         jle     .L45
1199         ALIGN_4
1200         
1201 .L42:
1202         movaps   0 * SIZE(B), %xmm3
1203         movaps   4 * SIZE(B), %xmm7
1204
1205         pshufd   $0x00, %xmm3, %xmm0
1206         pshufd   $0x55, %xmm3, %xmm1
1207         pshufd   $0xaa, %xmm3, %xmm2
1208         pshufd   $0xff, %xmm3, %xmm3
1209
1210         pshufd   $0x00, %xmm7, %xmm4
1211         pshufd   $0x55, %xmm7, %xmm5
1212         pshufd   $0xaa, %xmm7, %xmm6
1213         pshufd   $0xff, %xmm7, %xmm7
1214
1215         movaps  %xmm0,  0 * SIZE(BB)
1216         movaps  %xmm1,  4 * SIZE(BB)
1217         movaps  %xmm2,  8 * SIZE(BB)
1218         movaps  %xmm3, 12 * SIZE(BB)
1219         movaps  %xmm4, 16 * SIZE(BB)
1220         movaps  %xmm5, 20 * SIZE(BB)
1221         movaps  %xmm6, 24 * SIZE(BB)
1222         movaps  %xmm7, 28 * SIZE(BB)
1223
1224         addl    $ 8 * SIZE, B
1225         addl    $32 * SIZE, %ecx
1226         decl    %eax
1227         jne     .L42
1228         ALIGN_4
1229
1230 .L45:
1231 #if defined(LT) || defined(RN)
1232         movl    KK, %eax
1233 #else
1234         movl    K, %eax
1235         subl    KK, %eax
1236 #endif
1237         andl    $3, %eax
1238         BRANCH
1239         jle     .L50
1240         ALIGN_4
1241
1242 .L46:
1243         movsd    0 * SIZE(B), %xmm3
1244
1245         pshufd   $0x00, %xmm3, %xmm0
1246         pshufd   $0x55, %xmm3, %xmm1
1247
1248         movaps  %xmm0,  0 * SIZE(BB)
1249         movaps  %xmm1,  4 * SIZE(BB)
1250
1251         addl    $2 * SIZE, B
1252         addl    $8 * SIZE, %ecx
1253         decl    %eax
1254         jne     .L46
1255         ALIGN_4
1256         
1257 .L50:
1258 #if defined(LT) || defined(RN)
1259         movl    A, AA
1260 #else
1261         movl    A, %eax
1262         movl    %eax, AORIG
1263 #endif
1264
1265         leal    (, LDC, 2), %eax
1266
1267 #ifdef RT
1268         subl    %eax, C
1269 #endif
1270         movl    C, CO1
1271 #ifndef RT
1272         addl    %eax, C
1273 #endif
1274
1275         movl    M,  %ebx
1276         sarl    $2, %ebx        # i = (m >> 2)
1277         jle     .L60
1278         ALIGN_4
1279
1280 .L51:
1281 #ifdef LN
1282        movl     K, %eax
1283        sall     $2 + BASE_SHIFT, %eax
1284        subl     %eax, AORIG
1285 #endif
1286
1287 #if defined(LN) || defined(RT)
1288         movl    KK, %eax
1289         movl    AORIG, AA
1290         leal    (, %eax, SIZE), %eax
1291         leal    (AA, %eax, 4), AA
1292 #endif
1293
1294         leal    BUFFER, BB
1295
1296 #if defined(LN) || defined(RT)
1297         movl    KK, %eax
1298         sall    $1 + BASE_SHIFT, %eax
1299         leal    (BB, %eax, 4), BB
1300 #endif  
1301
1302         xorps   %xmm4, %xmm4
1303         xorps   %xmm5, %xmm5
1304         xorps   %xmm6, %xmm6
1305         xorps   %xmm7, %xmm7
1306
1307         movaps   0 * SIZE(AA), %xmm0
1308         movaps  16 * SIZE(AA), %xmm1
1309         movaps   0 * SIZE(BB), %xmm2
1310         movaps  16 * SIZE(BB), %xmm3
1311
1312         PREFETCHW       3 * SIZE(CO1)
1313         PREFETCHW       3 * SIZE(CO1, LDC)
1314
1315 #if defined(LT) || defined(RN)
1316         movl    KK, %eax
1317 #else
1318         movl    K, %eax
1319         subl    KK, %eax
1320 #endif
1321         sarl    $3, %eax
1322         je      .L55
1323         ALIGN_4
1324
1325 .L52:
1326         mulps   %xmm0, %xmm2
1327 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
1328         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
1329 #endif
1330         mulps    4 * SIZE(BB), %xmm0
1331         addps   %xmm2, %xmm4
1332         movaps   8 * SIZE(BB), %xmm2
1333         addps   %xmm0, %xmm5
1334         movaps   4 * SIZE(AA), %xmm0
1335
1336         mulps   %xmm0, %xmm2
1337         mulps   12 * SIZE(BB), %xmm0
1338         addps   %xmm2, %xmm4
1339         movaps  32 * SIZE(BB), %xmm2
1340         addps   %xmm0, %xmm5
1341         movaps   8 * SIZE(AA), %xmm0
1342
1343         mulps   %xmm0, %xmm3
1344         mulps   20 * SIZE(BB), %xmm0
1345         addps   %xmm3, %xmm4
1346         movaps  24 * SIZE(BB), %xmm3
1347         addps   %xmm0, %xmm5
1348         movaps  12 * SIZE(AA), %xmm0
1349
1350         mulps   %xmm0, %xmm3
1351         mulps   28 * SIZE(BB), %xmm0
1352         addps   %xmm3, %xmm4
1353         movaps  48 * SIZE(BB), %xmm3
1354         addps   %xmm0, %xmm5
1355         movaps  32 * SIZE(AA), %xmm0
1356
1357 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
1358         prefetcht0 (PREFETCHSIZE  + 16) * SIZE(AA)
1359 #endif
1360         mulps   %xmm1, %xmm2
1361         mulps   36 * SIZE(BB), %xmm1
1362         addps   %xmm2, %xmm4
1363         movaps  40 * SIZE(BB), %xmm2
1364         addps   %xmm1, %xmm5
1365         movaps  20 * SIZE(AA), %xmm1
1366
1367         mulps   %xmm1, %xmm2
1368         mulps   44 * SIZE(BB), %xmm1
1369         addps   %xmm2, %xmm4
1370         movaps  64 * SIZE(BB), %xmm2
1371         addps   %xmm1, %xmm5
1372         movaps  24 * SIZE(AA), %xmm1
1373
1374         mulps   %xmm1, %xmm3
1375         mulps   52 * SIZE(BB), %xmm1
1376         addps   %xmm3, %xmm4
1377         movaps  56 * SIZE(BB), %xmm3
1378         addps   %xmm1, %xmm5
1379         movaps  28 * SIZE(AA), %xmm1
1380
1381         mulps   %xmm1, %xmm3
1382         mulps   60 * SIZE(BB), %xmm1
1383         addps   %xmm3, %xmm4
1384         movaps  80 * SIZE(BB), %xmm3
1385         addps   %xmm1, %xmm5
1386         movaps  48 * SIZE(AA), %xmm1
1387
1388         addl    $32 * SIZE, AA
1389         addl    $64 * SIZE, BB
1390         decl   %eax
1391         jne    .L52
1392         ALIGN_4
1393
1394 .L55:
1395 #if defined(LT) || defined(RN)
1396         movl    KK, %eax
1397 #else
1398         movl    K, %eax
1399         subl    KK, %eax
1400 #endif
1401         andl    $7, %eax                # if (k & 1)
1402         BRANCH
1403         je .L58
1404         ALIGN_4
1405
1406 .L56:
1407         mulps   %xmm0, %xmm2
1408         mulps    4 * SIZE(BB), %xmm0
1409         addps   %xmm2, %xmm4
1410         movaps   8 * SIZE(BB), %xmm2
1411         addps   %xmm0, %xmm5
1412         movaps   4 * SIZE(AA), %xmm0
1413
1414         addl    $4 * SIZE, AA
1415         addl    $8 * SIZE, BB
1416         decl    %eax
1417         jg      .L56
1418         ALIGN_4
1419
1420 .L58:
1421 #if defined(LN) || defined(RT)
1422         movl    KK, %eax
1423 #ifdef LN
1424         subl    $4, %eax
1425 #else
1426         subl    $2, %eax
1427 #endif
1428
1429         movl    AORIG, AA
1430         movl    BORIG, B
1431         leal    BUFFER, BB
1432
1433         sall    $1 + BASE_SHIFT, %eax
1434         leal    (AA, %eax, 2), AA
1435         leal    (B,  %eax, 1), B
1436         leal    (BB, %eax, 4), BB
1437 #endif
1438
1439 #if defined(LN) || defined(LT)
1440         movaps   %xmm4, %xmm0
1441         unpcklps %xmm6, %xmm4
1442         unpckhps %xmm6, %xmm0
1443
1444         movaps   %xmm5, %xmm1
1445         unpcklps %xmm7, %xmm5
1446         unpckhps %xmm7, %xmm1
1447
1448         movaps   %xmm4, %xmm6
1449         unpcklps %xmm5, %xmm4
1450         unpckhps %xmm5, %xmm6
1451
1452         movaps   %xmm0, %xmm2
1453         unpcklps %xmm1, %xmm0
1454         unpckhps %xmm1, %xmm2
1455
1456 #ifdef  movsd
1457         xorps   %xmm1, %xmm1
1458 #endif
1459         movsd    0 * SIZE(B), %xmm1
1460 #ifdef  movsd
1461         xorps   %xmm3, %xmm3
1462 #endif
1463         movsd    2 * SIZE(B), %xmm3
1464 #ifdef  movsd
1465         xorps   %xmm5, %xmm5
1466 #endif
1467         movsd    4 * SIZE(B), %xmm5
1468 #ifdef  movsd
1469         xorps   %xmm7, %xmm7
1470 #endif
1471         movsd    6 * SIZE(B), %xmm7
1472
1473         subps   %xmm4,  %xmm1
1474         subps   %xmm6,  %xmm3
1475         subps   %xmm0,  %xmm5
1476         subps   %xmm2,  %xmm7
1477 #else
1478         movaps   0 * SIZE(AA), %xmm0
1479         movaps   4 * SIZE(AA), %xmm1
1480
1481         subps   %xmm4, %xmm0
1482         subps   %xmm5, %xmm1
1483 #endif
1484
1485 #ifdef LN
1486         movaps   12 * SIZE(AA), %xmm4
1487         pshufd   $0xff, %xmm4, %xmm6
1488         mulps    %xmm6, %xmm7
1489         pshufd   $0xaa, %xmm4, %xmm6
1490         mulps    %xmm7, %xmm6
1491         subps    %xmm6, %xmm5
1492         pshufd   $0x55, %xmm4, %xmm6
1493         mulps    %xmm7, %xmm6
1494         subps    %xmm6, %xmm3
1495         pshufd   $0x00, %xmm4, %xmm6
1496         mulps    %xmm7, %xmm6
1497         subps    %xmm6, %xmm1
1498
1499         movaps    8 * SIZE(AA), %xmm4
1500         pshufd   $0xaa, %xmm4, %xmm6
1501         mulps    %xmm6, %xmm5
1502         pshufd   $0x55, %xmm4, %xmm6
1503         mulps    %xmm5, %xmm6
1504         subps    %xmm6, %xmm3
1505         pshufd   $0x00, %xmm4, %xmm6
1506         mulps    %xmm5, %xmm6
1507         subps    %xmm6, %xmm1
1508
1509         movaps    4 * SIZE(AA), %xmm4
1510         pshufd   $0x55, %xmm4, %xmm6
1511         mulps    %xmm6, %xmm3
1512         pshufd   $0x00, %xmm4, %xmm6
1513         mulps    %xmm3, %xmm6
1514         subps    %xmm6, %xmm1
1515
1516         movaps    0 * SIZE(AA), %xmm4
1517         pshufd   $0x00, %xmm4, %xmm6
1518         mulps    %xmm6, %xmm1
1519 #endif
1520
1521 #ifdef LT
1522         movaps   0 * SIZE(AA), %xmm4
1523         pshufd   $0x00, %xmm4, %xmm6
1524         mulps    %xmm6, %xmm1
1525
1526         pshufd   $0x55, %xmm4, %xmm6
1527         mulps    %xmm1, %xmm6
1528         subps    %xmm6, %xmm3
1529         pshufd   $0xaa, %xmm4, %xmm6
1530         mulps    %xmm1, %xmm6
1531         subps    %xmm6, %xmm5
1532         pshufd   $0xff, %xmm4, %xmm6
1533         mulps    %xmm1, %xmm6
1534         subps    %xmm6, %xmm7
1535
1536         movaps   4 * SIZE(AA), %xmm4
1537         pshufd   $0x55, %xmm4, %xmm6
1538         mulps    %xmm6, %xmm3
1539         pshufd   $0xaa, %xmm4, %xmm6
1540         mulps    %xmm3, %xmm6
1541         subps    %xmm6, %xmm5
1542         pshufd   $0xff, %xmm4, %xmm6
1543         mulps    %xmm3, %xmm6
1544         subps    %xmm6, %xmm7
1545
1546         movaps   8 * SIZE(AA), %xmm4
1547         pshufd   $0xaa, %xmm4, %xmm6
1548         mulps    %xmm6, %xmm5
1549         pshufd   $0xff, %xmm4, %xmm6
1550         mulps    %xmm5, %xmm6
1551         subps    %xmm6, %xmm7
1552
1553         movaps  12 * SIZE(AA), %xmm4
1554         pshufd   $0xff, %xmm4, %xmm6
1555         mulps    %xmm6, %xmm7
1556 #endif
1557
1558 #ifdef RN
1559         movaps   0 * SIZE(B), %xmm6
1560         pshufd   $0x00, %xmm6, %xmm7
1561         mulps    %xmm7, %xmm0
1562         pshufd   $0x55, %xmm6, %xmm7
1563         mulps    %xmm0, %xmm7
1564         subps    %xmm7, %xmm1
1565
1566         pshufd   $0xff, %xmm6, %xmm7
1567         mulps    %xmm7, %xmm1
1568 #endif
1569
1570 #ifdef RT
1571         movaps    0 * SIZE(B), %xmm6
1572         pshufd   $0xff, %xmm6, %xmm7
1573         mulps    %xmm7, %xmm1
1574         pshufd   $0xaa, %xmm6, %xmm7
1575         mulps    %xmm1, %xmm7
1576         subps    %xmm7, %xmm0
1577
1578         pshufd   $0x00, %xmm6, %xmm7
1579         mulps    %xmm7, %xmm0
1580 #endif
1581
1582 #if defined(LN) || defined(LT)
1583         movlps  %xmm1,   0 * SIZE(B)
1584         movlps  %xmm3,   2 * SIZE(B)
1585         movlps  %xmm5,   4 * SIZE(B)
1586         movlps  %xmm7,   6 * SIZE(B)
1587
1588         pshufd  $0x00, %xmm1, %xmm0
1589         pshufd  $0x55, %xmm1, %xmm2
1590         movaps  %xmm0,   0 * SIZE(BB)
1591         movaps  %xmm2,   4 * SIZE(BB)
1592
1593         pshufd  $0x00, %xmm3, %xmm0
1594         pshufd  $0x55, %xmm3, %xmm2
1595         movaps  %xmm0,   8 * SIZE(BB)
1596         movaps  %xmm2,  12 * SIZE(BB)
1597
1598         pshufd  $0x00, %xmm5, %xmm0
1599         pshufd  $0x55, %xmm5, %xmm2
1600         movaps  %xmm0,  16 * SIZE(BB)
1601         movaps  %xmm2,  20 * SIZE(BB)
1602
1603         pshufd  $0x00, %xmm7, %xmm0
1604         pshufd  $0x55, %xmm7, %xmm2
1605         movaps  %xmm0,  24 * SIZE(BB)
1606         movaps  %xmm2,  28 * SIZE(BB)
1607 #else
1608         movaps  %xmm0,   0 * SIZE(AA)
1609         movaps  %xmm1,   4 * SIZE(AA)
1610 #endif
1611
1612 #ifdef LN
1613         subl    $4 * SIZE, CO1
1614 #endif
1615
1616 #if defined(LN) || defined(LT)
1617         unpcklps %xmm5, %xmm1
1618         unpcklps %xmm7, %xmm3
1619
1620         movaps   %xmm1, %xmm2
1621         unpcklps %xmm3, %xmm1
1622         unpckhps %xmm3, %xmm2
1623
1624         movlps  %xmm1, 0 * SIZE(CO1)
1625         movhps  %xmm1, 2 * SIZE(CO1)
1626         movlps  %xmm2, 0 * SIZE(CO1, LDC, 1)
1627         movhps  %xmm2, 2 * SIZE(CO1, LDC, 1)
1628 #else
1629         movlps  %xmm0, 0 * SIZE(CO1)
1630         movhps  %xmm0, 2 * SIZE(CO1)
1631         movlps  %xmm1, 0 * SIZE(CO1, LDC, 1)
1632         movhps  %xmm1, 2 * SIZE(CO1, LDC, 1)
1633 #endif
1634
1635 #ifndef LN
1636         addl    $4 * SIZE, CO1
1637 #endif
1638
1639 #if defined(LT) || defined(RN)
1640         movl    K,  %eax
1641         subl    KK, %eax
1642         leal    (,%eax, SIZE), %eax
1643         leal    (AA, %eax, 4), AA
1644 #ifdef LT
1645         addl    $8 * SIZE, B
1646 #endif
1647 #endif
1648
1649 #ifdef LN
1650         subl    $4, KK
1651         movl    BORIG, B
1652 #endif
1653
1654 #ifdef LT
1655         addl    $4, KK
1656 #endif
1657
1658 #ifdef RT
1659         movl    K, %eax
1660         movl    BORIG, B
1661         sall    $2 + BASE_SHIFT, %eax
1662         addl    %eax, AORIG
1663 #endif
1664
1665         decl    %ebx                    # i --
1666         jg      .L51
1667         ALIGN_4
1668
1669 .L60:
1670         testl   $2, M
1671         je      .L70
1672
1673 #ifdef LN
1674        movl     K, %eax
1675        sall     $1 + BASE_SHIFT, %eax
1676        subl     %eax, AORIG
1677 #endif
1678
1679 #if defined(LN) || defined(RT)
1680         movl    KK, %eax
1681         movl    AORIG, AA
1682         leal    (, %eax, SIZE), %eax
1683         leal    (AA, %eax, 2), AA
1684 #endif
1685
1686         leal    BUFFER, BB
1687
1688 #if defined(LN) || defined(RT)
1689         movl    KK, %eax
1690         sall    $1 + BASE_SHIFT, %eax
1691         leal    (BB, %eax, 4), BB
1692 #endif  
1693
1694         xorps   %xmm4, %xmm4
1695         xorps   %xmm5, %xmm5
1696         xorps   %xmm6, %xmm6
1697         xorps   %xmm7, %xmm7
1698
1699 #ifdef  movsd
1700         xorps   %xmm0, %xmm0
1701 #endif
1702         movsd    0 * SIZE(AA), %xmm0
1703 #ifdef  movsd
1704         xorps   %xmm1, %xmm1
1705 #endif
1706         movsd    8 * SIZE(AA), %xmm1
1707         movaps   0 * SIZE(BB), %xmm2
1708         movaps  16 * SIZE(BB), %xmm3
1709
1710 #if defined(LT) || defined(RN)
1711         movl    KK, %eax
1712 #else
1713         movl    K, %eax
1714         subl    KK, %eax
1715 #endif
1716         sarl    $3, %eax
1717         je      .L65
1718         ALIGN_4
1719
1720 .L62:
1721 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
1722         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
1723 #endif
1724
1725         mulps   %xmm0, %xmm2
1726         addps   %xmm2, %xmm4
1727         movaps   4 * SIZE(BB), %xmm2
1728         mulps   %xmm0, %xmm2
1729         movsd    2 * SIZE(AA), %xmm0
1730         addps   %xmm2, %xmm5
1731         movaps   8 * SIZE(BB), %xmm2
1732
1733         mulps   %xmm0, %xmm2
1734         addps   %xmm2, %xmm6
1735         movaps  12 * SIZE(BB), %xmm2
1736         mulps   %xmm0, %xmm2
1737         movsd    4 * SIZE(AA), %xmm0
1738         addps   %xmm2, %xmm7
1739         movaps  32 * SIZE(BB), %xmm2
1740
1741         mulps   %xmm0, %xmm3
1742         addps   %xmm3, %xmm4
1743         movaps  20 * SIZE(BB), %xmm3
1744         mulps   %xmm0, %xmm3
1745         movsd    6 * SIZE(AA), %xmm0
1746         addps   %xmm3, %xmm5
1747         movaps  24 * SIZE(BB), %xmm3
1748
1749         mulps   %xmm0, %xmm3
1750         addps   %xmm3, %xmm6
1751         movaps  28 * SIZE(BB), %xmm3
1752         mulps   %xmm0, %xmm3
1753         movsd   16 * SIZE(AA), %xmm0
1754         addps   %xmm3, %xmm7
1755         movaps  48 * SIZE(BB), %xmm3
1756
1757         mulps   %xmm1, %xmm2
1758         addps   %xmm2, %xmm4
1759         movaps  36 * SIZE(BB), %xmm2
1760         mulps   %xmm1, %xmm2
1761         movsd   10 * SIZE(AA), %xmm1
1762         addps   %xmm2, %xmm5
1763         movaps  40 * SIZE(BB), %xmm2
1764
1765         mulps   %xmm1, %xmm2
1766         addps   %xmm2, %xmm6
1767         movaps  44 * SIZE(BB), %xmm2
1768         mulps   %xmm1, %xmm2
1769         movsd   12 * SIZE(AA), %xmm1
1770         addps   %xmm2, %xmm7
1771         movaps  64 * SIZE(BB), %xmm2
1772
1773         mulps   %xmm1, %xmm3
1774         addps   %xmm3, %xmm4
1775         movaps  52 * SIZE(BB), %xmm3
1776         mulps   %xmm1, %xmm3
1777         movsd   14 * SIZE(AA), %xmm1
1778         addps   %xmm3, %xmm5
1779         movaps  56 * SIZE(BB), %xmm3
1780
1781         mulps   %xmm1, %xmm3
1782         addps   %xmm3, %xmm6
1783         movaps  60 * SIZE(BB), %xmm3
1784         mulps   %xmm1, %xmm3
1785         movsd   24 * SIZE(AA), %xmm1
1786         addps   %xmm3, %xmm7
1787         movaps  80 * SIZE(BB), %xmm3
1788
1789         addl    $16 * SIZE, AA
1790         addl    $64 * SIZE, BB
1791         decl   %eax
1792         jne    .L62
1793         ALIGN_4
1794
1795 .L65:
1796 #if defined(LT) || defined(RN)
1797         movl    KK, %eax
1798 #else
1799         movl    K, %eax
1800         subl    KK, %eax
1801 #endif
1802         andl    $7, %eax                # if (k & 1)
1803         BRANCH
1804         je .L68
1805         ALIGN_4
1806
1807 .L66:
1808         mulps   %xmm0, %xmm2
1809         addps   %xmm2, %xmm4
1810         movaps   4 * SIZE(BB), %xmm2
1811         mulps   %xmm0, %xmm2
1812         movsd    2 * SIZE(AA), %xmm0
1813         addps   %xmm2, %xmm5
1814         movaps   8 * SIZE(BB), %xmm2
1815
1816         addl    $2 * SIZE, AA
1817         addl    $8 * SIZE, BB
1818         decl    %eax
1819         jg      .L66
1820         ALIGN_4
1821
1822 .L68:
1823         addps   %xmm6, %xmm4
1824         addps   %xmm7, %xmm5
1825
1826 #if defined(LN) || defined(RT)
1827         movl    KK, %eax
1828 #ifdef LN
1829         subl    $2, %eax
1830 #else
1831         subl    $2, %eax
1832 #endif
1833
1834         movl    AORIG, AA
1835         movl    BORIG, B
1836         leal    BUFFER, BB
1837
1838         sall    $BASE_SHIFT, %eax
1839         leal    (AA, %eax, 2), AA
1840         leal    (B,  %eax, 2), B
1841         leal    (BB, %eax, 8), BB
1842 #endif
1843
1844 #if defined(LN) || defined(LT)
1845         unpcklps %xmm6, %xmm4
1846         unpcklps %xmm7, %xmm5
1847
1848         movaps   %xmm4, %xmm6
1849         unpcklps %xmm5, %xmm4
1850         unpckhps %xmm5, %xmm6
1851
1852 #ifdef  movsd
1853         xorps   %xmm1, %xmm1
1854 #endif
1855         movsd    0 * SIZE(B), %xmm1
1856 #ifdef  movsd
1857         xorps   %xmm3, %xmm3
1858 #endif
1859         movsd    2 * SIZE(B), %xmm3
1860
1861         subps   %xmm4,  %xmm1
1862         subps   %xmm6,  %xmm3
1863 #else
1864 #ifdef  movsd
1865         xorps   %xmm0, %xmm0
1866 #endif
1867         movsd    0 * SIZE(AA), %xmm0
1868 #ifdef  movsd
1869         xorps   %xmm1, %xmm1
1870 #endif
1871         movsd    2 * SIZE(AA), %xmm1
1872
1873         subps   %xmm4, %xmm0
1874         subps   %xmm5, %xmm1
1875 #endif
1876
1877 #ifdef LN
1878         movaps    0 * SIZE(AA), %xmm4
1879         pshufd   $0xff, %xmm4, %xmm6
1880         mulps    %xmm6, %xmm3
1881         pshufd   $0xaa, %xmm4, %xmm6
1882         mulps    %xmm3, %xmm6
1883         subps    %xmm6, %xmm1
1884
1885         pshufd   $0x00, %xmm4, %xmm6
1886         mulps    %xmm6, %xmm1
1887 #endif
1888
1889 #ifdef LT
1890         movaps   0 * SIZE(AA), %xmm4
1891         pshufd   $0x00, %xmm4, %xmm6
1892         mulps    %xmm6, %xmm1
1893         pshufd   $0x55, %xmm4, %xmm6
1894         mulps    %xmm1, %xmm6
1895         subps    %xmm6, %xmm3
1896
1897         pshufd   $0xff, %xmm4, %xmm6
1898         mulps    %xmm6, %xmm3
1899 #endif
1900
1901 #ifdef RN
1902         movaps   0 * SIZE(B), %xmm6
1903         pshufd   $0x00, %xmm6, %xmm7
1904         mulps    %xmm7, %xmm0
1905         pshufd   $0x55, %xmm6, %xmm7
1906         mulps    %xmm0, %xmm7
1907         subps    %xmm7, %xmm1
1908
1909         pshufd   $0xff, %xmm6, %xmm7
1910         mulps    %xmm7, %xmm1
1911 #endif
1912
1913 #ifdef RT
1914         movaps    0 * SIZE(B), %xmm6
1915         pshufd   $0xff, %xmm6, %xmm7
1916         mulps    %xmm7, %xmm1
1917         pshufd   $0xaa, %xmm6, %xmm7
1918         mulps    %xmm1, %xmm7
1919         subps    %xmm7, %xmm0
1920
1921         pshufd   $0x00, %xmm6, %xmm7
1922         mulps    %xmm7, %xmm0
1923 #endif
1924
1925 #if defined(LN) || defined(LT)
1926         movlps  %xmm1,   0 * SIZE(B)
1927         movlps  %xmm3,   2 * SIZE(B)
1928
1929         pshufd  $0x00, %xmm1, %xmm0
1930         pshufd  $0x55, %xmm1, %xmm2
1931         movaps  %xmm0,   0 * SIZE(BB)
1932         movaps  %xmm2,   4 * SIZE(BB)
1933
1934         pshufd  $0x00, %xmm3, %xmm0
1935         pshufd  $0x55, %xmm3, %xmm2
1936         movaps  %xmm0,   8 * SIZE(BB)
1937         movaps  %xmm2,  12 * SIZE(BB)
1938 #else
1939         movlps  %xmm0,   0 * SIZE(AA)
1940         movlps  %xmm1,   2 * SIZE(AA)
1941 #endif
1942
1943 #ifdef LN
1944         subl    $2 * SIZE, CO1
1945 #endif
1946
1947 #if defined(LN) || defined(LT)
1948         unpcklps %xmm3, %xmm1
1949
1950         movlps  %xmm1, 0 * SIZE(CO1)
1951         movhps  %xmm1, 0 * SIZE(CO1, LDC)
1952 #else
1953         movlps  %xmm0, 0 * SIZE(CO1)
1954         movlps  %xmm1, 0 * SIZE(CO1, LDC)
1955 #endif
1956
1957 #ifndef LN
1958         addl    $2 * SIZE, CO1
1959 #endif
1960
1961 #if defined(LT) || defined(RN)
1962         movl    K,  %eax
1963         subl    KK, %eax
1964         leal    (,%eax, SIZE), %eax
1965         leal    (AA, %eax, 2), AA
1966 #ifdef LT
1967         addl    $4 * SIZE, B
1968 #endif
1969 #endif
1970
1971 #ifdef LN
1972         subl    $2, KK
1973         movl    BORIG, B
1974 #endif
1975
1976 #ifdef LT
1977         addl    $2, KK
1978 #endif
1979
1980 #ifdef RT
1981         movl    K, %eax
1982         movl    BORIG, B
1983         sall    $1 + BASE_SHIFT, %eax
1984         addl    %eax, AORIG
1985 #endif
1986         ALIGN_4
1987
1988 .L70:
1989         testl   $1, M
1990         je      .L79
1991
1992 #ifdef LN
1993        movl     K, %eax
1994        sall     $BASE_SHIFT, %eax
1995        subl     %eax, AORIG
1996 #endif
1997
1998 #if defined(LN) || defined(RT)
1999         movl    KK, %eax
2000         movl    AORIG, AA
2001         leal    (AA, %eax, SIZE), AA
2002 #endif
2003
2004         leal    BUFFER, BB
2005
2006 #if defined(LN) || defined(RT)
2007         movl    KK, %eax
2008         sall    $1 + BASE_SHIFT, %eax
2009         leal    (BB, %eax, 4), BB
2010 #endif  
2011
2012         xorps   %xmm4, %xmm4
2013         xorps   %xmm5, %xmm5
2014         xorps   %xmm6, %xmm6
2015         xorps   %xmm7, %xmm7
2016
2017         movss    0 * SIZE(AA), %xmm0
2018         movss    4 * SIZE(AA), %xmm1
2019         movss    0 * SIZE(BB), %xmm2
2020         movss   16 * SIZE(BB), %xmm3
2021
2022 #if defined(LT) || defined(RN)
2023         movl    KK, %eax
2024 #else
2025         movl    K, %eax
2026         subl    KK, %eax
2027 #endif
2028         sarl    $3, %eax
2029         je      .L75
2030         ALIGN_4
2031
2032 .L72:
2033         mulss   %xmm0, %xmm2
2034 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
2035         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
2036 #endif
2037         mulss    4 * SIZE(BB), %xmm0
2038         addss   %xmm2, %xmm4
2039         movss    8 * SIZE(BB), %xmm2
2040         addss   %xmm0, %xmm5
2041         movss    1 * SIZE(AA), %xmm0
2042         mulss   %xmm0, %xmm2
2043         mulss   12 * SIZE(BB), %xmm0
2044         addss   %xmm2, %xmm6
2045         movss   32 * SIZE(BB), %xmm2
2046         addss   %xmm0, %xmm7
2047         movss    2 * SIZE(AA), %xmm0
2048         mulss   %xmm0, %xmm3
2049         mulss   20 * SIZE(BB), %xmm0
2050         addss   %xmm3, %xmm4
2051         movss   24 * SIZE(BB), %xmm3
2052         addss   %xmm0, %xmm5
2053         movss    3 * SIZE(AA), %xmm0
2054         mulss   %xmm0, %xmm3
2055         mulss   28 * SIZE(BB), %xmm0
2056         addss   %xmm3, %xmm6
2057         movss   48 * SIZE(BB), %xmm3
2058         addss   %xmm0, %xmm7
2059         movss    8 * SIZE(AA), %xmm0
2060         mulss   %xmm1, %xmm2
2061         mulss   36 * SIZE(BB), %xmm1
2062         addss   %xmm2, %xmm4
2063         movss   40 * SIZE(BB), %xmm2
2064         addss   %xmm1, %xmm5
2065         movss    5 * SIZE(AA), %xmm1
2066         mulss   %xmm1, %xmm2
2067         mulss   44 * SIZE(BB), %xmm1
2068         addss   %xmm2, %xmm6
2069         movss   64 * SIZE(BB), %xmm2
2070         addss   %xmm1, %xmm7
2071         movss    6 * SIZE(AA), %xmm1
2072         mulss   %xmm1, %xmm3
2073         mulss   52 * SIZE(BB), %xmm1
2074         addss   %xmm3, %xmm4
2075         movss   56 * SIZE(BB), %xmm3
2076         addss   %xmm1, %xmm5
2077         movss    7 * SIZE(AA), %xmm1
2078         mulss   %xmm1, %xmm3
2079         mulss   60 * SIZE(BB), %xmm1
2080         addss   %xmm3, %xmm6
2081         movss   80 * SIZE(BB), %xmm3
2082         addss   %xmm1, %xmm7
2083         movss   12 * SIZE(AA), %xmm1
2084
2085         addl    $ 8 * SIZE, AA
2086         addl    $64 * SIZE, BB
2087         decl   %eax
2088         jne    .L72
2089         ALIGN_4
2090
2091 .L75:
2092 #if defined(LT) || defined(RN)
2093         movl    KK, %eax
2094 #else
2095         movl    K, %eax
2096         subl    KK, %eax
2097 #endif
2098         andl    $7, %eax                # if (k & 1)
2099         BRANCH
2100         je .L78
2101         ALIGN_4
2102
2103 .L76:
2104         mulss   %xmm0, %xmm2
2105         mulss    4 * SIZE(BB), %xmm0
2106         addss   %xmm2, %xmm4
2107         movss    8 * SIZE(BB), %xmm2
2108         addss   %xmm0, %xmm5
2109         movss    1 * SIZE(AA), %xmm0
2110
2111         addl    $ 1 * SIZE, AA
2112         addl    $ 8 * SIZE, BB
2113         decl    %eax
2114         jg      .L76
2115         ALIGN_4
2116
2117 .L78:
2118         addss   %xmm6, %xmm4
2119         addss   %xmm7, %xmm5
2120
2121 #if defined(LN) || defined(RT)
2122         movl    KK, %eax
2123 #ifdef LN
2124         subl    $1, %eax
2125 #else
2126         subl    $2, %eax
2127 #endif
2128
2129         movl    AORIG, AA
2130         movl    BORIG, B
2131         leal    BUFFER, BB
2132
2133         sall    $BASE_SHIFT, %eax
2134         leal    (AA, %eax, 1), AA
2135         leal    (B,  %eax, 2), B
2136         leal    (BB, %eax, 8), BB
2137 #endif
2138
2139 #if defined(LN) || defined(LT)
2140         unpcklps %xmm5, %xmm4
2141
2142 #ifdef  movsd
2143         xorps   %xmm1, %xmm1
2144 #endif
2145         movsd    0 * SIZE(B), %xmm1
2146
2147         subps   %xmm4,  %xmm1
2148 #else
2149         movss    0 * SIZE(AA), %xmm0
2150         movss    1 * SIZE(AA), %xmm1
2151
2152         subss   %xmm4, %xmm0
2153         subss   %xmm5, %xmm1
2154 #endif
2155
2156 #if defined(LN) || defined(LT)
2157         movss     0 * SIZE(AA), %xmm4
2158         pshufd   $0x00, %xmm4, %xmm6
2159         mulps    %xmm6, %xmm1
2160 #endif
2161
2162 #ifdef RN
2163         movaps   0 * SIZE(B), %xmm6
2164         pshufd   $0x00, %xmm6, %xmm7
2165         mulss    %xmm7, %xmm0
2166         pshufd   $0x55, %xmm6, %xmm7
2167         mulss    %xmm0, %xmm7
2168         subss    %xmm7, %xmm1
2169
2170         pshufd   $0xff, %xmm6, %xmm7
2171         mulss    %xmm7, %xmm1
2172 #endif
2173
2174 #ifdef RT
2175         movaps    0 * SIZE(B), %xmm6
2176         pshufd   $0xff, %xmm6, %xmm7
2177         mulss    %xmm7, %xmm1
2178         pshufd   $0xaa, %xmm6, %xmm7
2179         mulss    %xmm1, %xmm7
2180         subss    %xmm7, %xmm0
2181
2182         pshufd   $0x00, %xmm6, %xmm7
2183         mulss    %xmm7, %xmm0
2184 #endif
2185
2186 #if defined(LN) || defined(LT)
2187         movlps  %xmm1,   0 * SIZE(B)
2188
2189         pshufd  $0x00, %xmm1, %xmm0
2190         pshufd  $0x55, %xmm1, %xmm2
2191         movaps  %xmm0,   0 * SIZE(BB)
2192         movaps  %xmm2,   4 * SIZE(BB)
2193 #else
2194         movss   %xmm0,   0 * SIZE(AA)
2195         movss   %xmm1,   1 * SIZE(AA)
2196 #endif
2197
2198 #ifdef LN
2199         subl    $1 * SIZE, CO1
2200 #endif
2201
2202 #if defined(LN) || defined(LT)
2203         pshufd  $1, %xmm1, %xmm3
2204
2205         movss   %xmm1, 0 * SIZE(CO1)
2206         movss   %xmm3, 0 * SIZE(CO1, LDC)
2207 #else
2208         movss   %xmm0, 0 * SIZE(CO1)
2209         movss   %xmm1, 0 * SIZE(CO1, LDC)
2210 #endif
2211
2212 #ifndef LN
2213         addl    $1 * SIZE, CO1
2214 #endif
2215
2216 #if defined(LT) || defined(RN)
2217         movl    K,  %eax
2218         subl    KK, %eax
2219         leal    (AA, %eax, SIZE), AA
2220 #ifdef LT
2221         addl    $2 * SIZE, B
2222 #endif
2223 #endif
2224
2225 #ifdef LN
2226         subl    $1, KK
2227         movl    BORIG, B
2228 #endif
2229
2230 #ifdef LT
2231         addl    $1, KK
2232 #endif
2233
2234 #ifdef RT
2235         movl    K, %eax
2236         movl    BORIG, B
2237         sall    $BASE_SHIFT, %eax
2238         addl    %eax, AORIG
2239 #endif
2240         ALIGN_4
2241
2242 .L79:
2243 #ifdef LN
2244        movl     K, %eax
2245        leal     (, %eax, SIZE), %eax
2246        leal     (B, %eax, 2), B
2247 #endif
2248
2249 #if defined(LT) || defined(RN)
2250         movl    K,  %eax
2251         subl    KK, %eax
2252         leal    (,%eax, SIZE), %eax
2253         leal    (B,  %eax, 2), B
2254 #endif
2255
2256 #ifdef RN
2257         addl    $2, KK
2258 #endif
2259
2260 #ifdef RT
2261         subl    $2, KK
2262 #endif
2263         ALIGN_4
2264
2265 .L80:
2266         movl    N, %eax
2267         sarl    $2, %eax
2268         movl    %eax, J
2269         jle     .L999
2270
2271 .L01:
2272 #ifdef LN
2273         movl    OFFSET, %eax
2274         addl    M, %eax
2275         movl    %eax, KK
2276 #endif  
2277
2278         leal    BUFFER, %ecx
2279
2280 #ifdef RT
2281        movl     K, %eax
2282        sall     $2 + BASE_SHIFT, %eax
2283        subl     %eax, B
2284 #endif
2285
2286 #if defined(LN) || defined(RT)
2287         movl    KK, %eax
2288         movl    B, BORIG
2289         sall    $2 + BASE_SHIFT, %eax
2290         leal    (B,  %eax, 1), B
2291         leal    (BB, %eax, 4), BB
2292 #endif  
2293
2294 #ifdef LT
2295         movl    OFFSET, %eax
2296         movl    %eax, KK
2297 #endif
2298
2299 #if defined(LT) || defined(RN)
2300         movl    KK, %eax
2301 #else
2302         movl    K, %eax
2303         subl    KK, %eax
2304 #endif
2305         sarl    $1, %eax
2306         jle     .L05
2307         ALIGN_4
2308         
2309 .L02:
2310         movaps   0 * SIZE(B), %xmm3
2311         movaps   4 * SIZE(B), %xmm7
2312
2313         pshufd   $0x00, %xmm3, %xmm0
2314         pshufd   $0x55, %xmm3, %xmm1
2315         pshufd   $0xaa, %xmm3, %xmm2
2316         pshufd   $0xff, %xmm3, %xmm3
2317
2318         pshufd   $0x00, %xmm7, %xmm4
2319         pshufd   $0x55, %xmm7, %xmm5
2320         pshufd   $0xaa, %xmm7, %xmm6
2321         pshufd   $0xff, %xmm7, %xmm7
2322
2323         movaps  %xmm0,  0 * SIZE(BB)
2324         movaps  %xmm1,  4 * SIZE(BB)
2325         movaps  %xmm2,  8 * SIZE(BB)
2326         movaps  %xmm3, 12 * SIZE(BB)
2327         movaps  %xmm4, 16 * SIZE(BB)
2328         movaps  %xmm5, 20 * SIZE(BB)
2329         movaps  %xmm6, 24 * SIZE(BB)
2330         movaps  %xmm7, 28 * SIZE(BB)
2331
2332         addl    $ 8 * SIZE, B
2333         addl    $32 * SIZE, %ecx
2334         decl    %eax
2335         jne     .L02
2336         ALIGN_2
2337
2338 .L05:
2339 #if defined(LT) || defined(RN)
2340         movl    KK, %eax
2341 #else
2342         movl    K, %eax
2343         subl    KK, %eax
2344 #endif
2345         andl    $1, %eax
2346         BRANCH
2347         jle     .L10
2348
2349         movaps   0 * SIZE(B), %xmm3
2350
2351         pshufd   $0x00, %xmm3, %xmm0
2352         pshufd   $0x55, %xmm3, %xmm1
2353         pshufd   $0xaa, %xmm3, %xmm2
2354         pshufd   $0xff, %xmm3, %xmm3
2355
2356         movaps  %xmm0,  0 * SIZE(BB)
2357         movaps  %xmm1,  4 * SIZE(BB)
2358         movaps  %xmm2,  8 * SIZE(BB)
2359         movaps  %xmm3, 12 * SIZE(BB)
2360
2361         addl    $4 * SIZE, B
2362         ALIGN_4
2363         
2364 .L10:
2365 #if defined(LT) || defined(RN)
2366         movl    A, AA
2367 #else
2368         movl    A, %eax
2369         movl    %eax, AORIG
2370 #endif
2371
2372         leal    (, LDC, 4), %eax
2373
2374 #ifdef RT
2375         subl    %eax, C
2376 #endif
2377         movl    C, CO1
2378 #ifndef RT
2379         addl    %eax, C
2380 #endif
2381
2382         movl    M,  %ebx
2383         sarl    $2, %ebx        # i = (m >> 2)
2384         jle     .L20
2385         ALIGN_4
2386
2387 .L11:
2388 #ifdef LN
2389        movl     K, %eax
2390        sall     $2 + BASE_SHIFT, %eax
2391        subl     %eax, AORIG
2392 #endif
2393
2394 #if defined(LN) || defined(RT)
2395         movl    KK, %eax
2396         movl    AORIG, AA
2397         leal    (, %eax, SIZE), %eax
2398         leal    (AA, %eax, 4), AA
2399 #endif
2400
2401         leal    BUFFER, BB
2402
2403 #if defined(LN) || defined(RT)
2404         movl    KK, %eax
2405         sall    $2 + BASE_SHIFT, %eax
2406         leal    (BB, %eax, 4), BB
2407 #endif  
2408
2409         movaps   0 * SIZE(AA), %xmm0
2410         xorps   %xmm4, %xmm4
2411         movaps  16 * SIZE(AA), %xmm1
2412         xorps   %xmm5, %xmm5
2413         movaps   0 * SIZE(BB), %xmm2
2414         xorps   %xmm6, %xmm6
2415         movaps  16 * SIZE(BB), %xmm3
2416         xorps   %xmm7, %xmm7
2417
2418         leal    (LDC, LDC, 2), %eax
2419
2420         PREFETCHW       3 * SIZE(CO1)
2421         PREFETCHW       3 * SIZE(CO1, LDC)
2422         PREFETCHW       3 * SIZE(CO1, LDC, 2)
2423         PREFETCHW       3 * SIZE(CO1, %eax)
2424
2425 #if defined(LT) || defined(RN)
2426         movl    KK, %eax
2427 #else
2428         movl    K, %eax
2429         subl    KK, %eax
2430 #endif
2431         sarl    $3, %eax
2432         je      .L15
2433         ALIGN_4
2434
2435 .L12:
2436         KERNEL1(0 * 16)
2437         KERNEL2(0 * 16)
2438         KERNEL3(0 * 16)
2439         KERNEL4(0 * 16)
2440         KERNEL5(0 * 16)
2441         KERNEL6(0 * 16)
2442         KERNEL7(0 * 16)
2443         KERNEL8(0 * 16)
2444
2445         addl   $128 * SIZE, BB
2446         addl   $32 * SIZE, AA
2447         decl   %eax
2448         jne    .L12
2449         ALIGN_4
2450
2451 .L15:
2452 #if defined(LT) || defined(RN)
2453         movl    KK, %eax
2454 #else
2455         movl    K, %eax
2456         subl    KK, %eax
2457 #endif
2458         andl    $7, %eax                # if (k & 1)
2459         BRANCH
2460         je .L18
2461         ALIGN_4
2462
2463 .L16:
2464         mulps   %xmm0, %xmm2
2465         addps   %xmm2, %xmm4
2466         movaps   4 * SIZE(BB), %xmm2
2467         mulps   %xmm0, %xmm2
2468         addps   %xmm2, %xmm5
2469         movaps   8 * SIZE(BB), %xmm2
2470         mulps   %xmm0, %xmm2
2471         mulps   12 * SIZE(BB), %xmm0
2472         addps   %xmm2, %xmm6
2473         movaps  16 * SIZE(BB), %xmm2
2474         addps   %xmm0, %xmm7
2475         movaps   4 * SIZE(AA), %xmm0
2476
2477         addl    $ 4 * SIZE, AA
2478         addl    $16 * SIZE, BB
2479         decl    %eax
2480         jg      .L16
2481         ALIGN_4
2482
2483 .L18:
2484 #if defined(LN) || defined(RT)
2485         movl    KK, %eax
2486 #ifdef LN
2487         subl    $4, %eax
2488 #else
2489         subl    $4, %eax
2490 #endif
2491
2492         movl    AORIG, AA
2493         movl    BORIG, B
2494         leal    BUFFER, BB
2495
2496         sall    $2 + BASE_SHIFT, %eax
2497         leal    (AA, %eax, 1), AA
2498         leal    (B,  %eax, 1), B
2499         leal    (BB, %eax, 4), BB
2500 #endif
2501
2502 #if defined(LN) || defined(LT)
2503         movaps   %xmm4, %xmm0
2504         unpcklps %xmm6, %xmm4
2505         unpckhps %xmm6, %xmm0
2506
2507         movaps   %xmm5, %xmm1
2508         unpcklps %xmm7, %xmm5
2509         unpckhps %xmm7, %xmm1
2510
2511         movaps   %xmm4, %xmm6
2512         unpcklps %xmm5, %xmm4
2513         unpckhps %xmm5, %xmm6
2514
2515         movaps   %xmm0, %xmm2
2516         unpcklps %xmm1, %xmm0
2517         unpckhps %xmm1, %xmm2
2518
2519         movaps   0 * SIZE(B), %xmm1
2520         movaps   4 * SIZE(B), %xmm3
2521         movaps   8 * SIZE(B), %xmm5
2522         movaps  12 * SIZE(B), %xmm7
2523
2524         subps   %xmm4,  %xmm1
2525         subps   %xmm6,  %xmm3
2526         subps   %xmm0,  %xmm5
2527         subps   %xmm2,  %xmm7
2528 #else
2529         movaps   0 * SIZE(AA), %xmm0
2530         movaps   4 * SIZE(AA), %xmm1
2531         movaps   8 * SIZE(AA), %xmm2
2532         movaps  12 * SIZE(AA), %xmm3
2533
2534         subps   %xmm4, %xmm0
2535         subps   %xmm5, %xmm1
2536         subps   %xmm6, %xmm2
2537         subps   %xmm7, %xmm3
2538 #endif
2539
2540 #ifdef LN
2541         movaps   12 * SIZE(AA), %xmm4
2542         pshufd   $0xff, %xmm4, %xmm6
2543         mulps    %xmm6, %xmm7
2544         pshufd   $0xaa, %xmm4, %xmm6
2545         mulps    %xmm7, %xmm6
2546         subps    %xmm6, %xmm5
2547         pshufd   $0x55, %xmm4, %xmm6
2548         mulps    %xmm7, %xmm6
2549         subps    %xmm6, %xmm3
2550         pshufd   $0x00, %xmm4, %xmm6
2551         mulps    %xmm7, %xmm6
2552         subps    %xmm6, %xmm1
2553
2554         movaps    8 * SIZE(AA), %xmm4
2555         pshufd   $0xaa, %xmm4, %xmm6
2556         mulps    %xmm6, %xmm5
2557         pshufd   $0x55, %xmm4, %xmm6
2558         mulps    %xmm5, %xmm6
2559         subps    %xmm6, %xmm3
2560         pshufd   $0x00, %xmm4, %xmm6
2561         mulps    %xmm5, %xmm6
2562         subps    %xmm6, %xmm1
2563
2564         movaps    4 * SIZE(AA), %xmm4
2565         pshufd   $0x55, %xmm4, %xmm6
2566         mulps    %xmm6, %xmm3
2567         pshufd   $0x00, %xmm4, %xmm6
2568         mulps    %xmm3, %xmm6
2569         subps    %xmm6, %xmm1
2570
2571         movaps    0 * SIZE(AA), %xmm4
2572         pshufd   $0x00, %xmm4, %xmm6
2573         mulps    %xmm6, %xmm1
2574 #endif
2575
2576 #ifdef LT
2577         movaps   0 * SIZE(AA), %xmm4
2578         pshufd   $0x00, %xmm4, %xmm6
2579         mulps    %xmm6, %xmm1
2580
2581         pshufd   $0x55, %xmm4, %xmm6
2582         mulps    %xmm1, %xmm6
2583         subps    %xmm6, %xmm3
2584         pshufd   $0xaa, %xmm4, %xmm6
2585         mulps    %xmm1, %xmm6
2586         subps    %xmm6, %xmm5
2587         pshufd   $0xff, %xmm4, %xmm6
2588         mulps    %xmm1, %xmm6
2589         subps    %xmm6, %xmm7
2590
2591         movaps   4 * SIZE(AA), %xmm4
2592         pshufd   $0x55, %xmm4, %xmm6
2593         mulps    %xmm6, %xmm3
2594         pshufd   $0xaa, %xmm4, %xmm6
2595         mulps    %xmm3, %xmm6
2596         subps    %xmm6, %xmm5
2597         pshufd   $0xff, %xmm4, %xmm6
2598         mulps    %xmm3, %xmm6
2599         subps    %xmm6, %xmm7
2600
2601         movaps   8 * SIZE(AA), %xmm4
2602         pshufd   $0xaa, %xmm4, %xmm6
2603         mulps    %xmm6, %xmm5
2604         pshufd   $0xff, %xmm4, %xmm6
2605         mulps    %xmm5, %xmm6
2606         subps    %xmm6, %xmm7
2607
2608         movaps  12 * SIZE(AA), %xmm4
2609         pshufd   $0xff, %xmm4, %xmm6
2610         mulps    %xmm6, %xmm7
2611 #endif
2612
2613 #ifdef RN
2614         movaps   0 * SIZE(B), %xmm6
2615         pshufd   $0x00, %xmm6, %xmm7
2616         mulps    %xmm7, %xmm0
2617         pshufd   $0x55, %xmm6, %xmm7
2618         mulps    %xmm0, %xmm7
2619         subps    %xmm7, %xmm1
2620         pshufd   $0xaa, %xmm6, %xmm7
2621         mulps    %xmm0, %xmm7
2622         subps    %xmm7, %xmm2
2623         pshufd   $0xff, %xmm6, %xmm7
2624         mulps    %xmm0, %xmm7
2625         subps    %xmm7, %xmm3
2626
2627         movaps   4 * SIZE(B), %xmm6
2628         pshufd   $0x55, %xmm6, %xmm7
2629         mulps    %xmm7, %xmm1
2630         pshufd   $0xaa, %xmm6, %xmm7
2631         mulps    %xmm1, %xmm7
2632         subps    %xmm7, %xmm2
2633         pshufd   $0xff, %xmm6, %xmm7
2634         mulps    %xmm1, %xmm7
2635         subps    %xmm7, %xmm3
2636
2637         movaps   8 * SIZE(B), %xmm6
2638         pshufd   $0xaa, %xmm6, %xmm7
2639         mulps    %xmm7, %xmm2
2640         pshufd   $0xff, %xmm6, %xmm7
2641         mulps    %xmm2, %xmm7
2642         subps    %xmm7, %xmm3
2643
2644         movaps   12 * SIZE(B), %xmm6
2645         pshufd   $0xff, %xmm6, %xmm7
2646         mulps    %xmm7, %xmm3
2647 #endif
2648
2649 #ifdef RT
2650         movaps   12 * SIZE(B), %xmm6
2651         pshufd   $0xff, %xmm6, %xmm7
2652         mulps    %xmm7, %xmm3
2653         pshufd   $0xaa, %xmm6, %xmm7
2654         mulps    %xmm3, %xmm7
2655         subps    %xmm7, %xmm2
2656         pshufd   $0x55, %xmm6, %xmm7
2657         mulps    %xmm3, %xmm7
2658         subps    %xmm7, %xmm1
2659         pshufd   $0x00, %xmm6, %xmm7
2660         mulps    %xmm3, %xmm7
2661         subps    %xmm7, %xmm0
2662
2663         movaps    8 * SIZE(B), %xmm6
2664         pshufd   $0xaa, %xmm6, %xmm7
2665         mulps    %xmm7, %xmm2
2666         pshufd   $0x55, %xmm6, %xmm7
2667         mulps    %xmm2, %xmm7
2668         subps    %xmm7, %xmm1
2669         pshufd   $0x00, %xmm6, %xmm7
2670         mulps    %xmm2, %xmm7
2671         subps    %xmm7, %xmm0
2672
2673         movaps    4 * SIZE(B), %xmm6
2674         pshufd   $0x55, %xmm6, %xmm7
2675         mulps    %xmm7, %xmm1
2676         pshufd   $0x00, %xmm6, %xmm7
2677         mulps    %xmm1, %xmm7
2678         subps    %xmm7, %xmm0
2679
2680         movaps    0 * SIZE(B), %xmm6
2681         pshufd   $0x00, %xmm6, %xmm7
2682         mulps    %xmm7, %xmm0
2683 #endif
2684
2685 #if defined(LN) || defined(LT)
2686         movaps  %xmm1,   0 * SIZE(B)
2687         movaps  %xmm3,   4 * SIZE(B)
2688         movaps  %xmm5,   8 * SIZE(B)
2689         movaps  %xmm7,  12 * SIZE(B)
2690
2691         pshufd  $0x00, %xmm1, %xmm0
2692         pshufd  $0x55, %xmm1, %xmm2
2693         pshufd  $0xaa, %xmm1, %xmm4
2694         pshufd  $0xff, %xmm1, %xmm6
2695         movaps  %xmm0,   0 * SIZE(BB)
2696         movaps  %xmm2,   4 * SIZE(BB)
2697         movaps  %xmm4,   8 * SIZE(BB)
2698         movaps  %xmm6,  12 * SIZE(BB)
2699
2700         pshufd  $0x00, %xmm3, %xmm0
2701         pshufd  $0x55, %xmm3, %xmm2
2702         pshufd  $0xaa, %xmm3, %xmm4
2703         pshufd  $0xff, %xmm3, %xmm6
2704         movaps  %xmm0,  16 * SIZE(BB)
2705         movaps  %xmm2,  20 * SIZE(BB)
2706         movaps  %xmm4,  24 * SIZE(BB)
2707         movaps  %xmm6,  28 * SIZE(BB)
2708
2709         pshufd  $0x00, %xmm5, %xmm0
2710         pshufd  $0x55, %xmm5, %xmm2
2711         pshufd  $0xaa, %xmm5, %xmm4
2712         pshufd  $0xff, %xmm5, %xmm6
2713         movaps  %xmm0,  32 * SIZE(BB)
2714         movaps  %xmm2,  36 * SIZE(BB)
2715         movaps  %xmm4,  40 * SIZE(BB)
2716         movaps  %xmm6,  44 * SIZE(BB)
2717
2718         pshufd  $0x00, %xmm7, %xmm0
2719         pshufd  $0x55, %xmm7, %xmm2
2720         pshufd  $0xaa, %xmm7, %xmm4
2721         pshufd  $0xff, %xmm7, %xmm6
2722         movaps  %xmm0,  48 * SIZE(BB)
2723         movaps  %xmm2,  52 * SIZE(BB)
2724         movaps  %xmm4,  56 * SIZE(BB)
2725         movaps  %xmm6,  60 * SIZE(BB)
2726 #else
2727         movaps  %xmm0,   0 * SIZE(AA)
2728         movaps  %xmm1,   4 * SIZE(AA)
2729         movaps  %xmm2,   8 * SIZE(AA)
2730         movaps  %xmm3,  12 * SIZE(AA)
2731 #endif
2732
2733 #ifdef LN
2734         subl    $4 * SIZE, CO1
2735 #endif
2736
2737         leal    (LDC, LDC, 2), %eax
2738
2739 #if defined(LN) || defined(LT)
2740         movaps   %xmm1, %xmm0
2741         unpcklps %xmm5, %xmm1
2742         unpckhps %xmm5, %xmm0
2743
2744         movaps   %xmm3, %xmm4
2745         unpcklps %xmm7, %xmm3
2746         unpckhps %xmm7, %xmm4
2747
2748         movaps   %xmm1, %xmm2
2749         unpcklps %xmm3, %xmm1
2750         unpckhps %xmm3, %xmm2
2751
2752         movaps   %xmm0, %xmm6
2753         unpcklps %xmm4, %xmm0
2754         unpckhps %xmm4, %xmm6
2755
2756         movlps  %xmm1, 0 * SIZE(CO1)
2757         movhps  %xmm1, 2 * SIZE(CO1)
2758         movlps  %xmm2, 0 * SIZE(CO1, LDC, 1)
2759         movhps  %xmm2, 2 * SIZE(CO1, LDC, 1)
2760         movlps  %xmm0, 0 * SIZE(CO1, LDC, 2)
2761         movhps  %xmm0, 2 * SIZE(CO1, LDC, 2)
2762         movlps  %xmm6, 0 * SIZE(CO1, %eax, 1)
2763         movhps  %xmm6, 2 * SIZE(CO1, %eax, 1)
2764 #else
2765         movlps  %xmm0, 0 * SIZE(CO1)
2766         movhps  %xmm0, 2 * SIZE(CO1)
2767         movlps  %xmm1, 0 * SIZE(CO1, LDC, 1)
2768         movhps  %xmm1, 2 * SIZE(CO1, LDC, 1)
2769         movlps  %xmm2, 0 * SIZE(CO1, LDC, 2)
2770         movhps  %xmm2, 2 * SIZE(CO1, LDC, 2)
2771         movlps  %xmm3, 0 * SIZE(CO1, %eax, 1)
2772         movhps  %xmm3, 2 * SIZE(CO1, %eax, 1)
2773 #endif
2774
2775 #ifndef LN
2776         addl    $4 * SIZE, CO1
2777 #endif
2778
2779 #if defined(LT) || defined(RN)
2780         movl    K,  %eax
2781         subl    KK, %eax
2782         leal    (,%eax, SIZE), %eax
2783         leal    (AA, %eax, 4), AA
2784 #ifdef LT
2785         addl    $16 * SIZE, B
2786 #endif
2787 #endif
2788
2789 #ifdef LN
2790         subl    $4, KK
2791         movl    BORIG, B
2792 #endif
2793
2794 #ifdef LT
2795         addl    $4, KK
2796 #endif
2797
2798 #ifdef RT
2799         movl    K, %eax
2800         movl    BORIG, B
2801         sall    $2 + BASE_SHIFT, %eax
2802         addl    %eax, AORIG
2803 #endif
2804
2805         decl    %ebx                    # i --
2806         jg      .L11
2807         ALIGN_4
2808
2809 .L20:
2810         testl   $2, M
2811         je      .L30
2812
2813 #ifdef LN
2814        movl     K, %eax
2815        sall     $1 + BASE_SHIFT, %eax
2816        subl     %eax, AORIG
2817 #endif
2818
2819 #if defined(LN) || defined(RT)
2820         movl    KK, %eax
2821         movl    AORIG, AA
2822         leal    (, %eax, SIZE), %eax
2823         leal    (AA, %eax, 2), AA
2824 #endif
2825
2826         leal    BUFFER, BB
2827
2828 #if defined(LN) || defined(RT)
2829         movl    KK, %eax
2830         sall    $2 + BASE_SHIFT, %eax
2831         leal    (BB, %eax, 4), BB
2832 #endif  
2833
2834 #ifdef  movsd
2835         xorps   %xmm0, %xmm0
2836 #endif
2837         movsd    0 * SIZE(AA), %xmm0
2838         xorps   %xmm4, %xmm4
2839 #ifdef  movsd
2840         xorps   %xmm1, %xmm1
2841 #endif
2842         movsd    8 * SIZE(AA), %xmm1
2843         xorps   %xmm5, %xmm5
2844         movaps   0 * SIZE(BB), %xmm2
2845         xorps   %xmm6, %xmm6
2846         movaps  16 * SIZE(BB), %xmm3
2847         xorps   %xmm7, %xmm7
2848
2849 #if defined(LT) || defined(RN)
2850         movl    KK, %eax
2851 #else
2852         movl    K, %eax
2853         subl    KK, %eax
2854 #endif
2855         sarl    $3, %eax
2856         je      .L25
2857         ALIGN_4
2858
2859 .L22:
2860         mulps   %xmm0, %xmm2
2861         addps   %xmm2, %xmm4
2862 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
2863         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
2864 #endif
2865         movaps   4 * SIZE(BB), %xmm2
2866         mulps   %xmm0, %xmm2
2867         addps   %xmm2, %xmm5
2868         movaps   8 * SIZE(BB), %xmm2
2869         mulps   %xmm0, %xmm2
2870         addps   %xmm2, %xmm6
2871         movaps  12 * SIZE(BB), %xmm2
2872         mulps   %xmm0, %xmm2
2873         movsd    2 * SIZE(AA), %xmm0
2874         addps   %xmm2, %xmm7
2875         movaps  32 * SIZE(BB), %xmm2
2876
2877         mulps   %xmm0, %xmm3
2878         addps   %xmm3, %xmm4
2879         movaps  20 * SIZE(BB), %xmm3
2880         mulps   %xmm0, %xmm3
2881         addps   %xmm3, %xmm5
2882         movaps  24 * SIZE(BB), %xmm3
2883         mulps   %xmm0, %xmm3
2884         addps   %xmm3, %xmm6
2885         movaps  28 * SIZE(BB), %xmm3
2886         mulps   %xmm0, %xmm3
2887         movsd    4 * SIZE(AA), %xmm0
2888         addps   %xmm3, %xmm7
2889         movaps  48 * SIZE(BB), %xmm3
2890
2891         mulps   %xmm0, %xmm2
2892         addps   %xmm2, %xmm4
2893         movaps  36 * SIZE(BB), %xmm2
2894         mulps   %xmm0, %xmm2
2895         addps   %xmm2, %xmm5
2896         movaps  40 * SIZE(BB), %xmm2
2897         mulps   %xmm0, %xmm2
2898         addps   %xmm2, %xmm6
2899         movaps  44 * SIZE(BB), %xmm2
2900         mulps   %xmm0, %xmm2
2901         movsd    6 * SIZE(AA), %xmm0
2902         addps   %xmm2, %xmm7
2903         movaps  64 * SIZE(BB), %xmm2
2904
2905         mulps   %xmm0, %xmm3
2906         addps   %xmm3, %xmm4
2907         movaps  52 * SIZE(BB), %xmm3
2908         mulps   %xmm0, %xmm3
2909         addps   %xmm3, %xmm5
2910         movaps  56 * SIZE(BB), %xmm3
2911         mulps   %xmm0, %xmm3
2912         addps   %xmm3, %xmm6
2913         movaps  60 * SIZE(BB), %xmm3
2914         mulps   %xmm0, %xmm3
2915         movsd    16 * SIZE(AA), %xmm0
2916         addps   %xmm3, %xmm7
2917         movaps  80 * SIZE(BB), %xmm3
2918
2919         mulps   %xmm1, %xmm2
2920         addps   %xmm2, %xmm4
2921         movaps  68 * SIZE(BB), %xmm2
2922         mulps   %xmm1, %xmm2
2923         addps   %xmm2, %xmm5
2924         movaps  72 * SIZE(BB), %xmm2
2925         mulps   %xmm1, %xmm2
2926         addps   %xmm2, %xmm6
2927         movaps  76 * SIZE(BB), %xmm2
2928         mulps   %xmm1, %xmm2
2929         movsd   10 * SIZE(AA), %xmm1
2930         addps   %xmm2, %xmm7
2931         movaps  96 * SIZE(BB), %xmm2
2932
2933         mulps   %xmm1, %xmm3
2934         addps   %xmm3, %xmm4
2935         movaps  84 * SIZE(BB), %xmm3
2936         mulps   %xmm1, %xmm3
2937         addps   %xmm3, %xmm5
2938         movaps  88 * SIZE(BB), %xmm3
2939         mulps   %xmm1, %xmm3
2940         addps   %xmm3, %xmm6
2941         movaps  92 * SIZE(BB), %xmm3
2942         mulps   %xmm1, %xmm3
2943         movsd   12 * SIZE(AA), %xmm1
2944         addps   %xmm3, %xmm7
2945         movaps  112 * SIZE(BB), %xmm3
2946
2947         mulps   %xmm1, %xmm2
2948         addps   %xmm2, %xmm4
2949         movaps  100 * SIZE(BB), %xmm2
2950         mulps   %xmm1, %xmm2
2951         addps   %xmm2, %xmm5
2952         movaps  104 * SIZE(BB), %xmm2
2953         mulps   %xmm1, %xmm2
2954         addps   %xmm2, %xmm6
2955         movaps  108 * SIZE(BB), %xmm2
2956         mulps   %xmm1, %xmm2
2957         movsd    14 * SIZE(AA), %xmm1
2958         addps   %xmm2, %xmm7
2959         movaps  128 * SIZE(BB), %xmm2
2960
2961         mulps   %xmm1, %xmm3
2962         addps   %xmm3, %xmm4
2963         movaps  116 * SIZE(BB), %xmm3
2964         mulps   %xmm1, %xmm3
2965         addps   %xmm3, %xmm5
2966         movaps  120 * SIZE(BB), %xmm3
2967         mulps   %xmm1, %xmm3
2968         addps   %xmm3, %xmm6
2969         movaps  124 * SIZE(BB), %xmm3
2970         mulps   %xmm1, %xmm3
2971         movsd    24 * SIZE(AA), %xmm1
2972         addps   %xmm3, %xmm7
2973         movaps  144 * SIZE(BB), %xmm3
2974
2975         addl    $ 16 * SIZE, AA
2976         addl    $128 * SIZE, BB
2977         decl   %eax
2978         jne    .L22
2979         ALIGN_4
2980
2981 .L25:
2982 #if defined(LT) || defined(RN)
2983         movl    KK, %eax
2984 #else
2985         movl    K, %eax
2986         subl    KK, %eax
2987 #endif
2988         andl    $7, %eax                # if (k & 1)
2989         BRANCH
2990         je .L28
2991         ALIGN_4
2992
2993 .L26:
2994         mulps   %xmm0, %xmm2
2995         addps   %xmm2, %xmm4
2996         movaps   4 * SIZE(BB), %xmm2
2997         mulps   %xmm0, %xmm2
2998         addps   %xmm2, %xmm5
2999         movaps   8 * SIZE(BB), %xmm2
3000         mulps   %xmm0, %xmm2
3001         addps   %xmm2, %xmm6
3002         movaps  12 * SIZE(BB), %xmm2
3003         mulps   %xmm0, %xmm2
3004         movsd    2 * SIZE(AA), %xmm0
3005         addps   %xmm2, %xmm7
3006         movaps  16 * SIZE(BB), %xmm2
3007
3008         addl    $ 2 * SIZE, AA
3009         addl    $16 * SIZE, BB
3010         decl    %eax
3011         jg      .L26
3012         ALIGN_4
3013
3014 .L28:
3015 #if defined(LN) || defined(RT)
3016         movl    KK, %eax
3017 #ifdef LN
3018         subl    $2, %eax
3019 #else
3020         subl    $4, %eax
3021 #endif
3022
3023         movl    AORIG, AA
3024         movl    BORIG, B
3025         leal    BUFFER, BB
3026
3027         sall    $1 + BASE_SHIFT, %eax
3028         leal    (AA, %eax, 1), AA
3029         leal    (B,  %eax, 2), B
3030         leal    (BB, %eax, 8), BB
3031 #endif
3032
3033 #if defined(LN) || defined(LT)
3034         unpcklps %xmm6, %xmm4
3035         unpcklps %xmm7, %xmm5
3036
3037         movaps   %xmm4, %xmm6
3038         unpcklps %xmm5, %xmm4
3039         unpckhps %xmm5, %xmm6
3040
3041         movaps   0 * SIZE(B), %xmm1
3042         movaps   4 * SIZE(B), %xmm3
3043
3044         subps   %xmm4,  %xmm1
3045         subps   %xmm6,  %xmm3
3046 #else
3047 #ifdef  movsd
3048         xorps   %xmm0, %xmm0
3049 #endif
3050         movsd    0 * SIZE(AA), %xmm0
3051 #ifdef  movsd
3052         xorps   %xmm1, %xmm1
3053 #endif
3054         movsd    2 * SIZE(AA), %xmm1
3055 #ifdef  movsd
3056         xorps   %xmm2, %xmm2
3057 #endif
3058         movsd    4 * SIZE(AA), %xmm2
3059 #ifdef  movsd
3060         xorps   %xmm3, %xmm3
3061 #endif
3062         movsd    6 * SIZE(AA), %xmm3
3063
3064         subps   %xmm4, %xmm0
3065         subps   %xmm5, %xmm1
3066         subps   %xmm6, %xmm2
3067         subps   %xmm7, %xmm3
3068 #endif
3069
3070 #ifdef LN
3071         movaps    0 * SIZE(AA), %xmm4
3072         pshufd   $0xff, %xmm4, %xmm6
3073         mulps    %xmm6, %xmm3
3074         pshufd   $0xaa, %xmm4, %xmm6
3075         mulps    %xmm3, %xmm6
3076         subps    %xmm6, %xmm1
3077
3078         pshufd   $0x00, %xmm4, %xmm6
3079         mulps    %xmm6, %xmm1
3080 #endif
3081
3082 #ifdef LT
3083         movaps   0 * SIZE(AA), %xmm4
3084         pshufd   $0x00, %xmm4, %xmm6
3085         mulps    %xmm6, %xmm1
3086
3087         pshufd   $0x55, %xmm4, %xmm6
3088         mulps    %xmm1, %xmm6
3089         subps    %xmm6, %xmm3
3090
3091         pshufd   $0xff, %xmm4, %xmm6
3092         mulps    %xmm6, %xmm3
3093 #endif
3094
3095 #ifdef RN
3096         movaps   0 * SIZE(B), %xmm6
3097         pshufd   $0x00, %xmm6, %xmm7
3098         mulps    %xmm7, %xmm0
3099         pshufd   $0x55, %xmm6, %xmm7
3100         mulps    %xmm0, %xmm7
3101         subps    %xmm7, %xmm1
3102         pshufd   $0xaa, %xmm6, %xmm7
3103         mulps    %xmm0, %xmm7
3104         subps    %xmm7, %xmm2
3105         pshufd   $0xff, %xmm6, %xmm7
3106         mulps    %xmm0, %xmm7
3107         subps    %xmm7, %xmm3
3108
3109         movaps   4 * SIZE(B), %xmm6
3110         pshufd   $0x55, %xmm6, %xmm7
3111         mulps    %xmm7, %xmm1
3112         pshufd   $0xaa, %xmm6, %xmm7
3113         mulps    %xmm1, %xmm7
3114         subps    %xmm7, %xmm2
3115         pshufd   $0xff, %xmm6, %xmm7
3116         mulps    %xmm1, %xmm7
3117         subps    %xmm7, %xmm3
3118
3119         movaps   8 * SIZE(B), %xmm6
3120         pshufd   $0xaa, %xmm6, %xmm7
3121         mulps    %xmm7, %xmm2
3122         pshufd   $0xff, %xmm6, %xmm7
3123         mulps    %xmm2, %xmm7
3124         subps    %xmm7, %xmm3
3125
3126         movaps   12 * SIZE(B), %xmm6
3127         pshufd   $0xff, %xmm6, %xmm7
3128         mulps    %xmm7, %xmm3
3129 #endif
3130
3131 #ifdef RT
3132         movaps   12 * SIZE(B), %xmm6
3133         pshufd   $0xff, %xmm6, %xmm7
3134         mulps    %xmm7, %xmm3
3135         pshufd   $0xaa, %xmm6, %xmm7
3136         mulps    %xmm3, %xmm7
3137         subps    %xmm7, %xmm2
3138         pshufd   $0x55, %xmm6, %xmm7
3139         mulps    %xmm3, %xmm7
3140         subps    %xmm7, %xmm1
3141         pshufd   $0x00, %xmm6, %xmm7
3142         mulps    %xmm3, %xmm7
3143         subps    %xmm7, %xmm0
3144
3145         movaps    8 * SIZE(B), %xmm6
3146         pshufd   $0xaa, %xmm6, %xmm7
3147         mulps    %xmm7, %xmm2
3148         pshufd   $0x55, %xmm6, %xmm7
3149         mulps    %xmm2, %xmm7
3150         subps    %xmm7, %xmm1
3151         pshufd   $0x00, %xmm6, %xmm7
3152         mulps    %xmm2, %xmm7
3153         subps    %xmm7, %xmm0
3154
3155         movaps    4 * SIZE(B), %xmm6
3156         pshufd   $0x55, %xmm6, %xmm7
3157         mulps    %xmm7, %xmm1
3158         pshufd   $0x00, %xmm6, %xmm7
3159         mulps    %xmm1, %xmm7
3160         subps    %xmm7, %xmm0
3161
3162         movaps    0 * SIZE(B), %xmm6
3163         pshufd   $0x00, %xmm6, %xmm7
3164         mulps    %xmm7, %xmm0
3165 #endif
3166
3167 #if defined(LN) || defined(LT)
3168         movaps  %xmm1,   0 * SIZE(B)
3169         movaps  %xmm3,   4 * SIZE(B)
3170
3171         pshufd  $0x00, %xmm1, %xmm0
3172         pshufd  $0x55, %xmm1, %xmm2
3173         pshufd  $0xaa, %xmm1, %xmm4
3174         pshufd  $0xff, %xmm1, %xmm6
3175         movaps  %xmm0,   0 * SIZE(BB)
3176         movaps  %xmm2,   4 * SIZE(BB)
3177         movaps  %xmm4,   8 * SIZE(BB)
3178         movaps  %xmm6,  12 * SIZE(BB)
3179
3180         pshufd  $0x00, %xmm3, %xmm0
3181         pshufd  $0x55, %xmm3, %xmm2
3182         pshufd  $0xaa, %xmm3, %xmm4
3183         pshufd  $0xff, %xmm3, %xmm6
3184         movaps  %xmm0,  16 * SIZE(BB)
3185         movaps  %xmm2,  20 * SIZE(BB)
3186         movaps  %xmm4,  24 * SIZE(BB)
3187         movaps  %xmm6,  28 * SIZE(BB)
3188 #else
3189         movlps  %xmm0,   0 * SIZE(AA)
3190         movlps  %xmm1,   2 * SIZE(AA)
3191         movlps  %xmm2,   4 * SIZE(AA)
3192         movlps  %xmm3,   6 * SIZE(AA)
3193 #endif
3194
3195 #ifdef LN
3196         subl    $2 * SIZE, CO1
3197 #endif
3198
3199         leal    (LDC, LDC, 2), %eax
3200
3201 #if defined(LN) || defined(LT)
3202         movaps   %xmm1, %xmm0
3203         unpcklps %xmm5, %xmm1
3204         unpckhps %xmm5, %xmm0
3205
3206         movaps   %xmm3, %xmm4
3207         unpcklps %xmm7, %xmm3
3208         unpckhps %xmm7, %xmm4
3209
3210         movaps   %xmm1, %xmm2
3211         unpcklps %xmm3, %xmm1
3212         unpckhps %xmm3, %xmm2
3213
3214         movaps   %xmm0, %xmm6
3215         unpcklps %xmm4, %xmm0
3216         unpckhps %xmm4, %xmm6
3217
3218         movlps  %xmm1, 0 * SIZE(CO1)
3219         movlps  %xmm2, 0 * SIZE(CO1, LDC, 1)
3220         movlps  %xmm0, 0 * SIZE(CO1, LDC, 2)
3221         movlps  %xmm6, 0 * SIZE(CO1, %eax, 1)
3222 #else
3223         movlps  %xmm0, 0 * SIZE(CO1)
3224         movlps  %xmm1, 0 * SIZE(CO1, LDC, 1)
3225         movlps  %xmm2, 0 * SIZE(CO1, LDC, 2)
3226         movlps  %xmm3, 0 * SIZE(CO1, %eax, 1)
3227 #endif
3228
3229 #ifndef LN
3230         addl    $2 * SIZE, CO1
3231 #endif
3232
3233 #if defined(LT) || defined(RN)
3234         movl    K,  %eax
3235         subl    KK, %eax
3236         leal    (,%eax, SIZE), %eax
3237         leal    (AA, %eax, 2), AA
3238 #ifdef LT
3239         addl    $8 * SIZE, B
3240 #endif
3241 #endif
3242
3243 #ifdef LN
3244         subl    $2, KK
3245         movl    BORIG, B
3246 #endif
3247
3248 #ifdef LT
3249         addl    $2, KK
3250 #endif
3251
3252 #ifdef RT
3253         movl    K, %eax
3254         movl    BORIG, B
3255         sall    $1 + BASE_SHIFT, %eax
3256         addl    %eax, AORIG
3257 #endif
3258         ALIGN_4
3259
3260 .L30:
3261         testl   $1, M
3262         je      .L39
3263
3264 #ifdef LN
3265        movl     K, %eax
3266        sall     $BASE_SHIFT, %eax
3267        subl     %eax, AORIG
3268 #endif
3269
3270 #if defined(LN) || defined(RT)
3271         movl    KK, %eax
3272         movl    AORIG, AA
3273         leal    (AA, %eax, SIZE), AA
3274 #endif
3275
3276         leal    BUFFER, BB
3277
3278 #if defined(LN) || defined(RT)
3279         movl    KK, %eax
3280         sall    $2 + BASE_SHIFT, %eax
3281         leal    (BB, %eax, 4), BB
3282 #endif  
3283
3284         movss    0 * SIZE(AA), %xmm0
3285         xorps   %xmm4, %xmm4
3286         movss    4 * SIZE(AA), %xmm1
3287         xorps   %xmm5, %xmm5
3288         movss    0 * SIZE(BB), %xmm2
3289         xorps   %xmm6, %xmm6
3290         movss   16 * SIZE(BB), %xmm3
3291         xorps   %xmm7, %xmm7
3292
3293 #if defined(LT) || defined(RN)
3294         movl    KK, %eax
3295 #else
3296         movl    K, %eax
3297         subl    KK, %eax
3298 #endif
3299         sarl    $3, %eax
3300         je      .L35
3301         ALIGN_4
3302
3303 .L32:
3304         mulss   %xmm0, %xmm2
3305         addss   %xmm2, %xmm4
3306 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BULLDOZER)
3307         prefetcht0 (PREFETCHSIZE  + 0) * SIZE(AA)
3308 #endif
3309         movss    4 * SIZE(BB), %xmm2
3310         mulss   %xmm0, %xmm2
3311         addss   %xmm2, %xmm5
3312         movss    8 * SIZE(BB), %xmm2
3313         mulss   %xmm0, %xmm2
3314         mulss   12 * SIZE(BB), %xmm0
3315         addss   %xmm2, %xmm6
3316         movss   32 * SIZE(BB), %xmm2
3317         addss   %xmm0, %xmm7
3318         movss    1 * SIZE(AA), %xmm0
3319
3320         mulss   %xmm0, %xmm3
3321         addss   %xmm3, %xmm4
3322         movss   20 * SIZE(BB), %xmm3
3323         mulss   %xmm0, %xmm3
3324         addss   %xmm3, %xmm5
3325         movss   24 * SIZE(BB), %xmm3
3326         mulss   %xmm0, %xmm3
3327         mulss   28 * SIZE(BB), %xmm0
3328         addss   %xmm3, %xmm6
3329         movss   48 * SIZE(BB), %xmm3
3330         addss   %xmm0, %xmm7
3331         movss    2 * SIZE(AA), %xmm0
3332
3333         mulss   %xmm0, %xmm2
3334         addss   %xmm2, %xmm4
3335         movss   36 * SIZE(BB), %xmm2
3336         mulss   %xmm0, %xmm2
3337         addss   %xmm2, %xmm5
3338         movss   40 * SIZE(BB), %xmm2
3339         mulss   %xmm0, %xmm2
3340         mulss   44 * SIZE(BB), %xmm0
3341         addss   %xmm2, %xmm6
3342         movss   64 * SIZE(BB), %xmm2
3343         addss   %xmm0, %xmm7
3344         movss    3 * SIZE(AA), %xmm0
3345
3346         mulss   %xmm0, %xmm3
3347         addss   %xmm3, %xmm4
3348         movss   52 * SIZE(BB), %xmm3
3349         mulss   %xmm0, %xmm3
3350         addss   %xmm3, %xmm5
3351         movss   56 * SIZE(BB), %xmm3
3352         mulss   %xmm0, %xmm3
3353         mulss   60 * SIZE(BB), %xmm0
3354         addss   %xmm3, %xmm6
3355         movss   80 * SIZE(BB), %xmm3
3356         addss   %xmm0, %xmm7
3357         movss    8 * SIZE(AA), %xmm0
3358
3359         mulss   %xmm1, %xmm2
3360         addss   %xmm2, %xmm4
3361         movss   68 * SIZE(BB), %xmm2
3362         mulss   %xmm1, %xmm2
3363         addss   %xmm2, %xmm5
3364         movss   72 * SIZE(BB), %xmm2
3365         mulss   %xmm1, %xmm2
3366         mulss   76 * SIZE(BB), %xmm1
3367         addss   %xmm2, %xmm6
3368         movss   96 * SIZE(BB), %xmm2
3369         addss   %xmm1, %xmm7
3370         movss    5 * SIZE(AA), %xmm1
3371
3372         mulss   %xmm1, %xmm3
3373         addss   %xmm3, %xmm4
3374         movss   84 * SIZE(BB), %xmm3
3375         mulss   %xmm1, %xmm3
3376         addss   %xmm3, %xmm5
3377         movss   88 * SIZE(BB), %xmm3
3378         mulss   %xmm1, %xmm3
3379         mulss   92 * SIZE(BB), %xmm1
3380         addss   %xmm3, %xmm6
3381         movss   112 * SIZE(BB), %xmm3
3382         addss   %xmm1, %xmm7
3383         movss    6 * SIZE(AA), %xmm1
3384
3385         mulss   %xmm1, %xmm2
3386         addss   %xmm2, %xmm4
3387         movss   100 * SIZE(BB), %xmm2
3388         mulss   %xmm1, %xmm2
3389         addss   %xmm2, %xmm5
3390         movss   104 * SIZE(BB), %xmm2
3391         mulss   %xmm1, %xmm2
3392         mulss   108 * SIZE(BB), %xmm1
3393         addss   %xmm2, %xmm6
3394         movss   128 * SIZE(BB), %xmm2
3395         addss   %xmm1, %xmm7
3396         movss    7 * SIZE(AA), %xmm1
3397
3398         mulss   %xmm1, %xmm3
3399         addss   %xmm3, %xmm4
3400         movss   116 * SIZE(BB), %xmm3
3401         mulss   %xmm1, %xmm3
3402         addss   %xmm3, %xmm5
3403         movss   120 * SIZE(BB), %xmm3
3404         mulss   %xmm1, %xmm3
3405         mulss   124 * SIZE(BB), %xmm1
3406         addss   %xmm3, %xmm6
3407         movss   144 * SIZE(BB), %xmm3
3408         addss   %xmm1, %xmm7
3409         movss   12 * SIZE(AA), %xmm1
3410
3411         addl    $  8 * SIZE, AA
3412         addl    $128 * SIZE, BB
3413         decl   %eax
3414         jne    .L32
3415         ALIGN_4
3416
3417 .L35:
3418 #if defined(LT) || defined(RN)
3419         movl    KK, %eax
3420 #else
3421         movl    K, %eax
3422         subl    KK, %eax
3423 #endif
3424         andl    $7, %eax                # if (k & 1)
3425         BRANCH
3426         je .L38
3427         ALIGN_4
3428
3429 .L36:
3430         mulss   %xmm0, %xmm2
3431         addss   %xmm2, %xmm4
3432         movss    4 * SIZE(BB), %xmm2
3433         mulss   %xmm0, %xmm2
3434         addss   %xmm2, %xmm5
3435         movss    8 * SIZE(BB), %xmm2
3436         mulss   %xmm0, %xmm2
3437         mulss   12 * SIZE(BB), %xmm0
3438         addss   %xmm2, %xmm6
3439         movss   16 * SIZE(BB), %xmm2
3440         addss   %xmm0, %xmm7
3441         movss    1 * SIZE(AA), %xmm0
3442
3443         addl    $ 1 * SIZE, AA
3444         addl    $16 * SIZE, BB
3445         decl    %eax
3446         jg      .L36
3447         ALIGN_4
3448
3449 .L38:
3450 #if defined(LN) || defined(RT)
3451         movl    KK, %eax
3452 #ifdef LN
3453         subl    $1, %eax
3454 #else
3455         subl    $4, %eax
3456 #endif
3457
3458         movl    AORIG, AA
3459         movl    BORIG, B
3460         leal    BUFFER, BB
3461
3462         leal    (AA, %eax, SIZE), AA
3463
3464         sall    $2 + BASE_SHIFT, %eax
3465         leal    (B,  %eax, 1), B
3466         leal    (BB, %eax, 4), BB
3467 #endif
3468
3469 #if defined(LN) || defined(LT)
3470         unpcklps %xmm6, %xmm4
3471         unpcklps %xmm7, %xmm5
3472         unpcklps %xmm5, %xmm4
3473
3474         movaps   0 * SIZE(B), %xmm1
3475
3476         subps   %xmm4,  %xmm1
3477 #else
3478         movss    0 * SIZE(AA), %xmm0
3479         movss    1 * SIZE(AA), %xmm1
3480         movss    2 * SIZE(AA), %xmm2
3481         movss    3 * SIZE(AA), %xmm3
3482
3483         subss   %xmm4, %xmm0
3484         subss   %xmm5, %xmm1
3485         subss   %xmm6, %xmm2
3486         subss   %xmm7, %xmm3
3487 #endif
3488
3489 #if defined(LN) || defined(LT)
3490         movss     0 * SIZE(AA), %xmm4
3491         pshufd   $0x00, %xmm4, %xmm6
3492         mulps    %xmm6, %xmm1
3493 #endif
3494
3495 #ifdef RN
3496         movaps   0 * SIZE(B), %xmm6
3497         pshufd   $0x00, %xmm6, %xmm7
3498         mulss    %xmm7, %xmm0
3499         pshufd   $0x55, %xmm6, %xmm7
3500         mulss    %xmm0, %xmm7
3501         subss    %xmm7, %xmm1
3502         pshufd   $0xaa, %xmm6, %xmm7
3503         mulss    %xmm0, %xmm7
3504         subss    %xmm7, %xmm2
3505         pshufd   $0xff, %xmm6, %xmm7
3506         mulss    %xmm0, %xmm7
3507         subss    %xmm7, %xmm3
3508
3509         movaps   4 * SIZE(B), %xmm6
3510         pshufd   $0x55, %xmm6, %xmm7
3511         mulss    %xmm7, %xmm1
3512         pshufd   $0xaa, %xmm6, %xmm7
3513         mulss    %xmm1, %xmm7
3514         subss    %xmm7, %xmm2
3515         pshufd   $0xff, %xmm6, %xmm7
3516         mulss    %xmm1, %xmm7
3517         subss    %xmm7, %xmm3
3518
3519         movaps   8 * SIZE(B), %xmm6
3520         pshufd   $0xaa, %xmm6, %xmm7
3521         mulss    %xmm7, %xmm2
3522         pshufd   $0xff, %xmm6, %xmm7
3523         mulss    %xmm2, %xmm7
3524         subss    %xmm7, %xmm3
3525
3526         movaps   12 * SIZE(B), %xmm6
3527         pshufd   $0xff, %xmm6, %xmm7
3528         mulss    %xmm7, %xmm3
3529 #endif
3530
3531 #ifdef RT
3532         movaps   12 * SIZE(B), %xmm6
3533         pshufd   $0xff, %xmm6, %xmm7
3534         mulss    %xmm7, %xmm3
3535         pshufd   $0xaa, %xmm6, %xmm7
3536         mulss    %xmm3, %xmm7
3537         subss    %xmm7, %xmm2
3538         pshufd   $0x55, %xmm6, %xmm7
3539         mulss    %xmm3, %xmm7
3540         subss    %xmm7, %xmm1
3541         pshufd   $0x00, %xmm6, %xmm7
3542         mulss    %xmm3, %xmm7
3543         subss    %xmm7, %xmm0
3544
3545         movaps    8 * SIZE(B), %xmm6
3546         pshufd   $0xaa, %xmm6, %xmm7
3547         mulss    %xmm7, %xmm2
3548         pshufd   $0x55, %xmm6, %xmm7
3549         mulss    %xmm2, %xmm7
3550         subss    %xmm7, %xmm1
3551         pshufd   $0x00, %xmm6, %xmm7
3552         mulss    %xmm2, %xmm7
3553         subss    %xmm7, %xmm0
3554
3555         movaps    4 * SIZE(B), %xmm6
3556         pshufd   $0x55, %xmm6, %xmm7
3557         mulss    %xmm7, %xmm1
3558         pshufd   $0x00, %xmm6, %xmm7
3559         mulss    %xmm1, %xmm7
3560         subss    %xmm7, %xmm0
3561
3562         movaps    0 * SIZE(B), %xmm6
3563         pshufd   $0x00, %xmm6, %xmm7
3564         mulss    %xmm7, %xmm0
3565 #endif
3566
3567 #if defined(LN) || defined(LT)
3568         movaps  %xmm1,   0 * SIZE(B)
3569
3570         pshufd  $0x00, %xmm1, %xmm0
3571         pshufd  $0x55, %xmm1, %xmm2
3572         pshufd  $0xaa, %xmm1, %xmm4
3573         pshufd  $0xff, %xmm1, %xmm6
3574         movaps  %xmm0,   0 * SIZE(BB)
3575         movaps  %xmm2,   4 * SIZE(BB)
3576         movaps  %xmm4,   8 * SIZE(BB)
3577         movaps  %xmm6,  12 * SIZE(BB)
3578 #else
3579         movss   %xmm0,   0 * SIZE(AA)
3580         movss   %xmm1,   1 * SIZE(AA)
3581         movss   %xmm2,   2 * SIZE(AA)
3582         movss   %xmm3,   3 * SIZE(AA)
3583 #endif
3584
3585 #ifdef LN
3586         subl    $1 * SIZE, CO1
3587 #endif
3588
3589         leal    (LDC, LDC, 2), %eax
3590
3591 #if defined(LN) || defined(LT)
3592         movaps   %xmm1, %xmm0
3593         unpcklps %xmm5, %xmm1
3594         unpckhps %xmm5, %xmm0
3595
3596         movaps   %xmm3, %xmm4
3597         unpcklps %xmm7, %xmm3
3598         unpckhps %xmm7, %xmm4
3599
3600         movaps   %xmm1, %xmm2
3601         unpcklps %xmm3, %xmm1
3602         unpckhps %xmm3, %xmm2
3603
3604         movaps   %xmm0, %xmm6
3605         unpcklps %xmm4, %xmm0
3606         unpckhps %xmm4, %xmm6
3607
3608         movss   %xmm1, 0 * SIZE(CO1)
3609         movss   %xmm2, 0 * SIZE(CO1, LDC, 1)
3610         movss   %xmm0, 0 * SIZE(CO1, LDC, 2)
3611         movss   %xmm6, 0 * SIZE(CO1, %eax, 1)
3612 #else
3613         movss   %xmm0, 0 * SIZE(CO1)
3614         movss   %xmm1, 0 * SIZE(CO1, LDC, 1)
3615         movss   %xmm2, 0 * SIZE(CO1, LDC, 2)
3616         movss   %xmm3, 0 * SIZE(CO1, %eax, 1)
3617 #endif
3618
3619 #ifndef LN
3620         addl    $1 * SIZE, CO1
3621 #endif
3622
3623 #if defined(LT) || defined(RN)
3624         movl    K,  %eax
3625         subl    KK, %eax
3626         leal    (AA, %eax, SIZE), AA
3627 #ifdef LT
3628         addl    $4 * SIZE, B
3629 #endif
3630 #endif
3631
3632 #ifdef LN
3633         subl    $1, KK
3634         movl    BORIG, B
3635 #endif
3636
3637 #ifdef LT
3638         addl    $1, KK
3639 #endif
3640
3641 #ifdef RT
3642         movl    K, %eax
3643         movl    BORIG, B
3644         sall    $BASE_SHIFT, %eax
3645         addl    %eax, AORIG
3646 #endif
3647         ALIGN_4
3648
3649 .L39:
3650 #ifdef LN
3651        movl     K, %eax
3652        leal     (, %eax, SIZE), %eax
3653        leal     (B, %eax, 4), B
3654 #endif
3655
3656 #if defined(LT) || defined(RN)
3657         movl    K,  %eax
3658         subl    KK, %eax
3659         leal    (,%eax, SIZE), %eax
3660         leal    (B,  %eax, 4), B
3661 #endif
3662
3663 #ifdef RN
3664         addl    $4, KK
3665 #endif
3666
3667 #ifdef RT
3668         subl    $4, KK
3669 #endif
3670
3671         decl    J                       # j --
3672         jg      .L01
3673         ALIGN_4
3674
3675 .L999:
3676         movl    OLD_STACK, %esp
3677         popl    %ebx
3678         popl    %esi
3679         popl    %edi
3680         popl    %ebp
3681         ret
3682
3683         EPILOGUE