Support AMD Piledriver by bulldozer kernels.
[platform/upstream/openblas.git] / kernel / x86 / ztrsm_kernel_RT_2x2_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 #define ARGS     0
44         
45 #define STACK_M  4 + STACK + ARGS(%esi)
46 #define STACK_N  8 + STACK + ARGS(%esi)
47 #define STACK_K 12 + STACK + ARGS(%esi)
48 #define STACK_A 24 + STACK + ARGS(%esi)
49 #define STACK_B 28 + STACK + ARGS(%esi)
50 #define STACK_C 32 + STACK + ARGS(%esi)
51 #define STACK_LDC       36 + STACK + ARGS(%esi)
52 #define STACK_OFFT      40 + STACK + ARGS(%esi)
53
54 #define POSINV   0(%esp)
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  48(%esp)
63 #define KK      52(%esp)
64 #define KKK     56(%esp)
65 #define AORIG   60(%esp)
66 #define BORIG   64(%esp)
67 #define BUFFER 128(%esp)
68
69 #define B       %edi
70 #define LDC     %ebp
71 #define AA      %edx
72 #define BB      %ecx
73 #define CO1     %esi
74
75 #define STACK_ALIGN     4096
76 #define STACK_OFFSET    1024
77
78 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
79 #define PREFETCHSIZE (16 * 10 + 8)
80 #define WPREFETCHSIZE 112
81 #define PREFETCH      prefetch
82 #define PREFETCHW     prefetchw
83 #endif
84
85 #if defined(PENTIUM4) || defined(PENTIUMM)
86 #define PREFETCH        prefetcht1
87 #define PREFETCHSIZE 168
88 #define PREFETCHW     prefetcht0
89 #endif
90
91 #if defined(PENRYN) || defined(DUNNINGTON)
92 #define PREFETCH        prefetcht1
93 #define PREFETCHSIZE 168
94 #define PREFETCHW     prefetcht0
95 #endif
96
97 #if defined(OPTERON) || !defined(HAVE_SSE2)
98 #define movsd   movlps
99 #endif
100
101 #ifdef HAVE_SSE2
102 #define xorps   pxor
103 #endif
104
105 #define KERNEL1(address) \
106         mulps   %xmm0, %xmm2; \
107         PREFETCH (PREFETCHSIZE + 0) * SIZE + (address) * 1 * SIZE(AA); \
108         addps   %xmm2, %xmm4; \
109         movaps   4 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
110         mulps   %xmm0, %xmm2; \
111         addps   %xmm2, %xmm5; \
112         movaps   8 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
113         mulps   %xmm0, %xmm2; \
114         mulps   12 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
115         addps   %xmm2, %xmm6; \
116         movaps  32 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
117         addps   %xmm0, %xmm7; \
118         movaps   4 * SIZE + (address) * 1 * SIZE(AA), %xmm0
119
120 #define KERNEL2(address) \
121         mulps   %xmm0, %xmm3; \
122         addps   %xmm3, %xmm4; \
123         movaps  20 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
124         mulps   %xmm0, %xmm3; \
125         addps   %xmm3, %xmm5; \
126         movaps  24 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
127         mulps   %xmm0, %xmm3; \
128         mulps   28 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
129         addps   %xmm3, %xmm6; \
130         movaps  48 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
131         addps   %xmm0, %xmm7; \
132         movaps   8 * SIZE + (address) * 1 * SIZE(AA), %xmm0
133
134 #define KERNEL3(address) \
135         mulps   %xmm0, %xmm2; \
136         addps   %xmm2, %xmm4; \
137         movaps  36 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
138         mulps   %xmm0, %xmm2; \
139         addps   %xmm2, %xmm5; \
140         movaps  40 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
141         mulps   %xmm0, %xmm2; \
142         mulps   44 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
143         addps   %xmm2, %xmm6; \
144         movaps  64 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
145         addps   %xmm0, %xmm7; \
146         movaps  12 * SIZE + (address) * 1 * SIZE(AA), %xmm0
147
148 #define KERNEL4(address) \
149         mulps   %xmm0, %xmm3; \
150         addps   %xmm3, %xmm4; \
151         movaps  52 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
152         mulps   %xmm0, %xmm3; \
153         addps   %xmm3, %xmm5; \
154         movaps  56 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
155         mulps   %xmm0, %xmm3; \
156         mulps   60 * SIZE + (address) * 4 * SIZE(BB), %xmm0; \
157         addps   %xmm3, %xmm6; \
158         movaps  80 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
159         addps   %xmm0, %xmm7; \
160         movaps   32 * SIZE + (address) * 1 * SIZE(AA), %xmm0
161
162 #define KERNEL5(address) \
163         mulps   %xmm1, %xmm2; \
164         addps   %xmm2, %xmm4; \
165         movaps  68 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
166         mulps   %xmm1, %xmm2; \
167         addps   %xmm2, %xmm5; \
168         movaps  72 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
169         mulps   %xmm1, %xmm2; \
170         mulps   76 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
171         addps   %xmm2, %xmm6; \
172         movaps   96 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
173         addps   %xmm1, %xmm7; \
174         movaps  20 * SIZE + (address) * 1 * SIZE(AA), %xmm1
175
176 #define KERNEL6(address) \
177         mulps   %xmm1, %xmm3; \
178         addps   %xmm3, %xmm4; \
179         movaps  84 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
180         mulps   %xmm1, %xmm3; \
181         addps   %xmm3, %xmm5; \
182         movaps  88 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
183         mulps   %xmm1, %xmm3; \
184         mulps   92 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
185         addps   %xmm3, %xmm6; \
186         movaps  112 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
187         addps   %xmm1, %xmm7; \
188         movaps   24 * SIZE + (address) * 1 * SIZE(AA), %xmm1
189
190 #define KERNEL7(address) \
191         mulps   %xmm1, %xmm2; \
192         addps   %xmm2, %xmm4; \
193         movaps  100 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
194         mulps   %xmm1, %xmm2; \
195         addps   %xmm2, %xmm5; \
196         movaps  104 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
197         mulps   %xmm1, %xmm2; \
198         mulps   108 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
199         addps   %xmm2, %xmm6; \
200         movaps  128 * SIZE + (address) * 4 * SIZE(BB), %xmm2; \
201         addps   %xmm1, %xmm7; \
202         movaps  28 * SIZE + (address) * 1 * SIZE(AA), %xmm1
203
204 #define KERNEL8(address) \
205         mulps   %xmm1, %xmm3; \
206         addps   %xmm3, %xmm4; \
207         movaps  116 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
208         mulps   %xmm1, %xmm3; \
209         addps   %xmm3, %xmm5; \
210         movaps  120 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
211         mulps   %xmm1, %xmm3; \
212         mulps   124 * SIZE + (address) * 4 * SIZE(BB), %xmm1; \
213         addps   %xmm3, %xmm6; \
214         movaps  144 * SIZE + (address) * 4 * SIZE(BB), %xmm3; \
215         addps   %xmm1, %xmm7; \
216         movaps   48 * SIZE + (address) * 1 * SIZE(AA), %xmm1;
217
218         PROLOGUE
219
220         pushl   %ebp
221         pushl   %edi
222         pushl   %esi
223         pushl   %ebx
224
225         PROFCODE
226
227         movl    %esp, %esi      # save old stack
228
229         subl    $128 + LOCAL_BUFFER_SIZE + STACK_OFFSET, %esp
230         andl    $-STACK_ALIGN, %esp     # align stack
231         addl    $STACK_OFFSET, %esp
232
233         STACK_TOUCHING
234
235         movl    STACK_M, %ebx
236         movl    STACK_N, %eax
237         movl    STACK_K, %ecx
238         movl    STACK_A, %edx
239
240         movl    %ebx, M
241         movl    %eax, N
242         movl    %ecx, K
243         movl    %edx, A
244         movl    %esi, OLD_STACK
245
246         movl    STACK_B, %edi
247         movl    STACK_C, %ebx
248         movss   STACK_OFFT, %xmm4
249
250         xorps   %xmm7, %xmm7
251         pcmpeqb %xmm7, %xmm7
252         pslld   $31,   %xmm7
253         xorps   %xmm2, %xmm2
254
255 #ifndef CONJ
256         movss     %xmm7,   0 + POSINV
257         movss     %xmm2,   4 + POSINV
258         movss     %xmm7,   8 + POSINV
259         movss     %xmm2,  12 + POSINV
260 #else
261         movss     %xmm2,   0 + POSINV
262         movss     %xmm7,   4 + POSINV
263         movss     %xmm2,   8 + POSINV
264         movss     %xmm7,  12 + POSINV
265 #endif
266
267         EMMS
268
269         movl    %ebx, C
270         movl    STACK_LDC, LDC
271
272         movss   %xmm4, OFFSET
273         movss   %xmm4, KK
274
275         sall    $ZBASE_SHIFT, LDC
276
277 #ifdef LN
278        movl     M, %eax
279        sall     $ZBASE_SHIFT, %eax
280        addl     %eax, C
281        imull    K, %eax
282        addl     %eax, A
283 #endif
284
285 #ifdef RT
286        movl     N, %eax
287        sall     $ZBASE_SHIFT, %eax
288        imull    K, %eax
289        addl     %eax, B
290
291        movl     N, %eax
292        imull    LDC, %eax
293        addl     %eax, C
294 #endif
295
296 #ifdef RN
297         negl    KK
298 #endif  
299
300 #ifdef RT
301        movl     N, %eax
302        subl     OFFSET, %eax
303        movl     %eax, KK
304 #endif
305
306         movl    N, %eax
307         andl    $1, %eax
308         jle     .L100
309         ALIGN_4
310
311 .L101:
312 #ifdef LN
313         movl    OFFSET, %eax
314         addl    M, %eax
315         movl    %eax, KK
316 #endif  
317
318         leal    BUFFER, %ecx
319
320 #ifdef RT
321        movl     K, %eax
322        sall     $ZBASE_SHIFT, %eax
323        subl     %eax, B
324 #endif
325
326 #if defined(LN) || defined(RT)
327         movl    KK, %eax
328         movl    B, BORIG
329         sall    $ZBASE_SHIFT, %eax
330         addl    %eax, B
331         leal    (BB, %eax, 4), BB
332 #endif  
333
334 #if defined(LT)
335         movl    OFFSET, %eax
336         movl    %eax, KK
337 #endif
338
339 #if defined(LT) || defined(RN)
340         movl    KK, %eax
341 #else
342         movl    K,  %eax
343         subl    KK, %eax
344 #endif
345         sarl    $2, %eax
346         jle     .L103
347         ALIGN_4
348
349 .L102:
350         movaps   0 * SIZE(B), %xmm3
351         movaps   4 * SIZE(B), %xmm7
352
353         pshufd   $0x00, %xmm3, %xmm0
354         pshufd   $0x55, %xmm3, %xmm1
355         pshufd   $0xaa, %xmm3, %xmm2
356         pshufd   $0xff, %xmm3, %xmm3
357
358         movaps  %xmm0,  0 * SIZE(BB)
359         movaps  %xmm1,  4 * SIZE(BB)
360         movaps  %xmm2,  8 * SIZE(BB)
361         movaps  %xmm3, 12 * SIZE(BB)
362
363         pshufd   $0x00, %xmm7, %xmm4
364         pshufd   $0x55, %xmm7, %xmm5
365         pshufd   $0xaa, %xmm7, %xmm6
366         pshufd   $0xff, %xmm7, %xmm7
367
368         movaps  %xmm4, 16 * SIZE(BB)
369         movaps  %xmm5, 20 * SIZE(BB)
370         movaps  %xmm6, 24 * SIZE(BB)
371         movaps  %xmm7, 28 * SIZE(BB)
372
373         addl    $ 8 * SIZE, B
374         addl    $32 * SIZE, BB
375         decl    %eax
376         jne     .L102
377         ALIGN_4
378
379 .L103:
380 #if defined(LT) || defined(RN)
381         movl    KK, %eax
382 #else
383         movl    K, %eax
384         subl    KK, %eax
385 #endif
386         andl    $3, %eax
387         BRANCH
388         jle     .L105
389         ALIGN_4
390
391 .L104:
392 #ifdef  movsd
393         xorps   %xmm3, %xmm3
394 #endif
395         movsd    0 * SIZE(B), %xmm3
396
397         pshufd   $0x00, %xmm3, %xmm0
398         pshufd   $0x55, %xmm3, %xmm1
399
400         movaps  %xmm0,  0 * SIZE(BB)
401         movaps  %xmm1,  4 * SIZE(BB)
402
403         addl    $ 2 * SIZE, %edi
404         addl    $ 8 * SIZE, %ecx
405         decl    %eax
406         jne     .L104
407         ALIGN_4
408
409 .L105:
410 #if defined(LT) || defined(RN)
411         movl    A, %eax
412         movl    %eax, AA
413 #else
414         movl    A, %eax
415         movl    %eax, AORIG
416 #endif
417
418 #ifdef RT
419        subl     LDC, C
420 #endif
421
422         movl    C,  CO1
423
424 #ifndef RT
425         addl    LDC, C
426 #endif
427
428         movl    M,  %ebx
429         sarl    $1, %ebx
430         jle     .L130
431         ALIGN_4
432
433 .L110:
434 #ifdef LN
435        movl     K, %eax
436        sall     $1 + ZBASE_SHIFT, %eax
437        subl     %eax, AORIG
438 #endif
439
440 #if defined(LN) || defined(RT)
441         movl    AORIG, %eax
442         movl    %eax, AA
443
444         movl    KK, %eax
445         sall    $1 + ZBASE_SHIFT, %eax
446         addl    %eax, AA
447 #endif
448
449         leal    BUFFER, BB      # boffset1 = boffset
450
451 #if defined(LN) || defined(RT)
452         movl    KK, %eax
453         sall    $2 + ZBASE_SHIFT, %eax
454         addl    %eax, BB
455 #endif  
456
457         xorps   %xmm4, %xmm4
458         xorps   %xmm5, %xmm5
459         xorps   %xmm6, %xmm6
460         xorps   %xmm7, %xmm7
461
462         movaps   0 * SIZE(AA), %xmm0
463         movaps  16 * SIZE(AA), %xmm1
464         movaps   0 * SIZE(BB), %xmm2
465         movaps  16 * SIZE(BB), %xmm3
466
467         PREFETCHW   3 * SIZE(CO1)
468
469 #if defined(LT) || defined(RN)
470         movl    KK, %eax
471 #else
472         movl    K, %eax
473         subl    KK, %eax
474 #endif
475         sarl    $3, %eax
476         je      .L112
477         ALIGN_4
478
479 .L111:
480         mulps   %xmm0, %xmm2
481         addps   %xmm2, %xmm4
482         movaps   4 * SIZE(BB), %xmm2
483         mulps   %xmm0, %xmm2
484         movaps   4 * SIZE(AA), %xmm0
485         addps   %xmm2, %xmm5
486         movaps   8 * SIZE(BB), %xmm2
487         mulps   %xmm0, %xmm2
488         addps   %xmm2, %xmm6
489         movaps  12 * SIZE(BB), %xmm2
490         mulps   %xmm0, %xmm2
491         movaps   8 * SIZE(AA), %xmm0
492         addps   %xmm2, %xmm7
493         movaps  32 * SIZE(BB), %xmm2
494         mulps   %xmm0, %xmm3
495         addps   %xmm3, %xmm4
496         movaps  20 * SIZE(BB), %xmm3
497         mulps   %xmm0, %xmm3
498         movaps  12  * SIZE(AA), %xmm0
499         addps   %xmm3, %xmm5
500         movaps  24 * SIZE(BB), %xmm3
501         mulps   %xmm0, %xmm3
502         addps   %xmm3, %xmm6
503         movaps  28 * SIZE(BB), %xmm3
504         mulps   %xmm0, %xmm3
505         movaps  32 * SIZE(AA), %xmm0
506         addps   %xmm3, %xmm7
507         movaps  48 * SIZE(BB), %xmm3
508         mulps   %xmm1, %xmm2
509         addps   %xmm2, %xmm4
510         movaps  36 * SIZE(BB), %xmm2
511         mulps   %xmm1, %xmm2
512         movaps  20 * SIZE(AA), %xmm1
513         addps   %xmm2, %xmm5
514         movaps  40 * SIZE(BB), %xmm2
515         mulps   %xmm1, %xmm2
516         addps   %xmm2, %xmm6
517         movaps  44 * SIZE(BB), %xmm2
518         mulps   %xmm1, %xmm2
519         movaps  24 * SIZE(AA), %xmm1
520         addps   %xmm2, %xmm7
521         movaps  64 * SIZE(BB), %xmm2
522         mulps   %xmm1, %xmm3
523         addps   %xmm3, %xmm4
524         movaps  52 * SIZE(BB), %xmm3
525         mulps   %xmm1, %xmm3
526         movaps  28 * SIZE(AA), %xmm1
527         addps   %xmm3, %xmm5
528         movaps  56 * SIZE(BB), %xmm3
529         mulps   %xmm1, %xmm3
530         addps   %xmm3, %xmm6
531         movaps  60 * SIZE(BB), %xmm3
532         mulps   %xmm1, %xmm3
533         movaps  48 * SIZE(AA), %xmm1
534         addps   %xmm3, %xmm7
535         movaps  80 * SIZE(BB), %xmm3
536
537         addl    $ 32 * SIZE, AA
538         addl    $ 64 * SIZE, BB
539         decl    %eax
540         jne     .L111
541         ALIGN_4
542         
543 .L112:
544 #if defined(LT) || defined(RN)
545         movl    KK, %eax
546 #else
547         movl    K,  %eax
548         subl    KK, %eax
549 #endif
550         andl    $7, %eax                # if (k & 1)
551         BRANCH
552         je .L114
553         ALIGN_4
554
555 .L113:
556         mulps   %xmm0, %xmm2
557         mulps    4 * SIZE(BB), %xmm0
558         addps   %xmm2, %xmm4
559         movaps   8 * SIZE(BB), %xmm2
560         addps   %xmm0, %xmm5
561         movaps   4 * SIZE(AA), %xmm0
562
563         addl    $ 4 * SIZE, AA
564         addl    $ 8 * SIZE, BB
565         decl    %eax
566         jg      .L113
567         ALIGN_4
568
569 .L114:
570         addps   %xmm6, %xmm4
571         addps   %xmm7, %xmm5
572
573         movaps  POSINV,  %xmm0
574
575         shufps  $0xb1, %xmm5, %xmm5
576
577 #if defined(LN) || defined(LT)
578 #ifndef CONJ
579         xorps    %xmm0, %xmm5
580 #else
581         xorps    %xmm0, %xmm4
582 #endif
583 #else
584         xorps    %xmm0, %xmm5
585 #endif
586
587         addps   %xmm5, %xmm4
588
589 #if defined(LN) || defined(RT)
590         movl    KK, %eax
591 #ifdef LN
592         subl    $2, %eax
593 #else
594         subl    $1, %eax
595 #endif
596
597         movl    AORIG, AA
598         movl    BORIG, B
599         leal    BUFFER, BB
600
601         sall    $ZBASE_SHIFT, %eax
602         leal    (AA, %eax, 2), AA
603         leal    (B,  %eax, 1), B
604         leal    (BB, %eax, 4), BB
605 #endif
606
607 #if defined(LN) || defined(LT)
608         movaps  %xmm4, %xmm5
609         unpcklpd %xmm6, %xmm4
610         unpckhpd %xmm6, %xmm5
611
612 #ifdef  movsd
613         xorps   %xmm2, %xmm2
614 #endif
615         movsd    0 * SIZE(B), %xmm2
616 #ifdef  movsd
617         xorps   %xmm3, %xmm3
618 #endif
619         movsd    2 * SIZE(B), %xmm3
620
621         subps   %xmm4,  %xmm2
622         subps   %xmm5,  %xmm3
623 #else
624         movaps   0 * SIZE(AA), %xmm1
625
626         subps   %xmm4,  %xmm1
627 #endif
628
629 #ifdef LN
630         movaps   4 * SIZE(AA), %xmm5
631
632         pshufd   $0xee, %xmm5, %xmm6
633         pshufd   $0xbb, %xmm5, %xmm7
634
635         pshufd   $0xa0, %xmm3, %xmm4
636         pshufd   $0xf5, %xmm3, %xmm3
637
638 #ifndef CONJ
639         xorps    %xmm0, %xmm3
640 #else
641         xorps    %xmm0, %xmm4
642 #endif
643
644         mulps   %xmm6,  %xmm4
645         mulps   %xmm7, %xmm3
646         addps   %xmm4,  %xmm3
647
648         pshufd   $0x44, %xmm5, %xmm6
649         pshufd   $0x11, %xmm5, %xmm7
650
651         pshufd   $0xa0, %xmm3, %xmm4
652         pshufd   $0xf5, %xmm3, %xmm1
653
654 #ifndef CONJ
655         xorps    %xmm0, %xmm1
656 #else
657         xorps    %xmm0, %xmm4
658 #endif
659
660         mulps   %xmm6,  %xmm4
661         mulps   %xmm7, %xmm1
662         subps   %xmm4,  %xmm2
663         subps   %xmm1,  %xmm2
664
665         movaps   0 * SIZE(AA), %xmm5
666
667         pshufd   $0x44, %xmm5, %xmm6
668         pshufd   $0x11, %xmm5, %xmm7
669
670         pshufd   $0xa0, %xmm2, %xmm4
671         pshufd   $0xf5, %xmm2, %xmm2
672
673 #ifndef CONJ
674         xorps    %xmm0, %xmm2
675 #else
676         xorps    %xmm0, %xmm4
677 #endif
678
679         mulps   %xmm6,  %xmm4
680         mulps   %xmm7, %xmm2
681         addps   %xmm4,  %xmm2
682 #endif
683
684 #ifdef LT
685         movaps   0 * SIZE(AA), %xmm5
686
687         pshufd   $0x44, %xmm5, %xmm6
688         pshufd   $0x11, %xmm5, %xmm7
689
690         pshufd   $0xa0, %xmm2, %xmm4
691         pshufd   $0xf5, %xmm2, %xmm2
692
693 #ifndef CONJ
694         xorps    %xmm0, %xmm2
695 #else
696         xorps    %xmm0, %xmm4
697 #endif
698
699         mulps   %xmm6,  %xmm4
700         mulps   %xmm7, %xmm2
701         addps   %xmm4,  %xmm2
702
703         pshufd   $0xee, %xmm5, %xmm6
704         pshufd   $0xbb, %xmm5, %xmm7
705
706         pshufd   $0xa0, %xmm2, %xmm4
707         pshufd   $0xf5, %xmm2, %xmm1
708
709 #ifndef CONJ
710         xorps    %xmm0, %xmm1
711 #else
712         xorps    %xmm0, %xmm4
713 #endif
714
715         mulps   %xmm6,  %xmm4
716         mulps   %xmm7, %xmm1
717         subps   %xmm4,  %xmm3
718         subps   %xmm1,  %xmm3
719
720         movaps   4 * SIZE(AA), %xmm5
721
722         pshufd   $0xee, %xmm5, %xmm6
723         pshufd   $0xbb, %xmm5, %xmm7
724
725         pshufd   $0xa0, %xmm3, %xmm4
726         pshufd   $0xf5, %xmm3, %xmm3
727
728 #ifndef CONJ
729         xorps    %xmm0, %xmm3
730 #else
731         xorps    %xmm0, %xmm4
732 #endif
733
734         mulps   %xmm6,  %xmm4
735         mulps   %xmm7,  %xmm3
736         addps   %xmm4,  %xmm3
737 #endif
738
739 #if defined(RN) || defined(RT)
740         movaps   0 * SIZE(B), %xmm4
741
742         pshufd   $0x44, %xmm4, %xmm6
743         pshufd   $0x11, %xmm4, %xmm7
744
745         pshufd   $0xa0, %xmm1, %xmm3
746         pshufd   $0xf5, %xmm1, %xmm1
747
748 #ifndef CONJ
749         xorps    %xmm0, %xmm1
750 #else
751         xorps    %xmm0, %xmm3
752 #endif
753
754         mulps   %xmm6,  %xmm3
755         mulps   %xmm7,  %xmm1
756
757         addps   %xmm3,  %xmm1
758 #endif
759
760 #ifdef LN
761         subl    $4 * SIZE, CO1
762 #endif
763
764 #if defined(LN) || defined(LT)
765         movlps  %xmm2,   0 * SIZE(B)
766         movlps  %xmm3,   2 * SIZE(B)
767
768         pshufd  $0x00, %xmm2, %xmm0
769         pshufd  $0x55, %xmm2, %xmm1
770
771         movaps  %xmm0,   0 * SIZE(BB)
772         movaps  %xmm1,   4 * SIZE(BB)
773
774         pshufd  $0x00, %xmm3, %xmm0
775         pshufd  $0x55, %xmm3, %xmm1
776
777         movaps  %xmm0,   8 * SIZE(BB)
778         movaps  %xmm1,  12 * SIZE(BB)
779
780         movlps  %xmm2,   0 * SIZE(CO1)
781         movlps  %xmm3,   2 * SIZE(CO1)
782 #else
783         movaps  %xmm1,   0 * SIZE(AA)
784
785         movlps  %xmm1,   0 * SIZE(CO1)
786         movhps  %xmm1,   2 * SIZE(CO1)
787 #endif
788
789 #ifndef LN
790         addl    $4 * SIZE, CO1
791 #endif
792
793 #if defined(LT) || defined(RN)
794         movl    K,  %eax
795         subl    KK, %eax
796         sall    $1 + ZBASE_SHIFT, %eax
797         addl    %eax, AA
798 #ifdef LT
799         addl    $4 * SIZE, B
800 #endif
801 #endif
802
803 #ifdef LN
804         subl    $2, KK
805         movl    BORIG, B
806 #endif
807
808 #ifdef LT
809         addl    $2, KK
810 #endif
811
812 #ifdef RT
813         movl    K, %eax
814         movl    BORIG, B
815         sall    $1 + ZBASE_SHIFT, %eax
816         addl    %eax, AORIG
817 #endif
818
819         decl    %ebx                    # i --
820         jg      .L110
821         ALIGN_4
822
823 .L130:
824         movl    M,  %ebx
825         andl    $1, %ebx
826         jle     .L149
827
828 #ifdef LN
829        movl     K, %eax
830        sall     $ZBASE_SHIFT, %eax
831        subl     %eax, AORIG
832 #endif
833
834 #if defined(LN) || defined(RT)
835         movl    AORIG, %eax
836         movl    %eax, AA
837
838         movl    KK, %eax
839         sall    $ZBASE_SHIFT, %eax
840         addl    %eax, AA
841 #endif
842
843         leal    BUFFER, BB      # boffset1 = boffset
844
845 #if defined(LN) || defined(RT)
846         movl    KK, %eax
847         sall    $2 + ZBASE_SHIFT, %eax
848         addl    %eax, BB
849 #endif  
850
851 #ifdef  movsd
852         xorps   %xmm0, %xmm0
853 #endif
854         movsd    0 * SIZE(AA), %xmm0
855         xorps   %xmm4, %xmm4
856 #ifdef  movsd
857         xorps   %xmm1, %xmm1
858 #endif
859         movsd    8 * SIZE(AA), %xmm1
860         xorps   %xmm5, %xmm5
861         movaps   0 * SIZE(BB), %xmm2
862         xorps   %xmm6, %xmm6
863         movaps  16 * SIZE(BB), %xmm3
864         xorps   %xmm7, %xmm7
865
866 #if defined(LT) || defined(RN)
867         movl    KK, %eax
868 #else
869         movl    K, %eax
870         subl    KK, %eax
871 #endif
872         sarl    $3, %eax
873         je      .L142
874         ALIGN_4
875
876 .L141:
877         mulps   %xmm0, %xmm2
878         addps   %xmm2, %xmm4
879         movaps   4 * SIZE(BB), %xmm2
880         mulps   %xmm0, %xmm2
881         movsd    2 * SIZE(AA), %xmm0
882         addps   %xmm2, %xmm5
883         movaps   8 * SIZE(BB), %xmm2
884         mulps   %xmm0, %xmm2
885         addps   %xmm2, %xmm6
886         movaps  12 * SIZE(BB), %xmm2
887         mulps   %xmm0, %xmm2
888         movsd    4 * SIZE(AA), %xmm0
889         addps   %xmm2, %xmm7
890         movaps  32 * SIZE(BB), %xmm2
891         mulps   %xmm0, %xmm3
892         addps   %xmm3, %xmm4
893         movaps  20 * SIZE(BB), %xmm3
894         mulps   %xmm0, %xmm3
895         movsd    6 * SIZE(AA), %xmm0
896         addps   %xmm3, %xmm5
897         movaps  24 * SIZE(BB), %xmm3
898         mulps   %xmm0, %xmm3
899         addps   %xmm3, %xmm6
900         movaps  28 * SIZE(BB), %xmm3
901         mulps   %xmm0, %xmm3
902         movsd   16 * SIZE(AA), %xmm0
903         addps   %xmm3, %xmm7
904         movaps  48 * SIZE(BB), %xmm3
905         mulps   %xmm1, %xmm2
906         addps   %xmm2, %xmm4
907         movaps  36 * SIZE(BB), %xmm2
908         mulps   %xmm1, %xmm2
909         movsd   10 * SIZE(AA), %xmm1
910         addps   %xmm2, %xmm5
911         movaps  40 * SIZE(BB), %xmm2
912         mulps   %xmm1, %xmm2
913         addps   %xmm2, %xmm6
914         movaps  44 * SIZE(BB), %xmm2
915         mulps   %xmm1, %xmm2
916         movsd   12 * SIZE(AA), %xmm1
917         addps   %xmm2, %xmm7
918         movaps  64 * SIZE(BB), %xmm2
919         mulps   %xmm1, %xmm3
920         addps   %xmm3, %xmm4
921         movaps  52 * SIZE(BB), %xmm3
922         mulps   %xmm1, %xmm3
923         movsd   14 * SIZE(AA), %xmm1
924         addps   %xmm3, %xmm5
925         movaps  56 * SIZE(BB), %xmm3
926         mulps   %xmm1, %xmm3
927         addps   %xmm3, %xmm6
928         movaps  60 * SIZE(BB), %xmm3
929         mulps   %xmm1, %xmm3
930         movsd   24 * SIZE(AA), %xmm1
931         addps   %xmm3, %xmm7
932         movaps  80 * SIZE(BB), %xmm3
933
934         addl    $ 16 * SIZE, AA
935         addl    $ 64 * SIZE, BB
936         decl    %eax
937         jne     .L141
938         ALIGN_4
939         
940 .L142:
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 .L144
950         ALIGN_4
951
952 .L143:
953         mulps   %xmm0, %xmm2
954         mulps    4 * SIZE(BB), %xmm0
955         addps   %xmm2, %xmm4
956         movaps   8 * SIZE(BB), %xmm2
957         addps   %xmm0, %xmm5
958         movsd    2 * SIZE(AA), %xmm0
959
960         addl    $2 * SIZE, AA
961         addl    $8 * SIZE, BB
962         decl    %eax
963         jg      .L143
964         ALIGN_4
965
966 .L144:
967         addps   %xmm6, %xmm4
968         addps   %xmm7, %xmm5
969
970         movaps  POSINV,  %xmm0
971
972         shufps  $0xb1, %xmm5, %xmm5
973
974 #if defined(LN) || defined(LT)
975 #ifndef CONJ
976         xorps    %xmm0, %xmm5
977 #else
978         xorps    %xmm0, %xmm4
979 #endif
980 #else
981         xorps    %xmm0, %xmm5
982 #endif
983
984         addps   %xmm5, %xmm4
985
986 #if defined(LN) || defined(RT)
987         movl    KK, %eax
988         subl    $1, %eax
989
990         movl    AORIG, AA
991         movl    BORIG, B
992         leal    BUFFER, BB
993
994         sall    $ZBASE_SHIFT, %eax
995         addl    %eax, AA
996         addl    %eax, B
997         leal    (BB, %eax, 4), BB
998 #endif
999
1000 #if defined(LN) || defined(LT)
1001 #ifdef  movsd
1002         xorps   %xmm2, %xmm2
1003 #endif
1004         movsd    0 * SIZE(B), %xmm2
1005
1006         subps   %xmm4,  %xmm2
1007 #else
1008 #ifdef  movsd
1009         xorps   %xmm1, %xmm1
1010 #endif
1011         movsd    0 * SIZE(AA), %xmm1
1012
1013         subps   %xmm4,  %xmm1
1014 #endif
1015
1016 #if defined(LN) || defined(LT)
1017         movaps   0 * SIZE(AA), %xmm5
1018
1019         pshufd   $0x44, %xmm5, %xmm6
1020         pshufd   $0x11, %xmm5, %xmm7
1021
1022         pshufd   $0xa0, %xmm2, %xmm4
1023         pshufd   $0xf5, %xmm2, %xmm2
1024
1025 #ifndef CONJ
1026         xorps    %xmm0, %xmm2
1027 #else
1028         xorps    %xmm0, %xmm4
1029 #endif
1030
1031         mulps   %xmm6,  %xmm4
1032         mulps   %xmm7,  %xmm2
1033         addps   %xmm4,  %xmm2
1034 #endif
1035
1036 #if defined(RN) || defined(RT)
1037         movaps   0 * SIZE(B), %xmm4
1038
1039         pshufd   $0x44, %xmm4, %xmm6
1040         pshufd   $0x11, %xmm4, %xmm7
1041
1042         pshufd   $0xa0, %xmm1, %xmm3
1043         pshufd   $0xf5, %xmm1, %xmm1
1044
1045 #ifndef CONJ
1046         xorps    %xmm0, %xmm1
1047 #else
1048         xorps    %xmm0, %xmm3
1049 #endif
1050
1051         mulps   %xmm6,  %xmm3
1052         mulps   %xmm7,  %xmm1
1053
1054         addps   %xmm3,  %xmm1
1055 #endif
1056
1057 #ifdef LN
1058         subl    $2 * SIZE, CO1
1059 #endif
1060
1061 #if defined(LN) || defined(LT)
1062         movlps  %xmm2,   0 * SIZE(B)
1063
1064         pshufd  $0x00, %xmm2, %xmm0
1065         pshufd  $0x55, %xmm2, %xmm1
1066
1067         movaps  %xmm0,   0 * SIZE(BB)
1068         movaps  %xmm1,   4 * SIZE(BB)
1069
1070         movlps  %xmm2,   0 * SIZE(CO1)
1071 #else
1072         movlps  %xmm1,   0 * SIZE(AA)
1073
1074         movlps  %xmm1,   0 * SIZE(CO1)
1075 #endif
1076
1077 #ifndef LN
1078         addl    $2 * SIZE, CO1
1079 #endif
1080
1081 #if defined(LT) || defined(RN)
1082         movl    K,  %eax
1083         subl    KK, %eax
1084         sall    $ZBASE_SHIFT, %eax
1085         addl    %eax, AA
1086 #ifdef LT
1087         addl    $2 * SIZE, B
1088 #endif
1089 #endif
1090
1091 #ifdef LN
1092         subl    $1, KK
1093         movl    BORIG, B
1094 #endif
1095
1096 #ifdef LT
1097         addl    $1, KK
1098 #endif
1099
1100 #ifdef RT
1101         movl    K, %eax
1102         movl    BORIG, B
1103         sall    $ZBASE_SHIFT, %eax
1104         addl    %eax, AORIG
1105 #endif
1106         ALIGN_4
1107
1108 .L149:
1109 #ifdef LN
1110        movl     K, %eax
1111        sall     $ZBASE_SHIFT, %eax
1112        addl     %eax, B
1113 #endif
1114
1115 #if defined(LT) || defined(RN)
1116         movl    K,  %eax
1117         subl    KK, %eax
1118         sall    $ZBASE_SHIFT, %eax
1119         addl    %eax, B
1120 #endif
1121
1122 #ifdef RN
1123         addl    $1, KK
1124 #endif
1125
1126 #ifdef RT
1127         subl    $1, KK
1128 #endif
1129         ALIGN_4
1130
1131 .L100:
1132         movl    N, %eax
1133         movl    %eax, J
1134         sarl    $1, J
1135         jle     .L999
1136         ALIGN_4
1137
1138 .L01:
1139 #ifdef LN
1140         movl    OFFSET, %eax
1141         addl    M, %eax
1142         movl    %eax, KK
1143 #endif  
1144
1145         leal    BUFFER, %ecx
1146
1147 #ifdef RT
1148        movl     K, %eax
1149        sall     $1 + ZBASE_SHIFT, %eax
1150        subl     %eax, B
1151 #endif
1152
1153 #if defined(LN) || defined(RT)
1154         movl    KK, %eax
1155         movl    B, BORIG
1156         sall    $1 + ZBASE_SHIFT, %eax
1157         addl    %eax, B
1158         leal    (BB, %eax, 4), BB
1159 #endif  
1160
1161 #if defined(LT)
1162         movl    OFFSET, %eax
1163         movl    %eax, KK
1164 #endif
1165
1166 #if defined(LT) || defined(RN)
1167         movl    KK, %eax
1168 #else
1169         movl    K,  %eax
1170         subl    KK, %eax
1171 #endif
1172         sarl    $1, %eax
1173         jle     .L03
1174         ALIGN_4
1175
1176 .L02:
1177         movaps   0 * SIZE(B), %xmm3
1178         movaps   4 * SIZE(B), %xmm7
1179
1180         pshufd   $0x00, %xmm3, %xmm0
1181         pshufd   $0x55, %xmm3, %xmm1
1182         pshufd   $0xaa, %xmm3, %xmm2
1183         pshufd   $0xff, %xmm3, %xmm3
1184
1185         movaps  %xmm0,  0 * SIZE(BB)
1186         movaps  %xmm1,  4 * SIZE(BB)
1187         movaps  %xmm2,  8 * SIZE(BB)
1188         movaps  %xmm3, 12 * SIZE(BB)
1189
1190         pshufd   $0x00, %xmm7, %xmm4
1191         pshufd   $0x55, %xmm7, %xmm5
1192         pshufd   $0xaa, %xmm7, %xmm6
1193         pshufd   $0xff, %xmm7, %xmm7
1194
1195         movaps  %xmm4, 16 * SIZE(BB)
1196         movaps  %xmm5, 20 * SIZE(BB)
1197         movaps  %xmm6, 24 * SIZE(BB)
1198         movaps  %xmm7, 28 * SIZE(BB)
1199
1200         addl    $ 8 * SIZE, B
1201         addl    $32 * SIZE, BB
1202
1203         decl    %eax
1204         jne     .L02
1205         ALIGN_4
1206
1207 .L03:
1208 #if defined(LT) || defined(RN)
1209         movl    KK, %eax
1210 #else
1211         movl    K, %eax
1212         subl    KK, %eax
1213 #endif
1214         andl    $1, %eax
1215         BRANCH
1216         jle     .L05
1217         ALIGN_4
1218
1219 .L04:
1220         movaps   0 * SIZE(B), %xmm3
1221
1222         pshufd   $0x00, %xmm3, %xmm0
1223         pshufd   $0x55, %xmm3, %xmm1
1224         pshufd   $0xaa, %xmm3, %xmm2
1225         pshufd   $0xff, %xmm3, %xmm3
1226
1227         movaps  %xmm0,  0 * SIZE(BB)
1228         movaps  %xmm1,  4 * SIZE(BB)
1229         movaps  %xmm2,  8 * SIZE(BB)
1230         movaps  %xmm3, 12 * SIZE(BB)
1231
1232         addl    $ 4 * SIZE, B
1233         ALIGN_4
1234
1235 .L05:
1236 #if defined(LT) || defined(RN)
1237         movl    A, %eax
1238         movl    %eax, AA
1239 #else
1240         movl    A, %eax
1241         movl    %eax, AORIG
1242 #endif
1243
1244        leal     (, LDC, 2), %eax
1245
1246 #ifdef RT
1247        subl     %eax, C
1248 #endif
1249
1250         movl    C,  CO1
1251
1252 #ifndef RT
1253         addl    %eax, C
1254 #endif
1255
1256         movl    M,  %ebx
1257         sarl    $1, %ebx
1258         jle     .L30
1259         ALIGN_4
1260
1261 .L10:
1262 #ifdef LN
1263        movl     K, %eax
1264        sall     $1 + ZBASE_SHIFT, %eax
1265        subl     %eax, AORIG
1266 #endif
1267
1268 #if defined(LN) || defined(RT)
1269         movl    AORIG, %eax
1270         movl    %eax, AA
1271
1272         movl    KK, %eax
1273         sall    $1 + ZBASE_SHIFT, %eax
1274         addl    %eax, AA
1275 #endif
1276
1277         leal    BUFFER, BB      # boffset1 = boffset
1278
1279 #if defined(LN) || defined(RT)
1280         movl    KK, %eax
1281         sall    $3 + ZBASE_SHIFT, %eax
1282         addl    %eax, BB
1283 #endif  
1284
1285         movaps   0 * SIZE(AA), %xmm0
1286         xorps   %xmm4, %xmm4
1287         movaps  16 * SIZE(AA), %xmm1
1288         xorps   %xmm5, %xmm5
1289         movaps   0 * SIZE(BB), %xmm2
1290         xorps   %xmm6, %xmm6
1291         movaps  16 * SIZE(BB), %xmm3
1292         xorps   %xmm7, %xmm7
1293
1294         PREFETCHW   3 * SIZE(CO1)
1295         PREFETCHW   3 * SIZE(CO1, LDC)
1296
1297 #if defined(LT) || defined(RN)
1298         movl    KK, %eax
1299 #else
1300         movl    K, %eax
1301         subl    KK, %eax
1302 #endif
1303         sarl    $3, %eax
1304         je      .L15
1305         ALIGN_4
1306
1307 .L11:
1308         KERNEL1(0 * 16)
1309         KERNEL2(0 * 16)
1310         KERNEL3(0 * 16)
1311         KERNEL4(0 * 16)
1312         KERNEL5(0 * 16)
1313         KERNEL6(0 * 16)
1314         KERNEL7(0 * 16)
1315         KERNEL8(0 * 16)
1316
1317         addl    $ 32 * SIZE, AA
1318         addl    $128 * SIZE, BB
1319         decl   %eax
1320         jne    .L11
1321         ALIGN_4
1322         
1323 .L15:
1324 #if defined(LT) || defined(RN)
1325         movl    KK, %eax
1326 #else
1327         movl    K,  %eax
1328         subl    KK, %eax
1329 #endif
1330         andl    $7, %eax                # if (k & 1)
1331         BRANCH
1332         je .L14
1333         ALIGN_4
1334
1335 .L13:
1336         mulps   %xmm0, %xmm2
1337         addps   %xmm2, %xmm4
1338         movaps   4 * SIZE(BB), %xmm2
1339         mulps   %xmm0, %xmm2
1340         addps   %xmm2, %xmm5
1341         movaps   8 * SIZE(BB), %xmm2
1342         mulps   %xmm0, %xmm2
1343         mulps   12 * SIZE(BB), %xmm0
1344         addps   %xmm2, %xmm6
1345         movaps  16 * SIZE(BB), %xmm2
1346         addps   %xmm0, %xmm7
1347         movaps   4 * SIZE(AA), %xmm0
1348
1349         addl    $ 4 * SIZE, AA
1350         addl    $16 * SIZE, BB
1351         decl    %eax
1352         jg      .L13
1353         ALIGN_4
1354
1355 .L14:
1356         movaps  POSINV,  %xmm0
1357
1358         shufps  $0xb1, %xmm5, %xmm5
1359         shufps  $0xb1, %xmm7, %xmm7
1360
1361 #if defined(LN) || defined(LT)
1362 #ifndef CONJ
1363         xorps    %xmm0, %xmm5
1364         xorps    %xmm0, %xmm7
1365 #else
1366         xorps    %xmm0, %xmm4
1367         xorps    %xmm0, %xmm6
1368 #endif
1369 #else
1370         xorps    %xmm0, %xmm5
1371         xorps    %xmm0, %xmm7
1372 #endif
1373
1374         addps   %xmm5, %xmm4
1375         addps   %xmm7, %xmm6
1376
1377 #if defined(LN) || defined(RT)
1378         movl    KK, %eax
1379 #ifdef LN
1380         subl    $2, %eax
1381 #else
1382         subl    $2, %eax
1383 #endif
1384
1385         movl    AORIG, AA
1386         movl    BORIG, B
1387         leal    BUFFER, BB
1388
1389         sall    $ZBASE_SHIFT, %eax
1390         leal    (AA, %eax, 2), AA
1391         leal    (B,  %eax, 2), B
1392         leal    (BB, %eax, 8), BB
1393 #endif
1394
1395 #if defined(LN) || defined(LT)
1396         movaps  %xmm4, %xmm5
1397         unpcklpd %xmm6, %xmm4
1398         unpckhpd %xmm6, %xmm5
1399
1400         movaps   0 * SIZE(B), %xmm2
1401         movaps   4 * SIZE(B), %xmm3
1402
1403         subps   %xmm4,  %xmm2
1404         subps   %xmm5,  %xmm3
1405 #else
1406         movaps   0 * SIZE(AA), %xmm1
1407         movaps   4 * SIZE(AA), %xmm5
1408
1409         subps   %xmm4,  %xmm1
1410         subps   %xmm6,  %xmm5
1411 #endif
1412
1413 #ifdef LN
1414         movaps   4 * SIZE(AA), %xmm5
1415
1416         pshufd   $0xee, %xmm5, %xmm6
1417         pshufd   $0xbb, %xmm5, %xmm7
1418
1419         pshufd   $0xa0, %xmm3, %xmm4
1420         pshufd   $0xf5, %xmm3, %xmm3
1421
1422 #ifndef CONJ
1423         xorps    %xmm0, %xmm3
1424 #else
1425         xorps    %xmm0, %xmm4
1426 #endif
1427
1428         mulps   %xmm6,  %xmm4
1429         mulps   %xmm7, %xmm3
1430         addps   %xmm4,  %xmm3
1431
1432         pshufd   $0x44, %xmm5, %xmm6
1433         pshufd   $0x11, %xmm5, %xmm7
1434
1435         pshufd   $0xa0, %xmm3, %xmm4
1436         pshufd   $0xf5, %xmm3, %xmm1
1437
1438 #ifndef CONJ
1439         xorps    %xmm0, %xmm1
1440 #else
1441         xorps    %xmm0, %xmm4
1442 #endif
1443
1444         mulps   %xmm6,  %xmm4
1445         mulps   %xmm7, %xmm1
1446         subps   %xmm4,  %xmm2
1447         subps   %xmm1,  %xmm2
1448
1449         movaps   0 * SIZE(AA), %xmm5
1450
1451         pshufd   $0x44, %xmm5, %xmm6
1452         pshufd   $0x11, %xmm5, %xmm7
1453
1454         pshufd   $0xa0, %xmm2, %xmm4
1455         pshufd   $0xf5, %xmm2, %xmm2
1456
1457 #ifndef CONJ
1458         xorps    %xmm0, %xmm2
1459 #else
1460         xorps    %xmm0, %xmm4
1461 #endif
1462
1463         mulps   %xmm6,  %xmm4
1464         mulps   %xmm7, %xmm2
1465         addps   %xmm4,  %xmm2
1466 #endif
1467
1468 #ifdef LT
1469         movaps   0 * SIZE(AA), %xmm5
1470
1471         pshufd   $0x44, %xmm5, %xmm6
1472         pshufd   $0x11, %xmm5, %xmm7
1473
1474         pshufd   $0xa0, %xmm2, %xmm4
1475         pshufd   $0xf5, %xmm2, %xmm2
1476
1477 #ifndef CONJ
1478         xorps    %xmm0, %xmm2
1479 #else
1480         xorps    %xmm0, %xmm4
1481 #endif
1482
1483         mulps   %xmm6,  %xmm4
1484         mulps   %xmm7, %xmm2
1485         addps   %xmm4,  %xmm2
1486
1487         pshufd   $0xee, %xmm5, %xmm6
1488         pshufd   $0xbb, %xmm5, %xmm7
1489
1490         pshufd   $0xa0, %xmm2, %xmm4
1491         pshufd   $0xf5, %xmm2, %xmm1
1492
1493 #ifndef CONJ
1494         xorps    %xmm0, %xmm1
1495 #else
1496         xorps    %xmm0, %xmm4
1497 #endif
1498
1499         mulps   %xmm6,  %xmm4
1500         mulps   %xmm7, %xmm1
1501         subps   %xmm4,  %xmm3
1502         subps   %xmm1,  %xmm3
1503
1504         movaps   4 * SIZE(AA), %xmm5
1505
1506         pshufd   $0xee, %xmm5, %xmm6
1507         pshufd   $0xbb, %xmm5, %xmm7
1508
1509         pshufd   $0xa0, %xmm3, %xmm4
1510         pshufd   $0xf5, %xmm3, %xmm3
1511
1512 #ifndef CONJ
1513         xorps    %xmm0, %xmm3
1514 #else
1515         xorps    %xmm0, %xmm4
1516 #endif
1517
1518         mulps   %xmm6,  %xmm4
1519         mulps   %xmm7,  %xmm3
1520         addps   %xmm4,  %xmm3
1521 #endif
1522
1523 #ifdef RN
1524         movaps   0 * SIZE(B), %xmm4
1525
1526         pshufd   $0x44, %xmm4, %xmm6
1527         pshufd   $0x11, %xmm4, %xmm7
1528
1529         pshufd   $0xa0, %xmm1, %xmm3
1530         pshufd   $0xf5, %xmm1, %xmm1
1531
1532 #ifndef CONJ
1533         xorps    %xmm0, %xmm1
1534 #else
1535         xorps    %xmm0, %xmm3
1536 #endif
1537
1538         mulps   %xmm6,  %xmm3
1539         mulps   %xmm7,  %xmm1
1540
1541         addps   %xmm3,  %xmm1
1542
1543         pshufd   $0xee, %xmm4, %xmm6
1544         pshufd   $0xbb, %xmm4, %xmm7
1545
1546         pshufd   $0xa0, %xmm1, %xmm3
1547         pshufd   $0xf5, %xmm1, %xmm2
1548
1549 #ifndef CONJ
1550         xorps    %xmm0, %xmm2
1551 #else
1552         xorps    %xmm0, %xmm3
1553 #endif
1554
1555         mulps   %xmm6,  %xmm3
1556         mulps   %xmm7,  %xmm2
1557
1558         subps   %xmm3,  %xmm5
1559         subps   %xmm2,  %xmm5
1560
1561         movaps   4 * SIZE(B), %xmm4
1562
1563         pshufd   $0xee, %xmm4, %xmm6
1564         pshufd   $0xbb, %xmm4, %xmm7
1565
1566         pshufd   $0xa0, %xmm5, %xmm3
1567         pshufd   $0xf5, %xmm5, %xmm5
1568
1569 #ifndef CONJ
1570         xorps    %xmm0, %xmm5
1571 #else
1572         xorps    %xmm0, %xmm3
1573 #endif
1574
1575         mulps   %xmm6,  %xmm3
1576         mulps   %xmm7,  %xmm5
1577
1578         addps   %xmm3,  %xmm5
1579 #endif
1580
1581 #ifdef RT
1582         movaps   4 * SIZE(B), %xmm4
1583
1584         pshufd   $0xee, %xmm4, %xmm6
1585         pshufd   $0xbb, %xmm4, %xmm7
1586
1587         pshufd   $0xa0, %xmm5, %xmm3
1588         pshufd   $0xf5, %xmm5, %xmm5
1589
1590 #ifndef CONJ
1591         xorps    %xmm0, %xmm5
1592 #else
1593         xorps    %xmm0, %xmm3
1594 #endif
1595
1596         mulps   %xmm6,  %xmm3
1597         mulps   %xmm7,  %xmm5
1598
1599         addps   %xmm3,  %xmm5
1600
1601         pshufd   $0x44, %xmm4, %xmm6
1602         pshufd   $0x11, %xmm4, %xmm7
1603
1604         pshufd   $0xa0, %xmm5, %xmm3
1605         pshufd   $0xf5, %xmm5, %xmm2
1606
1607 #ifndef CONJ
1608         xorps    %xmm0, %xmm2
1609 #else
1610         xorps    %xmm0, %xmm3
1611 #endif
1612
1613         mulps   %xmm6,  %xmm3
1614         mulps   %xmm7,  %xmm2
1615
1616         subps   %xmm3,  %xmm1
1617         subps   %xmm2,  %xmm1
1618
1619         movaps   0 * SIZE(B), %xmm4
1620
1621         pshufd   $0x44, %xmm4, %xmm6
1622         pshufd   $0x11, %xmm4, %xmm7
1623
1624         pshufd   $0xa0, %xmm1, %xmm3
1625         pshufd   $0xf5, %xmm1, %xmm1
1626
1627 #ifndef CONJ
1628         xorps    %xmm0, %xmm1
1629 #else
1630         xorps    %xmm0, %xmm3
1631 #endif
1632
1633         mulps   %xmm6,  %xmm3
1634         mulps   %xmm7,  %xmm1
1635
1636         addps   %xmm3,  %xmm1
1637 #endif
1638
1639 #ifdef LN
1640         subl    $4 * SIZE, CO1
1641 #endif
1642
1643 #if defined(LN) || defined(LT)
1644         movaps  %xmm2,   0 * SIZE(B)
1645         movaps  %xmm3,   4 * SIZE(B)
1646
1647         pshufd  $0x00, %xmm2, %xmm0
1648         pshufd  $0x55, %xmm2, %xmm1
1649         pshufd  $0xaa, %xmm2, %xmm4
1650         pshufd  $0xff, %xmm2, %xmm5
1651
1652         movaps  %xmm0,   0 * SIZE(BB)
1653         movaps  %xmm1,   4 * SIZE(BB)
1654         movaps  %xmm4,   8 * SIZE(BB)
1655         movaps  %xmm5,  12 * SIZE(BB)
1656
1657         pshufd  $0x00, %xmm3, %xmm0
1658         pshufd  $0x55, %xmm3, %xmm1
1659         pshufd  $0xaa, %xmm3, %xmm4
1660         pshufd  $0xff, %xmm3, %xmm5
1661
1662         movaps  %xmm0,  16 * SIZE(BB)
1663         movaps  %xmm1,  20 * SIZE(BB)
1664         movaps  %xmm4,  24 * SIZE(BB)
1665         movaps  %xmm5,  28 * SIZE(BB)
1666
1667         movlps  %xmm2,   0 * SIZE(CO1)
1668         movlps  %xmm3,   2 * SIZE(CO1)
1669         movhps  %xmm2,   0 * SIZE(CO1, LDC)
1670         movhps  %xmm3,   2 * SIZE(CO1, LDC)
1671 #else
1672         movaps  %xmm1,   0 * SIZE(AA)
1673         movaps  %xmm5,   4 * SIZE(AA)
1674
1675         movlps  %xmm1,   0 * SIZE(CO1)
1676         movhps  %xmm1,   2 * SIZE(CO1)
1677
1678         movlps  %xmm5,   0 * SIZE(CO1, LDC)
1679         movhps  %xmm5,   2 * SIZE(CO1, LDC)
1680 #endif
1681
1682 #ifndef LN
1683         addl    $4 * SIZE, CO1
1684 #endif
1685
1686 #if defined(LT) || defined(RN)
1687         movl    K,  %eax
1688         subl    KK, %eax
1689         sall    $1 + ZBASE_SHIFT, %eax
1690         addl    %eax, AA
1691 #ifdef LT
1692         addl    $8 * SIZE, B
1693 #endif
1694 #endif
1695
1696 #ifdef LN
1697         subl    $2, KK
1698         movl    BORIG, B
1699 #endif
1700
1701 #ifdef LT
1702         addl    $2, KK
1703 #endif
1704
1705 #ifdef RT
1706         movl    K, %eax
1707         movl    BORIG, B
1708         sall    $1 + ZBASE_SHIFT, %eax
1709         addl    %eax, AORIG
1710 #endif
1711
1712         decl    %ebx
1713         jg      .L10
1714         ALIGN_4
1715
1716 .L30:
1717         movl    M,  %ebx
1718         andl    $1, %ebx
1719         jle     .L99
1720         ALIGN_4
1721
1722 .L40:
1723 #ifdef LN
1724        movl     K, %eax
1725        sall     $ZBASE_SHIFT, %eax
1726        subl     %eax, AORIG
1727 #endif
1728
1729 #if defined(LN) || defined(RT)
1730         movl    AORIG, %eax
1731         movl    %eax, AA
1732
1733         movl    KK, %eax
1734         sall    $ZBASE_SHIFT, %eax
1735         addl    %eax, AA
1736 #endif
1737
1738         leal    BUFFER, BB      # boffset1 = boffset
1739
1740 #if defined(LN) || defined(RT)
1741         movl    KK, %eax
1742         sall    $3 + ZBASE_SHIFT, %eax
1743         addl    %eax, BB
1744 #endif  
1745
1746         xorps   %xmm4, %xmm4
1747         xorps   %xmm5, %xmm5
1748         xorps   %xmm6, %xmm6
1749         xorps   %xmm7, %xmm7
1750
1751 #ifdef  movsd
1752         xorps   %xmm0, %xmm0
1753 #endif
1754         movsd    0 * SIZE(AA), %xmm0
1755 #ifdef  movsd
1756         xorps   %xmm1, %xmm1
1757 #endif
1758         movsd    8 * SIZE(AA), %xmm1
1759         movaps   0 * SIZE(BB), %xmm2
1760         movaps  16 * SIZE(BB), %xmm3
1761
1762 #if defined(LT) || defined(RN)
1763         movl    KK, %eax
1764 #else
1765         movl    K, %eax
1766         subl    KK, %eax
1767 #endif
1768         sarl    $3, %eax
1769         je      .L42
1770         ALIGN_4
1771
1772 .L41:
1773         mulps   %xmm0, %xmm2
1774         prefetcht1      (PREFETCHSIZE +  0) * SIZE(AA)
1775         addps   %xmm2, %xmm4
1776         movaps   4 * SIZE(BB), %xmm2
1777         mulps   %xmm0, %xmm2
1778         addps   %xmm2, %xmm5
1779         movaps   8 * SIZE(BB), %xmm2
1780         mulps   %xmm0, %xmm2
1781         mulps   12 * SIZE(BB), %xmm0
1782         addps   %xmm2, %xmm6
1783         movaps  32 * SIZE(BB), %xmm2
1784         addps   %xmm0, %xmm7
1785         movsd    2 * SIZE(AA), %xmm0
1786         mulps   %xmm0, %xmm3
1787         addps   %xmm3, %xmm4
1788         movaps  20 * SIZE(BB), %xmm3
1789         mulps   %xmm0, %xmm3
1790         addps   %xmm3, %xmm5
1791         movaps  24 * SIZE(BB), %xmm3
1792         mulps   %xmm0, %xmm3
1793         mulps   28 * SIZE(BB), %xmm0
1794         addps   %xmm3, %xmm6
1795         movaps  48 * SIZE(BB), %xmm3
1796         addps   %xmm0, %xmm7
1797         movsd    4 * SIZE(AA), %xmm0
1798         mulps   %xmm0, %xmm2
1799         addps   %xmm2, %xmm4
1800         movaps  36 * SIZE(BB), %xmm2
1801         mulps   %xmm0, %xmm2
1802         addps   %xmm2, %xmm5
1803         movaps  40 * SIZE(BB), %xmm2
1804         mulps   %xmm0, %xmm2
1805         mulps   44 * SIZE(BB), %xmm0
1806         addps   %xmm2, %xmm6
1807         movaps  64 * SIZE(BB), %xmm2
1808         addps   %xmm0, %xmm7
1809         movsd    6 * SIZE(AA), %xmm0
1810         mulps   %xmm0, %xmm3
1811         addps   %xmm3, %xmm4
1812         movaps  52 * SIZE(BB), %xmm3
1813         mulps   %xmm0, %xmm3
1814         addps   %xmm3, %xmm5
1815         movaps  56 * SIZE(BB), %xmm3
1816         mulps   %xmm0, %xmm3
1817         mulps   60 * SIZE(BB), %xmm0
1818         addps   %xmm3, %xmm6
1819         movaps  80 * SIZE(BB), %xmm3
1820         addps   %xmm0, %xmm7
1821         movsd   16 * SIZE(AA), %xmm0
1822         mulps   %xmm1, %xmm2
1823 #if defined(OPTERON) || defined(BARCELONA) || defined(BOBCAT) || defined(BARCELONA_OPTIMIZATION)
1824         prefetcht1     (PREFETCHSIZE + 16) * SIZE(AA)
1825 #endif
1826         addps   %xmm2, %xmm4
1827         movaps  68 * SIZE(BB), %xmm2
1828         mulps   %xmm1, %xmm2
1829         addps   %xmm2, %xmm5
1830         movaps  72 * SIZE(BB), %xmm2
1831         mulps   %xmm1, %xmm2
1832         mulps   76 * SIZE(BB), %xmm1
1833         addps   %xmm2, %xmm6
1834         movaps  96 * SIZE(BB), %xmm2
1835         addps   %xmm1, %xmm7
1836         movsd   10 * SIZE(AA), %xmm1
1837         mulps   %xmm1, %xmm3
1838         addps   %xmm3, %xmm4
1839         movaps  84 * SIZE(BB), %xmm3
1840         mulps   %xmm1, %xmm3
1841         addps   %xmm3, %xmm5
1842         movaps  88 * SIZE(BB), %xmm3
1843         mulps   %xmm1, %xmm3
1844         mulps   92 * SIZE(BB), %xmm1
1845         addps   %xmm3, %xmm6
1846         movaps  112 * SIZE(BB), %xmm3
1847         addps   %xmm1, %xmm7
1848         movsd   12 * SIZE(AA), %xmm1
1849         mulps   %xmm1, %xmm2
1850         addps   %xmm2, %xmm4
1851         movaps  100 * SIZE(BB), %xmm2
1852         mulps   %xmm1, %xmm2
1853         addps   %xmm2, %xmm5
1854         movaps  104 * SIZE(BB), %xmm2
1855         mulps   %xmm1, %xmm2
1856         mulps   108 * SIZE(BB), %xmm1
1857         addps   %xmm2, %xmm6
1858         movaps  128 * SIZE(BB), %xmm2
1859         addps   %xmm1, %xmm7
1860         movsd   14 * SIZE(AA), %xmm1
1861         mulps   %xmm1, %xmm3
1862         addps   %xmm3, %xmm4
1863         movaps  116 * SIZE(BB), %xmm3
1864         mulps   %xmm1, %xmm3
1865         addps   %xmm3, %xmm5
1866         movaps  120 * SIZE(BB), %xmm3
1867         mulps   %xmm1, %xmm3
1868         mulps   124 * SIZE(BB), %xmm1
1869         addps   %xmm3, %xmm6
1870         movaps  144 * SIZE(BB), %xmm3
1871         addps   %xmm1, %xmm7
1872         movsd    24 * SIZE(AA), %xmm1
1873         addl    $ 16 * SIZE, AA
1874         addl    $128 * SIZE, BB
1875         decl    %eax
1876         jne     .L41
1877         ALIGN_4
1878         
1879 .L42:
1880 #if defined(LT) || defined(RN)
1881         movl    KK, %eax
1882 #else
1883         movl    K,  %eax
1884         subl    KK, %eax
1885 #endif
1886         andl    $7, %eax                # if (k & 1)
1887         BRANCH
1888         je .L44
1889         ALIGN_4
1890
1891 .L43:
1892         mulps   %xmm0, %xmm2
1893         addps   %xmm2, %xmm4
1894         movaps   4 * SIZE(BB), %xmm2
1895         mulps   %xmm0, %xmm2
1896         addps   %xmm2, %xmm5
1897         movaps   8 * SIZE(BB), %xmm2
1898         mulps   %xmm0, %xmm2
1899         mulps   12 * SIZE(BB), %xmm0
1900         addps   %xmm2, %xmm6
1901         movaps  16 * SIZE(BB), %xmm2
1902         addps   %xmm0, %xmm7
1903         movsd    2 * SIZE(AA), %xmm0
1904
1905         addl    $ 2 * SIZE, AA
1906         addl    $16 * SIZE, BB
1907         decl    %eax
1908         jg      .L43
1909         ALIGN_4
1910
1911 .L44:
1912         movaps  POSINV,  %xmm0
1913
1914         shufps  $0xb1, %xmm5, %xmm5
1915         shufps  $0xb1, %xmm7, %xmm7
1916
1917 #if defined(LN) || defined(LT)
1918 #ifndef CONJ
1919         xorps    %xmm0, %xmm5
1920         xorps    %xmm0, %xmm7
1921 #else
1922         xorps    %xmm0, %xmm4
1923         xorps    %xmm0, %xmm6
1924 #endif
1925 #else
1926         xorps    %xmm0, %xmm5
1927         xorps    %xmm0, %xmm7
1928 #endif
1929
1930         addps   %xmm5, %xmm4
1931         addps   %xmm7, %xmm6
1932
1933 #if defined(LN) || defined(RT)
1934         movl    KK, %eax
1935 #ifdef LN
1936         subl    $1, %eax
1937 #else
1938         subl    $2, %eax
1939 #endif
1940
1941         movl    AORIG, AA
1942         movl    BORIG, B
1943         leal    BUFFER, BB
1944
1945         sall    $ZBASE_SHIFT, %eax
1946         leal    (AA, %eax, 1), AA
1947         leal    (B,  %eax, 2), B
1948         leal    (BB, %eax, 8), BB
1949 #endif
1950
1951 #if defined(LN) || defined(LT)
1952         unpcklpd %xmm6, %xmm4
1953
1954         movaps   0 * SIZE(B), %xmm2
1955
1956         subps   %xmm4,  %xmm2
1957 #else
1958 #ifdef  movsd
1959         xorps   %xmm1, %xmm1
1960 #endif
1961         movsd    0 * SIZE(AA), %xmm1
1962 #ifdef  movsd
1963         xorps   %xmm5, %xmm5
1964 #endif
1965         movsd    2 * SIZE(AA), %xmm5
1966
1967         subps   %xmm4,  %xmm1
1968         subps   %xmm6,  %xmm5
1969 #endif
1970
1971 #if defined(LN) || defined(LT)
1972         movaps   0 * SIZE(AA), %xmm5
1973
1974         pshufd   $0x44, %xmm5, %xmm6
1975         pshufd   $0x11, %xmm5, %xmm7
1976
1977         pshufd   $0xa0, %xmm2, %xmm4
1978         pshufd   $0xf5, %xmm2, %xmm2
1979
1980 #ifndef CONJ
1981         xorps    %xmm0, %xmm2
1982 #else
1983         xorps    %xmm0, %xmm4
1984 #endif
1985
1986         mulps   %xmm6,  %xmm4
1987         mulps   %xmm7,  %xmm2
1988         addps   %xmm4,  %xmm2
1989 #endif
1990
1991 #ifdef RN
1992         movaps   0 * SIZE(B), %xmm4
1993
1994         pshufd   $0x44, %xmm4, %xmm6
1995         pshufd   $0x11, %xmm4, %xmm7
1996
1997         pshufd   $0xa0, %xmm1, %xmm3
1998         pshufd   $0xf5, %xmm1, %xmm1
1999
2000 #ifndef CONJ
2001         xorps    %xmm0, %xmm1
2002 #else
2003         xorps    %xmm0, %xmm3
2004 #endif
2005
2006         mulps   %xmm6,  %xmm3
2007         mulps   %xmm7,  %xmm1
2008
2009         addps   %xmm3,  %xmm1
2010
2011         pshufd   $0xee, %xmm4, %xmm6
2012         pshufd   $0xbb, %xmm4, %xmm7
2013
2014         pshufd   $0xa0, %xmm1, %xmm3
2015         pshufd   $0xf5, %xmm1, %xmm2
2016
2017 #ifndef CONJ
2018         xorps    %xmm0, %xmm2
2019 #else
2020         xorps    %xmm0, %xmm3
2021 #endif
2022
2023         mulps   %xmm6,  %xmm3
2024         mulps   %xmm7,  %xmm2
2025
2026         subps   %xmm3,  %xmm5
2027         subps   %xmm2,  %xmm5
2028
2029         movaps   4 * SIZE(B), %xmm4
2030
2031         pshufd   $0xee, %xmm4, %xmm6
2032         pshufd   $0xbb, %xmm4, %xmm7
2033
2034         pshufd   $0xa0, %xmm5, %xmm3
2035         pshufd   $0xf5, %xmm5, %xmm5
2036
2037 #ifndef CONJ
2038         xorps    %xmm0, %xmm5
2039 #else
2040         xorps    %xmm0, %xmm3
2041 #endif
2042
2043         mulps   %xmm6,  %xmm3
2044         mulps   %xmm7,  %xmm5
2045
2046         addps   %xmm3,  %xmm5
2047 #endif
2048
2049 #ifdef RT
2050         movaps   4 * SIZE(B), %xmm4
2051
2052         pshufd   $0xee, %xmm4, %xmm6
2053         pshufd   $0xbb, %xmm4, %xmm7
2054
2055         pshufd   $0xa0, %xmm5, %xmm3
2056         pshufd   $0xf5, %xmm5, %xmm5
2057
2058 #ifndef CONJ
2059         xorps    %xmm0, %xmm5
2060 #else
2061         xorps    %xmm0, %xmm3
2062 #endif
2063
2064         mulps   %xmm6,  %xmm3
2065         mulps   %xmm7,  %xmm5
2066
2067         addps   %xmm3,  %xmm5
2068
2069         pshufd   $0x44, %xmm4, %xmm6
2070         pshufd   $0x11, %xmm4, %xmm7
2071
2072         pshufd   $0xa0, %xmm5, %xmm3
2073         pshufd   $0xf5, %xmm5, %xmm2
2074
2075 #ifndef CONJ
2076         xorps    %xmm0, %xmm2
2077 #else
2078         xorps    %xmm0, %xmm3
2079 #endif
2080
2081         mulps   %xmm6,  %xmm3
2082         mulps   %xmm7,  %xmm2
2083
2084         subps   %xmm3,  %xmm1
2085         subps   %xmm2,  %xmm1
2086
2087         movaps   0 * SIZE(B), %xmm4
2088
2089         pshufd   $0x44, %xmm4, %xmm6
2090         pshufd   $0x11, %xmm4, %xmm7
2091
2092         pshufd   $0xa0, %xmm1, %xmm3
2093         pshufd   $0xf5, %xmm1, %xmm1
2094
2095 #ifndef CONJ
2096         xorps    %xmm0, %xmm1
2097 #else
2098         xorps    %xmm0, %xmm3
2099 #endif
2100
2101         mulps   %xmm6,  %xmm3
2102         mulps   %xmm7,  %xmm1
2103
2104         addps   %xmm3,  %xmm1
2105 #endif
2106
2107 #ifdef LN
2108         subl    $2 * SIZE, CO1
2109 #endif
2110
2111 #if defined(LN) || defined(LT)
2112         movaps  %xmm2,   0 * SIZE(B)
2113
2114         pshufd  $0x00, %xmm2, %xmm0
2115         pshufd  $0x55, %xmm2, %xmm1
2116         pshufd  $0xaa, %xmm2, %xmm4
2117         pshufd  $0xff, %xmm2, %xmm5
2118
2119         movaps  %xmm0,   0 * SIZE(BB)
2120         movaps  %xmm1,   4 * SIZE(BB)
2121         movaps  %xmm4,   8 * SIZE(BB)
2122         movaps  %xmm5,  12 * SIZE(BB)
2123
2124         movlps  %xmm2,   0 * SIZE(CO1)
2125         movhps  %xmm2,   0 * SIZE(CO1, LDC)
2126 #else
2127         movlps  %xmm1,   0 * SIZE(AA)
2128         movlps  %xmm5,   2 * SIZE(AA)
2129
2130         movlps  %xmm1,   0 * SIZE(CO1)
2131         movlps  %xmm5,   0 * SIZE(CO1, LDC)
2132 #endif
2133
2134 #ifndef LN
2135         addl    $2 * SIZE, CO1
2136 #endif
2137
2138 #if defined(LT) || defined(RN)
2139         movl    K,  %eax
2140         subl    KK, %eax
2141         sall    $ZBASE_SHIFT, %eax
2142         addl    %eax, AA
2143 #ifdef LT
2144         addl    $4 * SIZE, B
2145 #endif
2146 #endif
2147
2148 #ifdef LN
2149         subl    $1, KK
2150         movl    BORIG, B
2151 #endif
2152
2153 #ifdef LT
2154         addl    $1, KK
2155 #endif
2156
2157 #ifdef RT
2158         movl    K, %eax
2159         movl    BORIG, B
2160         sall    $ZBASE_SHIFT, %eax
2161         addl    %eax, AORIG
2162 #endif
2163         ALIGN_4
2164
2165 .L99:
2166 #ifdef LN
2167        movl     K, %eax
2168        sall     $1 + ZBASE_SHIFT, %eax
2169        addl     %eax, B
2170 #endif
2171
2172 #if defined(LT) || defined(RN)
2173         movl    K,  %eax
2174         subl    KK, %eax
2175         sall    $1 + ZBASE_SHIFT, %eax
2176         addl    %eax, B
2177 #endif
2178
2179 #ifdef RN
2180         addl    $2, KK
2181 #endif
2182
2183 #ifdef RT
2184         subl    $2, KK
2185 #endif
2186
2187         decl    J                       # j --
2188         jg      .L01
2189         ALIGN_4
2190
2191
2192 .L999:
2193         EMMS
2194
2195         movl    OLD_STACK, %esp
2196         popl    %ebx
2197         popl    %esi
2198         popl    %edi
2199         popl    %ebp
2200         ret
2201
2202         EPILOGUE