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