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