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