2b4501434dc08c8c64419bd0cf74eb79439bf16f
[platform/upstream/openblas.git] / kernel / power / zgemv_t.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 P 2048
43
44 #ifndef __64BIT__
45 #define STACKSIZE 224
46 #else
47 #define STACKSIZE 304
48 #endif
49
50 #ifdef linux
51 #ifndef __64BIT__
52 #define M       r3
53 #define N       r4
54 #define A       r6
55 #define LDA     r7
56 #define X       r8
57 #define INCX    r9
58 #define Y       r10
59 #define INCY    r5
60 #else
61 #define M       r3
62 #define N       r4
63 #define A       r8
64 #define LDA     r9
65 #define X       r10
66 #define INCX    r5
67 #define Y       r6
68 #define INCY    r7
69 #endif
70 #endif
71
72 #if defined(_AIX) || defined(__APPLE__)
73 #if !defined(__64BIT__) && defined(DOUBLE)
74 #define M       r3
75 #define N       r4
76 #define A       r10
77 #define LDA     r5
78 #define X       r6
79 #define INCX    r7
80 #define Y       r8
81 #define INCY    r9
82 #else
83 #define M       r3
84 #define N       r4
85 #define A       r8
86 #define LDA     r9
87 #define X       r10
88 #define INCX    r5
89 #define Y       r6
90 #define INCY    r7
91 #endif
92 #endif
93
94 #define BUFFER  r11
95 #define XP      r12
96 #define MIN_N   r14
97 #define J       r15
98 #define CO      r16
99 #define BO      r17
100 #define PLDA_M  r18
101 #define AO1     r19
102 #define AO2     r20
103 #define AO3     r21
104 #define AO4     r22
105 #define IS      r23
106 #define PREA    r24
107 #define PREC    r25
108
109 #define Y1      r23   /* dummy; should be same as gemv_n.S */
110 #define Y2      r24   /* dummy; should be same as gemv_n.S */
111
112 #if defined(PPCG4)
113 #define PREFETCHSIZE_A  34
114 #define PREFETCHSIZE_C  16
115 #endif
116
117 #if defined(PPC440) || defined(PPC440FP2)
118 #define PREFETCHSIZE_A  34
119 #define PREFETCHSIZE_C  16
120 #endif
121
122 #ifdef PPC970
123 #define PREFETCHSIZE_A  56
124 #define PREFETCHSIZE_C  16
125 #endif
126
127 #ifdef CELL
128 #define PREFETCHSIZE_A  56
129 #define PREFETCHSIZE_C  16
130 #endif
131
132 #ifdef POWER4
133 #define PREFETCHSIZE_A  34
134 #define PREFETCHSIZE_C  16
135 #endif
136
137 #ifdef POWER5
138 #define PREFETCHSIZE_A  40
139 #define PREFETCHSIZE_C   8
140 #endif
141
142 #ifdef POWER6
143 #define PREFETCHSIZE_A  24
144 #define PREFETCHSIZE_C   8
145 #endif
146
147 #ifdef POWER8
148 #define PREFETCHSIZE_A  24
149 #define PREFETCHSIZE_C   8
150 #endif
151
152 #if !(defined(CONJ) && defined(XCONJ))
153 #define FMADDR FMADD
154 #define FMSUBR FNMSUB
155 #else
156 #define FMADDR FNMSUB
157 #define FMSUBR FMADD
158 #endif
159
160 #ifndef NEEDPARAM
161
162 #ifndef __64BIT__
163 #define FZERO   200(SP)
164 #define ALPHA_R 208(SP)
165 #define ALPHA_I 216(SP)
166 #else
167 #define FZERO   256(SP)
168 #define ALPHA_R 264(SP)
169 #define ALPHA_I 272(SP)
170 #endif
171
172         PROLOGUE
173         PROFCODE
174
175         addi    SP, SP,  -STACKSIZE
176         li      r0,   0
177
178         stfd    f14,     0(SP)
179         stfd    f15,     8(SP)
180         stfd    f16,    16(SP)
181         stfd    f17,    24(SP)
182         stfd    f18,    32(SP)
183         stfd    f19,    40(SP)
184         stfd    f20,    48(SP)
185         stfd    f21,    56(SP)
186         stfd    f22,    64(SP)
187         stfd    f23,    72(SP)
188         stfd    f24,    80(SP)
189         stfd    f25,    88(SP)
190         stfd    f26,    96(SP)
191         stfd    f27,   104(SP)
192         stfd    f28,   112(SP)
193         stfd    f29,   120(SP)
194         stfd    f30,   128(SP)
195         stfd    f31,   136(SP)
196
197 #ifdef __64BIT__
198         std     r14,   144(SP)
199         std     r15,   152(SP)
200         std     r16,   160(SP)
201         std     r17,   168(SP)
202         std     r18,   176(SP)
203         std     r19,   184(SP)
204         std     r20,   192(SP)
205         std     r21,   200(SP)
206         std     r22,   208(SP)
207         std     r23,   216(SP)
208         std     r24,   224(SP)
209         std     r25,   232(SP)
210         std     r0,    FZERO
211 #else
212         stw     r14,   144(SP)
213         stw     r15,   148(SP)
214         stw     r16,   152(SP)
215         stw     r17,   156(SP)
216         stw     r18,   160(SP)
217         stw     r19,   164(SP)
218         stw     r20,   168(SP)
219         stw     r21,   172(SP)
220         stw     r22,   176(SP)
221         stw     r23,   180(SP)
222         stw     r24,   184(SP)
223         stw     r25,   188(SP)
224         stw     r0,    FZERO
225         stw     r0,    4 + FZERO
226 #endif
227
228 #ifdef linux
229 #ifndef __64BIT__
230         lwz     INCY,    FRAMESLOT(0) + STACKSIZE(SP)
231         lwz     BUFFER,  FRAMESLOT(1) + STACKSIZE(SP)
232 #else
233         ld      INCX,    FRAMESLOT(0) + STACKSIZE(SP)
234         ld      Y,       FRAMESLOT(1) + STACKSIZE(SP)
235         ld      INCY,    FRAMESLOT(2) + STACKSIZE(SP)
236         ld      BUFFER,  FRAMESLOT(3) + STACKSIZE(SP)
237 #endif
238 #endif
239
240 #if defined(_AIX) || defined(__APPLE__)
241 #ifndef __64BIT__
242 #ifdef DOUBLE
243         lwz     LDA,     FRAMESLOT(0) + STACKSIZE(SP)
244         lwz     X,       FRAMESLOT(1) + STACKSIZE(SP)
245         lwz     INCX,    FRAMESLOT(2) + STACKSIZE(SP)
246         lwz     Y,       FRAMESLOT(3) + STACKSIZE(SP)
247         lwz     INCY,    FRAMESLOT(4) + STACKSIZE(SP)
248         lwz     BUFFER,  FRAMESLOT(5) + STACKSIZE(SP)
249 #else
250         lwz     INCX,    FRAMESLOT(0) + STACKSIZE(SP)
251         lwz     Y,       FRAMESLOT(1) + STACKSIZE(SP)
252         lwz     INCY,    FRAMESLOT(2) + STACKSIZE(SP)
253         lwz     BUFFER,  FRAMESLOT(3) + STACKSIZE(SP)
254 #endif
255 #else
256         ld      INCX,    FRAMESLOT(0) + STACKSIZE(SP)
257         ld      Y,       FRAMESLOT(1) + STACKSIZE(SP)
258         ld      INCY,    FRAMESLOT(2) + STACKSIZE(SP)
259         ld      BUFFER,  FRAMESLOT(3) + STACKSIZE(SP)
260 #endif
261 #endif
262
263         stfd    f1, ALPHA_R
264         stfd    f2, ALPHA_I
265
266         mullw   PLDA_M, LDA, N
267         li      XP,  P
268         subf    PLDA_M, XP, PLDA_M
269         slwi    PLDA_M, PLDA_M, ZBASE_SHIFT
270
271         slwi    LDA,  LDA,  ZBASE_SHIFT
272         slwi    INCX, INCX, ZBASE_SHIFT
273         slwi    INCY, INCY, ZBASE_SHIFT
274
275         li      IS,  0
276
277         li      PREA, PREFETCHSIZE_A * SIZE
278         li      PREC, PREFETCHSIZE_C * SIZE
279
280         cmpwi   cr0, M, 0
281         ble     LL(End)
282         cmpwi   cr0, N, 0
283         ble     LL(End)
284         .align 4
285
286 LL(ISLoop):
287         subf    MIN_N, IS, M
288         slwi    r0, IS, ZBASE_SHIFT
289         cmpi    cr0, 0, MIN_N, P
290         ble+    LL(min_nP)
291         li      MIN_N, P
292 LL(min_nP):
293         add     XP, X,  r0
294         cmpwi   cr0, INCX, 2 * SIZE
295         beq     LL(Main)
296
297         mr      XP, BUFFER
298         addi    CO, BUFFER, -SIZE
299
300         srawi.  r0, MIN_N, 2
301         mtspr   CTR, r0
302         ble     LL(CopyRemain)
303         .align 4
304
305 LL(CopyKernel):
306         LFD     f0, 0 * SIZE(X)
307         LFD     f1, 1 * SIZE(X)
308         add     X, X, INCX
309         LFD     f2, 0 * SIZE(X)
310         LFD     f3, 1 * SIZE(X)
311         add     X, X, INCX
312         LFD     f4, 0 * SIZE(X)
313         LFD     f5, 1 * SIZE(X)
314         add     X, X, INCX
315         LFD     f6, 0 * SIZE(X)
316         LFD     f7, 1 * SIZE(X)
317         add     X, X, INCX
318
319         STFD    f0,  1 * SIZE(CO)
320         STFD    f1,  2 * SIZE(CO)
321         STFD    f2,  3 * SIZE(CO)
322         STFD    f3,  4 * SIZE(CO)
323         STFD    f4,  5 * SIZE(CO)
324         STFD    f5,  6 * SIZE(CO)
325         STFD    f6,  7 * SIZE(CO)
326         STFDU   f7,  8 * SIZE(CO)
327         bdnz    LL(CopyKernel)
328         .align 4
329
330 LL(CopyRemain):
331         andi.   r0, MIN_N, 3
332         mtspr   CTR, r0
333         ble     LL(Main)
334         .align 4
335
336 LL(CopySub):
337         LFD     f0, 0 * SIZE(X)
338         LFD     f1, 1 * SIZE(X)
339         add     X, X, INCX
340         STFD    f0,  1 * SIZE(CO)
341         STFDU   f1,  2 * SIZE(CO)
342         bdnz    LL(CopySub)
343         .align 4
344
345 LL(Main):
346         mr      CO, Y
347         addi    XP, XP, -SIZE
348         srawi.  J, N, 2
349         ble     LL(Remain)
350         .align 4
351
352 LL(MainHead):
353         mr     AO1, A
354         add    AO2, A,   LDA
355         add    AO3, AO2, LDA
356         add    AO4, AO3, LDA
357         add    A,   AO4, LDA
358
359         mr     BO, XP
360
361         lfd      f0,  FZERO
362         fmr      f1,  f0
363         fmr      f2,  f0
364         fmr      f3,  f0
365         fmr      f4,  f0
366         fmr      f5,  f0
367         fmr      f6,  f0
368         fmr      f7,  f0
369         fmr      f8,  f0
370         fmr      f9,  f0
371         fmr      f10, f0
372         fmr      f11, f0
373         fmr      f12, f0
374         fmr      f13, f0
375         fmr      f14, f0
376         fmr      f15, f0
377
378         dcbtst   PREC, CO
379         srawi.  r0,  MIN_N, 3
380         mtspr   CTR, r0
381         ble     LL(MainN3)
382
383         LFD     f16, 0 * SIZE(AO1)
384         LFD     f17, 1 * SIZE(AO1)
385         LFD     f18, 0 * SIZE(AO2)
386         LFD     f19, 1 * SIZE(AO2)
387         LFD     f20, 0 * SIZE(AO3)
388         LFD     f21, 1 * SIZE(AO3)
389         LFD     f22, 0 * SIZE(AO4)
390         LFD     f23, 1 * SIZE(AO4)
391
392         LFD     f24, 1 * SIZE(BO)
393         LFD     f25, 2 * SIZE(BO)
394         LFD     f26, 3 * SIZE(BO)
395         LFD     f27, 4 * SIZE(BO)
396         LFD     f28, 5 * SIZE(BO)
397         LFD     f29, 6 * SIZE(BO)
398         LFD     f30, 7 * SIZE(BO)
399         LFD     f31, 8 * SIZE(BO)
400
401         bdz     LL(MainKernelSkip)
402         .align 5
403
404 LL(MainKernel):
405         FMADD   f0,  f16,  f24, f0
406         FMADD   f1,  f16,  f25, f1
407         FMADD   f2,  f17,  f24, f2
408         FMADD   f3,  f17,  f25, f3
409
410         FMADD   f4,  f18,  f24, f4
411         FMADD   f5,  f18,  f25, f5
412         FMADD   f6,  f19,  f24, f6
413         FMADD   f7,  f19,  f25, f7
414
415         LFD     f16, 2 * SIZE(AO1)
416         LFD     f17, 3 * SIZE(AO1)
417         LFD     f18, 2 * SIZE(AO2)
418         LFD     f19, 3 * SIZE(AO2)
419
420         FMADD   f8,  f20,  f24, f8
421         FMADD   f9,  f20,  f25, f9
422         FMADD   f10, f21,  f24, f10
423         FMADD   f11, f21,  f25, f11
424
425         FMADD   f12, f22,  f24, f12
426         FMADD   f13, f22,  f25, f13
427         FMADD   f14, f23,  f24, f14
428         FMADD   f15, f23,  f25, f15
429
430         LFD     f20, 2 * SIZE(AO3)
431         LFD     f21, 3 * SIZE(AO3)
432         LFD     f22, 2 * SIZE(AO4)
433         LFD     f23, 3 * SIZE(AO4)
434
435         FMADD   f0,  f16,  f26, f0
436         FMADD   f1,  f16,  f27, f1
437         FMADD   f2,  f17,  f26, f2
438         FMADD   f3,  f17,  f27, f3
439
440         FMADD   f4,  f18,  f26, f4
441         FMADD   f5,  f18,  f27, f5
442         FMADD   f6,  f19,  f26, f6
443         FMADD   f7,  f19,  f27, f7
444
445         LFD     f16, 4 * SIZE(AO1)
446         LFD     f17, 5 * SIZE(AO1)
447         LFD     f18, 4 * SIZE(AO2)
448         LFD     f19, 5 * SIZE(AO2)
449
450         FMADD   f8,  f20,  f26, f8
451         FMADD   f9,  f20,  f27, f9
452         FMADD   f10, f21,  f26, f10
453         FMADD   f11, f21,  f27, f11
454
455         FMADD   f12, f22,  f26, f12
456         FMADD   f13, f22,  f27, f13
457         FMADD   f14, f23,  f26, f14
458         FMADD   f15, f23,  f27, f15
459
460         LFD     f20, 4 * SIZE(AO3)
461         LFD     f21, 5 * SIZE(AO3)
462         LFD     f22, 4 * SIZE(AO4)
463         LFD     f23, 5 * SIZE(AO4)
464
465         LFD     f24,  9 * SIZE(BO)
466         LFD     f25, 10 * SIZE(BO)
467         LFD     f26, 11 * SIZE(BO)
468         LFD     f27, 12 * SIZE(BO)
469
470         FMADD   f0,  f16,  f28, f0
471         FMADD   f1,  f16,  f29, f1
472         FMADD   f2,  f17,  f28, f2
473         FMADD   f3,  f17,  f29, f3
474
475         FMADD   f4,  f18,  f28, f4
476         FMADD   f5,  f18,  f29, f5
477         FMADD   f6,  f19,  f28, f6
478         FMADD   f7,  f19,  f29, f7
479
480         LFD     f16, 6 * SIZE(AO1)
481         LFD     f17, 7 * SIZE(AO1)
482         LFD     f18, 6 * SIZE(AO2)
483         LFD     f19, 7 * SIZE(AO2)
484
485         FMADD   f8,  f20,  f28, f8
486         FMADD   f9,  f20,  f29, f9
487         FMADD   f10, f21,  f28, f10
488         FMADD   f11, f21,  f29, f11
489
490         FMADD   f12, f22,  f28, f12
491         FMADD   f13, f22,  f29, f13
492         FMADD   f14, f23,  f28, f14
493         FMADD   f15, f23,  f29, f15
494
495         LFD     f20, 6 * SIZE(AO3)
496         LFD     f21, 7 * SIZE(AO3)
497         LFD     f22, 6 * SIZE(AO4)
498         LFD     f23, 7 * SIZE(AO4)
499
500         FMADD   f0,  f16,  f30, f0
501         FMADD   f1,  f16,  f31, f1
502         FMADD   f2,  f17,  f30, f2
503         FMADD   f3,  f17,  f31, f3
504
505         FMADD   f4,  f18,  f30, f4
506         FMADD   f5,  f18,  f31, f5
507         FMADD   f6,  f19,  f30, f6
508         FMADD   f7,  f19,  f31, f7
509
510         LFD     f16, 8 * SIZE(AO1)
511         LFD     f17, 9 * SIZE(AO1)
512         LFD     f18, 8 * SIZE(AO2)
513         LFD     f19, 9 * SIZE(AO2)
514
515         FMADD   f8,  f20,  f30, f8
516         FMADD   f9,  f20,  f31, f9
517         FMADD   f10, f21,  f30, f10
518         FMADD   f11, f21,  f31, f11
519
520         FMADD   f12, f22,  f30, f12
521         FMADD   f13, f22,  f31, f13
522         FMADD   f14, f23,  f30, f14
523         FMADD   f15, f23,  f31, f15
524
525         LFD     f20, 8 * SIZE(AO3)
526         LFD     f21, 9 * SIZE(AO3)
527         LFD     f22, 8 * SIZE(AO4)
528         LFD     f23, 9 * SIZE(AO4)
529
530         LFD     f28, 13 * SIZE(BO)
531         LFD     f29, 14 * SIZE(BO)
532         LFD     f30, 15 * SIZE(BO)
533         LFD     f31, 16 * SIZE(BO)
534
535         FMADD   f0,  f16,  f24, f0
536         FMADD   f1,  f16,  f25, f1
537         FMADD   f2,  f17,  f24, f2
538         FMADD   f3,  f17,  f25, f3
539
540         FMADD   f4,  f18,  f24, f4
541         FMADD   f5,  f18,  f25, f5
542         FMADD   f6,  f19,  f24, f6
543         FMADD   f7,  f19,  f25, f7
544
545         LFD     f16, 10 * SIZE(AO1)
546         LFD     f17, 11 * SIZE(AO1)
547         LFD     f18, 10 * SIZE(AO2)
548         LFD     f19, 11 * SIZE(AO2)
549
550         FMADD   f8,  f20,  f24, f8
551         FMADD   f9,  f20,  f25, f9
552         FMADD   f10, f21,  f24, f10
553         FMADD   f11, f21,  f25, f11
554
555         FMADD   f12, f22,  f24, f12
556         FMADD   f13, f22,  f25, f13
557         FMADD   f14, f23,  f24, f14
558         FMADD   f15, f23,  f25, f15
559
560         LFD     f20, 10 * SIZE(AO3)
561         LFD     f21, 11 * SIZE(AO3)
562         LFD     f22, 10 * SIZE(AO4)
563         LFD     f23, 11 * SIZE(AO4)
564
565         FMADD   f0,  f16,  f26, f0
566         FMADD   f1,  f16,  f27, f1
567         FMADD   f2,  f17,  f26, f2
568         FMADD   f3,  f17,  f27, f3
569
570         FMADD   f4,  f18,  f26, f4
571         FMADD   f5,  f18,  f27, f5
572         FMADD   f6,  f19,  f26, f6
573         FMADD   f7,  f19,  f27, f7
574
575         LFD     f16, 12 * SIZE(AO1)
576         LFD     f17, 13 * SIZE(AO1)
577         LFD     f18, 12 * SIZE(AO2)
578         LFD     f19, 13 * SIZE(AO2)
579
580         FMADD   f8,  f20,  f26, f8
581         FMADD   f9,  f20,  f27, f9
582         FMADD   f10, f21,  f26, f10
583         FMADD   f11, f21,  f27, f11
584
585         FMADD   f12, f22,  f26, f12
586         FMADD   f13, f22,  f27, f13
587         FMADD   f14, f23,  f26, f14
588         FMADD   f15, f23,  f27, f15
589
590         LFD     f20, 12 * SIZE(AO3)
591         LFD     f21, 13 * SIZE(AO3)
592         LFD     f22, 12 * SIZE(AO4)
593         LFD     f23, 13 * SIZE(AO4)
594
595         LFD     f24, 17 * SIZE(BO)
596         LFD     f25, 18 * SIZE(BO)
597         LFD     f26, 19 * SIZE(BO)
598         LFD     f27, 20 * SIZE(BO)
599
600         FMADD   f0,  f16,  f28, f0
601         FMADD   f1,  f16,  f29, f1
602         FMADD   f2,  f17,  f28, f2
603         FMADD   f3,  f17,  f29, f3
604
605         FMADD   f4,  f18,  f28, f4
606         FMADD   f5,  f18,  f29, f5
607         FMADD   f6,  f19,  f28, f6
608         FMADD   f7,  f19,  f29, f7
609
610         LFD     f16, 14 * SIZE(AO1)
611         LFD     f17, 15 * SIZE(AO1)
612         LFD     f18, 14 * SIZE(AO2)
613         LFD     f19, 15 * SIZE(AO2)
614
615         FMADD   f8,  f20,  f28, f8
616         FMADD   f9,  f20,  f29, f9
617         FMADD   f10, f21,  f28, f10
618         FMADD   f11, f21,  f29, f11
619
620         FMADD   f12, f22,  f28, f12
621         FMADD   f13, f22,  f29, f13
622         FMADD   f14, f23,  f28, f14
623         FMADD   f15, f23,  f29, f15
624
625         LFD     f20, 14 * SIZE(AO3)
626         LFD     f21, 15 * SIZE(AO3)
627         LFD     f22, 14 * SIZE(AO4)
628         LFD     f23, 15 * SIZE(AO4)
629
630         FMADD   f0,  f16,  f30, f0
631         FMADD   f1,  f16,  f31, f1
632         FMADD   f2,  f17,  f30, f2
633         FMADD   f3,  f17,  f31, f3
634
635         FMADD   f4,  f18,  f30, f4
636         FMADD   f5,  f18,  f31, f5
637         FMADD   f6,  f19,  f30, f6
638         FMADD   f7,  f19,  f31, f7
639
640         LFD     f16, 16 * SIZE(AO1)
641         LFD     f17, 17 * SIZE(AO1)
642         LFD     f18, 16 * SIZE(AO2)
643         LFD     f19, 17 * SIZE(AO2)
644
645         addi    AO1, AO1, 16 * SIZE
646         addi    AO2, AO2, 16 * SIZE
647         DCBT(AO1, PREA)
648         DCBT(AO2, PREA)
649
650         FMADD   f8,  f20,  f30, f8
651         FMADD   f9,  f20,  f31, f9
652         FMADD   f10, f21,  f30, f10
653         FMADD   f11, f21,  f31, f11
654
655         FMADD   f12, f22,  f30, f12
656         FMADD   f13, f22,  f31, f13
657         FMADD   f14, f23,  f30, f14
658         FMADD   f15, f23,  f31, f15
659
660         LFD     f20, 16 * SIZE(AO3)
661         LFD     f21, 17 * SIZE(AO3)
662         LFD     f22, 16 * SIZE(AO4)
663         LFD     f23, 17 * SIZE(AO4)
664
665         LFD     f28, 21 * SIZE(BO)
666         LFD     f29, 22 * SIZE(BO)
667         LFD     f30, 23 * SIZE(BO)
668         LFD     f31, 24 * SIZE(BO)
669
670         addi    AO3, AO3, 16 * SIZE
671         addi    AO4, AO4, 16 * SIZE
672         DCBT(AO3, PREA)
673         DCBT(AO4, PREA)
674
675         addi    BO, BO, 16 * SIZE
676         bdnz    LL(MainKernel)
677         .align 4
678
679 LL(MainKernelSkip):
680         FMADD   f0,  f16,  f24, f0
681         FMADD   f1,  f16,  f25, f1
682         FMADD   f2,  f17,  f24, f2
683         FMADD   f3,  f17,  f25, f3
684
685         FMADD   f4,  f18,  f24, f4
686         FMADD   f5,  f18,  f25, f5
687         FMADD   f6,  f19,  f24, f6
688         FMADD   f7,  f19,  f25, f7
689
690         LFD     f16, 2 * SIZE(AO1)
691         LFD     f17, 3 * SIZE(AO1)
692         LFD     f18, 2 * SIZE(AO2)
693         LFD     f19, 3 * SIZE(AO2)
694
695         FMADD   f8,  f20,  f24, f8
696         FMADD   f9,  f20,  f25, f9
697         FMADD   f10, f21,  f24, f10
698         FMADD   f11, f21,  f25, f11
699
700         FMADD   f12, f22,  f24, f12
701         FMADD   f13, f22,  f25, f13
702         FMADD   f14, f23,  f24, f14
703         FMADD   f15, f23,  f25, f15
704
705         LFD     f20, 2 * SIZE(AO3)
706         LFD     f21, 3 * SIZE(AO3)
707         LFD     f22, 2 * SIZE(AO4)
708         LFD     f23, 3 * SIZE(AO4)
709
710         FMADD   f0,  f16,  f26, f0
711         FMADD   f1,  f16,  f27, f1
712         FMADD   f2,  f17,  f26, f2
713         FMADD   f3,  f17,  f27, f3
714
715         FMADD   f4,  f18,  f26, f4
716         FMADD   f5,  f18,  f27, f5
717         FMADD   f6,  f19,  f26, f6
718         FMADD   f7,  f19,  f27, f7
719
720         LFD     f16, 4 * SIZE(AO1)
721         LFD     f17, 5 * SIZE(AO1)
722         LFD     f18, 4 * SIZE(AO2)
723         LFD     f19, 5 * SIZE(AO2)
724
725         FMADD   f8,  f20,  f26, f8
726         FMADD   f9,  f20,  f27, f9
727         FMADD   f10, f21,  f26, f10
728         FMADD   f11, f21,  f27, f11
729
730         FMADD   f12, f22,  f26, f12
731         FMADD   f13, f22,  f27, f13
732         FMADD   f14, f23,  f26, f14
733         FMADD   f15, f23,  f27, f15
734
735         LFD     f20, 4 * SIZE(AO3)
736         LFD     f21, 5 * SIZE(AO3)
737         LFD     f22, 4 * SIZE(AO4)
738         LFD     f23, 5 * SIZE(AO4)
739
740         FMADD   f0,  f16,  f28, f0
741         FMADD   f1,  f16,  f29, f1
742         FMADD   f2,  f17,  f28, f2
743         FMADD   f3,  f17,  f29, f3
744
745         FMADD   f4,  f18,  f28, f4
746         FMADD   f5,  f18,  f29, f5
747         FMADD   f6,  f19,  f28, f6
748         FMADD   f7,  f19,  f29, f7
749
750         LFD     f16, 6 * SIZE(AO1)
751         LFD     f17, 7 * SIZE(AO1)
752         LFD     f18, 6 * SIZE(AO2)
753         LFD     f19, 7 * SIZE(AO2)
754
755         FMADD   f8,  f20,  f28, f8
756         FMADD   f9,  f20,  f29, f9
757         FMADD   f10, f21,  f28, f10
758         FMADD   f11, f21,  f29, f11
759
760         FMADD   f12, f22,  f28, f12
761         FMADD   f13, f22,  f29, f13
762         FMADD   f14, f23,  f28, f14
763         FMADD   f15, f23,  f29, f15
764
765         LFD     f20, 6 * SIZE(AO3)
766         LFD     f21, 7 * SIZE(AO3)
767         LFD     f22, 6 * SIZE(AO4)
768         LFD     f23, 7 * SIZE(AO4)
769
770         FMADD   f0,  f16,  f30, f0
771         FMADD   f1,  f16,  f31, f1
772         FMADD   f2,  f17,  f30, f2
773         FMADD   f3,  f17,  f31, f3
774
775         FMADD   f4,  f18,  f30, f4
776         FMADD   f5,  f18,  f31, f5
777         FMADD   f6,  f19,  f30, f6
778         FMADD   f7,  f19,  f31, f7
779
780         LFD     f16, 8 * SIZE(AO1)
781         LFD     f17, 9 * SIZE(AO1)
782         LFD     f18, 8 * SIZE(AO2)
783         LFD     f19, 9 * SIZE(AO2)
784
785         FMADD   f8,  f20,  f30, f8
786         FMADD   f9,  f20,  f31, f9
787         FMADD   f10, f21,  f30, f10
788         FMADD   f11, f21,  f31, f11
789
790         FMADD   f12, f22,  f30, f12
791         FMADD   f13, f22,  f31, f13
792         FMADD   f14, f23,  f30, f14
793         FMADD   f15, f23,  f31, f15
794
795         LFD     f20, 8 * SIZE(AO3)
796         LFD     f21, 9 * SIZE(AO3)
797         LFD     f22, 8 * SIZE(AO4)
798         LFD     f23, 9 * SIZE(AO4)
799
800         LFD     f24,  9 * SIZE(BO)
801         LFD     f25, 10 * SIZE(BO)
802         LFD     f26, 11 * SIZE(BO)
803         LFD     f27, 12 * SIZE(BO)
804
805         LFD     f28, 13 * SIZE(BO)
806         LFD     f29, 14 * SIZE(BO)
807         LFD     f30, 15 * SIZE(BO)
808         LFDU    f31, 16 * SIZE(BO)
809
810         FMADD   f0,  f16,  f24, f0
811         FMADD   f1,  f16,  f25, f1
812         FMADD   f2,  f17,  f24, f2
813         FMADD   f3,  f17,  f25, f3
814
815         FMADD   f4,  f18,  f24, f4
816         FMADD   f5,  f18,  f25, f5
817         FMADD   f6,  f19,  f24, f6
818         FMADD   f7,  f19,  f25, f7
819
820         LFD     f16, 10 * SIZE(AO1)
821         LFD     f17, 11 * SIZE(AO1)
822         LFD     f18, 10 * SIZE(AO2)
823         LFD     f19, 11 * SIZE(AO2)
824
825         FMADD   f8,  f20,  f24, f8
826         FMADD   f9,  f20,  f25, f9
827         FMADD   f10, f21,  f24, f10
828         FMADD   f11, f21,  f25, f11
829
830         FMADD   f12, f22,  f24, f12
831         FMADD   f13, f22,  f25, f13
832         FMADD   f14, f23,  f24, f14
833         FMADD   f15, f23,  f25, f15
834
835         LFD     f20, 10 * SIZE(AO3)
836         LFD     f21, 11 * SIZE(AO3)
837         LFD     f22, 10 * SIZE(AO4)
838         LFD     f23, 11 * SIZE(AO4)
839
840         FMADD   f0,  f16,  f26, f0
841         FMADD   f1,  f16,  f27, f1
842         FMADD   f2,  f17,  f26, f2
843         FMADD   f3,  f17,  f27, f3
844
845         FMADD   f4,  f18,  f26, f4
846         FMADD   f5,  f18,  f27, f5
847         FMADD   f6,  f19,  f26, f6
848         FMADD   f7,  f19,  f27, f7
849
850         LFD     f16, 12 * SIZE(AO1)
851         LFD     f17, 13 * SIZE(AO1)
852         LFD     f18, 12 * SIZE(AO2)
853         LFD     f19, 13 * SIZE(AO2)
854
855         FMADD   f8,  f20,  f26, f8
856         FMADD   f9,  f20,  f27, f9
857         FMADD   f10, f21,  f26, f10
858         FMADD   f11, f21,  f27, f11
859
860         FMADD   f12, f22,  f26, f12
861         FMADD   f13, f22,  f27, f13
862         FMADD   f14, f23,  f26, f14
863         FMADD   f15, f23,  f27, f15
864
865         LFD     f20, 12 * SIZE(AO3)
866         LFD     f21, 13 * SIZE(AO3)
867         LFD     f22, 12 * SIZE(AO4)
868         LFD     f23, 13 * SIZE(AO4)
869
870         FMADD   f0,  f16,  f28, f0
871         FMADD   f1,  f16,  f29, f1
872         FMADD   f2,  f17,  f28, f2
873         FMADD   f3,  f17,  f29, f3
874
875         FMADD   f4,  f18,  f28, f4
876         FMADD   f5,  f18,  f29, f5
877         FMADD   f6,  f19,  f28, f6
878         FMADD   f7,  f19,  f29, f7
879
880         LFD     f16, 14 * SIZE(AO1)
881         LFD     f17, 15 * SIZE(AO1)
882         LFD     f18, 14 * SIZE(AO2)
883         LFD     f19, 15 * SIZE(AO2)
884
885         FMADD   f8,  f20,  f28, f8
886         FMADD   f9,  f20,  f29, f9
887         FMADD   f10, f21,  f28, f10
888         FMADD   f11, f21,  f29, f11
889
890         FMADD   f12, f22,  f28, f12
891         FMADD   f13, f22,  f29, f13
892         FMADD   f14, f23,  f28, f14
893         FMADD   f15, f23,  f29, f15
894
895         LFD     f20, 14 * SIZE(AO3)
896         LFD     f21, 15 * SIZE(AO3)
897         LFD     f22, 14 * SIZE(AO4)
898         LFD     f23, 15 * SIZE(AO4)
899
900         addi    AO1, AO1, 16 * SIZE
901         addi    AO2, AO2, 16 * SIZE
902         addi    AO3, AO3, 16 * SIZE
903         addi    AO4, AO4, 16 * SIZE
904
905         FMADD   f0,  f16,  f30, f0
906         FMADD   f1,  f16,  f31, f1
907         FMADD   f2,  f17,  f30, f2
908         FMADD   f3,  f17,  f31, f3
909
910         FMADD   f4,  f18,  f30, f4
911         FMADD   f5,  f18,  f31, f5
912         FMADD   f6,  f19,  f30, f6
913         FMADD   f7,  f19,  f31, f7
914
915         FMADD   f8,  f20,  f30, f8
916         FMADD   f9,  f20,  f31, f9
917         FMADD   f10, f21,  f30, f10
918         FMADD   f11, f21,  f31, f11
919
920         FMADD   f12, f22,  f30, f12
921         FMADD   f13, f22,  f31, f13
922         FMADD   f14, f23,  f30, f14
923         FMADD   f15, f23,  f31, f15
924         .align 4
925
926 LL(MainN3):
927         andi.   r0, MIN_N, 7
928         mtspr   CTR, r0
929         ble     LL(MainFinish)
930         .align 4
931
932         LFD     f16, 0 * SIZE(AO1)
933         LFD     f17, 1 * SIZE(AO1)
934         LFD     f18, 0 * SIZE(AO2)
935         LFD     f19, 1 * SIZE(AO2)
936         LFD     f20, 0 * SIZE(AO3)
937         LFD     f21, 1 * SIZE(AO3)
938         LFD     f22, 0 * SIZE(AO4)
939         LFD     f23, 1 * SIZE(AO4)
940
941         LFD     f24, 1 * SIZE(BO)
942         LFDU    f25, 2 * SIZE(BO)
943
944         addi    AO1, AO1, 2 * SIZE
945         addi    AO2, AO2, 2 * SIZE
946         addi    AO3, AO3, 2 * SIZE
947         addi    AO4, AO4, 2 * SIZE
948
949         bdz     LL(MainN3KernelSkip)
950         .align 4
951
952 LL(MainN3Kernel):
953         FMADD   f0,  f16,  f24, f0
954         FMADD   f1,  f16,  f25, f1
955         FMADD   f2,  f17,  f24, f2
956         FMADD   f3,  f17,  f25, f3
957
958         FMADD   f4,  f18,  f24, f4
959         FMADD   f5,  f18,  f25, f5
960         FMADD   f6,  f19,  f24, f6
961         FMADD   f7,  f19,  f25, f7
962
963         LFD     f16, 0 * SIZE(AO1)
964         LFD     f17, 1 * SIZE(AO1)
965         LFD     f18, 0 * SIZE(AO2)
966         LFD     f19, 1 * SIZE(AO2)
967
968         FMADD   f8,  f20,  f24, f8
969         FMADD   f9,  f20,  f25, f9
970         FMADD   f10, f21,  f24, f10
971         FMADD   f11, f21,  f25, f11
972
973         FMADD   f12, f22,  f24, f12
974         FMADD   f13, f22,  f25, f13
975         FMADD   f14, f23,  f24, f14
976         FMADD   f15, f23,  f25, f15
977
978         LFD     f20, 0 * SIZE(AO3)
979         LFD     f21, 1 * SIZE(AO3)
980         LFD     f22, 0 * SIZE(AO4)
981         LFD     f23, 1 * SIZE(AO4)
982
983         LFD     f24, 1 * SIZE(BO)
984         LFDU    f25, 2 * SIZE(BO)
985
986         addi    AO1, AO1, 2 * SIZE
987         addi    AO2, AO2, 2 * SIZE
988         addi    AO3, AO3, 2 * SIZE
989         addi    AO4, AO4, 2 * SIZE
990
991         bdnz    LL(MainN3Kernel)
992         .align 4
993
994 LL(MainN3KernelSkip):
995         FMADD   f0,  f16,  f24, f0
996         FMADD   f1,  f16,  f25, f1
997         FMADD   f2,  f17,  f24, f2
998         FMADD   f3,  f17,  f25, f3
999
1000         FMADD   f4,  f18,  f24, f4
1001         FMADD   f5,  f18,  f25, f5
1002         FMADD   f6,  f19,  f24, f6
1003         FMADD   f7,  f19,  f25, f7
1004
1005         FMADD   f8,  f20,  f24, f8
1006         FMADD   f9,  f20,  f25, f9
1007         FMADD   f10, f21,  f24, f10
1008         FMADD   f11, f21,  f25, f11
1009
1010         FMADD   f12, f22,  f24, f12
1011         FMADD   f13, f22,  f25, f13
1012         FMADD   f14, f23,  f24, f14
1013         FMADD   f15, f23,  f25, f15
1014         .align 4
1015
1016 LL(MainFinish):
1017         lfd     f30, ALPHA_R
1018         lfd     f31, ALPHA_I
1019
1020 #ifndef XCONJ
1021 #ifndef CONJ
1022         FSUB    f0,  f0,  f3
1023         FADD    f1,  f1,  f2
1024         FSUB    f4,  f4,  f7
1025         FADD    f5,  f5,  f6
1026         FSUB    f8,  f8,  f11
1027         FADD    f9,  f9,  f10
1028         FSUB    f12, f12, f15
1029         FADD    f13, f13, f14
1030 #else
1031         FADD    f0,  f0,  f3
1032         FSUB    f1,  f1,  f2
1033         FADD    f4,  f4,  f7
1034         FSUB    f5,  f5,  f6
1035         FADD    f8,  f8,  f11
1036         FSUB    f9,  f9,  f10
1037         FADD    f12, f12, f15
1038         FSUB    f13, f13, f14
1039 #endif
1040 #else
1041 #ifndef CONJ
1042         FADD    f0,  f0,  f3
1043         FSUB    f1,  f2,  f1
1044         FADD    f4,  f4,  f7
1045         FSUB    f5,  f6,  f5
1046         FADD    f8,  f8,  f11
1047         FSUB    f9,  f10, f9
1048         FADD    f12, f12, f15
1049         FSUB    f13, f14, f13
1050 #else
1051         FSUB    f0,  f0,  f3
1052         FADD    f1,  f1,  f2
1053         FSUB    f4,  f4,  f7
1054         FADD    f5,  f5,  f6
1055         FSUB    f8,  f8,  f11
1056         FADD    f9,  f9,  f10
1057         FSUB    f12, f12, f15
1058         FADD    f13, f13, f14
1059 #endif
1060 #endif
1061
1062         mr      BO, CO
1063         cmpwi   cr0, INCY, 2 * SIZE
1064         bne     LL(FinishN1)
1065
1066         LFD     f16,  0 * SIZE(CO)
1067         LFD     f17,  1 * SIZE(CO)
1068         LFD     f18,  2 * SIZE(CO)
1069         LFD     f19,  3 * SIZE(CO)
1070         LFD     f20,  4 * SIZE(CO)
1071         LFD     f21,  5 * SIZE(CO)
1072         LFD     f22,  6 * SIZE(CO)
1073         LFD     f23,  7 * SIZE(CO)
1074
1075         FMADD   f16, f30, f0,  f16
1076         FMADDR  f17, f30, f1,  f17
1077         FMADD   f18, f30, f4,  f18
1078         FMADDR  f19, f30, f5,  f19
1079
1080         FMADD   f20, f30, f8,  f20
1081         FMADDR  f21, f30, f9,  f21
1082         FMADD   f22, f30, f12, f22
1083         FMADDR  f23, f30, f13, f23
1084
1085         FMSUBR  f16, f31, f1,  f16
1086         FMADD   f17, f31, f0,  f17
1087         FMSUBR  f18, f31, f5,  f18
1088         FMADD   f19, f31, f4,  f19
1089
1090         FMSUBR  f20, f31, f9,  f20
1091         FMADD   f21, f31, f8,  f21
1092         FMSUBR  f22, f31, f13, f22
1093         FMADD   f23, f31, f12, f23
1094
1095         STFD    f16,  0 * SIZE(CO)
1096         STFD    f17,  1 * SIZE(CO)
1097         STFD    f18,  2 * SIZE(CO)
1098         STFD    f19,  3 * SIZE(CO)
1099
1100         STFD    f20,  4 * SIZE(CO)
1101         STFD    f21,  5 * SIZE(CO)
1102         STFD    f22,  6 * SIZE(CO)
1103         STFD    f23,  7 * SIZE(CO)
1104
1105         addi    CO, CO, 8 * SIZE
1106
1107         addi    J, J, -1
1108         cmpwi   cr0, J, 0
1109         bgt     LL(MainHead)
1110         b       LL(Remain)
1111         .align 4
1112
1113 LL(FinishN1):
1114         LFD     f16,  0 * SIZE(CO)
1115         LFD     f17,  1 * SIZE(CO)
1116         add     CO, CO, INCY
1117
1118         LFD     f18,  0 * SIZE(CO)
1119         LFD     f19,  1 * SIZE(CO)
1120         add     CO, CO, INCY
1121
1122         LFD     f20,  0 * SIZE(CO)
1123         LFD     f21,  1 * SIZE(CO)
1124         add     CO, CO, INCY
1125
1126         LFD     f22,  0 * SIZE(CO)
1127         LFD     f23,  1 * SIZE(CO)
1128         add     CO, CO, INCY
1129
1130         FMADD   f16, f30, f0,  f16
1131         FMADDR  f17, f30, f1,  f17
1132         FMADD   f18, f30, f4,  f18
1133         FMADDR  f19, f30, f5,  f19
1134
1135         FMADD   f20, f30, f8,  f20
1136         FMADDR  f21, f30, f9,  f21
1137         FMADD   f22, f30, f12, f22
1138         FMADDR  f23, f30, f13, f23
1139
1140         FMSUBR  f16, f31, f1,  f16
1141         FMADD   f17, f31, f0,  f17
1142         FMSUBR  f18, f31, f5,  f18
1143         FMADD   f19, f31, f4,  f19
1144
1145         FMSUBR  f20, f31, f9,  f20
1146         FMADD   f21, f31, f8,  f21
1147         FMSUBR  f22, f31, f13, f22
1148         FMADD   f23, f31, f12, f23
1149
1150         STFD    f16,  0 * SIZE(BO)
1151         STFD    f17,  1 * SIZE(BO)
1152         add     BO, BO, INCY
1153         STFD    f18,  0 * SIZE(BO)
1154         STFD    f19,  1 * SIZE(BO)
1155         add     BO, BO, INCY
1156
1157         STFD    f20,  0 * SIZE(BO)
1158         STFD    f21,  1 * SIZE(BO)
1159         add     BO, BO, INCY
1160         STFD    f22,  0 * SIZE(BO)
1161         STFD    f23,  1 * SIZE(BO)
1162
1163         addi    J, J, -1
1164         cmpwi   cr0, J, 0
1165         bgt     LL(MainHead)
1166         .align 4
1167
1168 LL(Remain):
1169         andi.   J, N, 3
1170         ble     LL(ISEnd)
1171         .align 4
1172
1173 LL(RemainHead):
1174         mr      AO1, A
1175         add     A,   A,  LDA
1176         mr      BO,  XP
1177         lfd     f0, FZERO
1178
1179         fmr      f1,  f0
1180         fmr      f2,  f0
1181         fmr      f3,  f0
1182         fmr      f4,  f0
1183         fmr      f5,  f0
1184         fmr      f6,  f0
1185         fmr      f7,  f0
1186         fmr      f8,  f0
1187         fmr      f9,  f0
1188         fmr      f10, f0
1189         fmr      f11, f0
1190         fmr      f12, f0
1191         fmr      f13, f0
1192         fmr      f14, f0
1193         fmr      f15, f0
1194
1195         srawi.  r0 , MIN_N, 3
1196         mtspr   CTR, r0
1197         ble     LL(RemainN3)
1198
1199         LFD     f16, 0 * SIZE(AO1)
1200         LFD     f17, 1 * SIZE(AO1)
1201         LFD     f18, 2 * SIZE(AO1)
1202         LFD     f19, 3 * SIZE(AO1)
1203
1204         LFD     f20, 4 * SIZE(AO1)
1205         LFD     f21, 5 * SIZE(AO1)
1206         LFD     f22, 6 * SIZE(AO1)
1207         LFD     f23, 7 * SIZE(AO1)
1208
1209         LFD     f24, 1 * SIZE(BO)
1210         LFD     f25, 2 * SIZE(BO)
1211         LFD     f26, 3 * SIZE(BO)
1212         LFD     f27, 4 * SIZE(BO)
1213
1214         LFD     f28, 5 * SIZE(BO)
1215         LFD     f29, 6 * SIZE(BO)
1216         LFD     f30, 7 * SIZE(BO)
1217         LFD     f31, 8 * SIZE(BO)
1218
1219         bdz     LL(RemainKernelSkip)
1220         .align 4
1221
1222 LL(RemainKernel):
1223         FMADD   f0,  f16,  f24, f0
1224         FMADD   f1,  f16,  f25, f1
1225         FMADD   f2,  f17,  f24, f2
1226         FMADD   f3,  f17,  f25, f3
1227
1228         FMADD   f4,  f18,  f26, f4
1229         FMADD   f5,  f18,  f27, f5
1230         FMADD   f6,  f19,  f26, f6
1231         FMADD   f7,  f19,  f27, f7
1232
1233         LFD     f16,  8 * SIZE(AO1)
1234         LFD     f17,  9 * SIZE(AO1)
1235         LFD     f18, 10 * SIZE(AO1)
1236         LFD     f19, 11 * SIZE(AO1)
1237
1238         LFD     f24,  9 * SIZE(BO)
1239         LFD     f25, 10 * SIZE(BO)
1240         LFD     f26, 11 * SIZE(BO)
1241         LFD     f27, 12 * SIZE(BO)
1242
1243         FMADD   f8,  f20,  f28, f8
1244         FMADD   f9,  f20,  f29, f9
1245         FMADD   f10, f21,  f28, f10
1246         FMADD   f11, f21,  f29, f11
1247
1248         FMADD   f12, f22,  f30, f12
1249         FMADD   f13, f22,  f31, f13
1250         FMADD   f14, f23,  f30, f14
1251         FMADD   f15, f23,  f31, f15
1252
1253         LFD     f20, 12 * SIZE(AO1)
1254         LFD     f21, 13 * SIZE(AO1)
1255         LFD     f22, 14 * SIZE(AO1)
1256         LFD     f23, 15 * SIZE(AO1)
1257
1258         LFD     f28, 13 * SIZE(BO)
1259         LFD     f29, 14 * SIZE(BO)
1260         LFD     f30, 15 * SIZE(BO)
1261         LFD     f31, 16 * SIZE(BO)
1262
1263         FMADD   f0,  f16,  f24, f0
1264         FMADD   f1,  f16,  f25, f1
1265         FMADD   f2,  f17,  f24, f2
1266         FMADD   f3,  f17,  f25, f3
1267
1268         FMADD   f4,  f18,  f26, f4
1269         FMADD   f5,  f18,  f27, f5
1270         FMADD   f6,  f19,  f26, f6
1271         FMADD   f7,  f19,  f27, f7
1272
1273         LFD     f16, 16 * SIZE(AO1)
1274         LFD     f17, 17 * SIZE(AO1)
1275         LFD     f18, 18 * SIZE(AO1)
1276         LFD     f19, 19 * SIZE(AO1)
1277
1278         LFD     f24, 17 * SIZE(BO)
1279         LFD     f25, 18 * SIZE(BO)
1280         LFD     f26, 19 * SIZE(BO)
1281         LFD     f27, 20 * SIZE(BO)
1282
1283         FMADD   f8,  f20,  f28, f8
1284         FMADD   f9,  f20,  f29, f9
1285         FMADD   f10, f21,  f28, f10
1286         FMADD   f11, f21,  f29, f11
1287
1288         FMADD   f12, f22,  f30, f12
1289         FMADD   f13, f22,  f31, f13
1290         FMADD   f14, f23,  f30, f14
1291         FMADD   f15, f23,  f31, f15
1292
1293         LFD     f20, 20 * SIZE(AO1)
1294         LFD     f21, 21 * SIZE(AO1)
1295         LFD     f22, 22 * SIZE(AO1)
1296         LFD     f23, 23 * SIZE(AO1)
1297
1298         LFD     f28, 21 * SIZE(BO)
1299         LFD     f29, 22 * SIZE(BO)
1300         LFD     f30, 23 * SIZE(BO)
1301         LFD     f31, 24 * SIZE(BO)
1302
1303         addi    AO1, AO1, 16 * SIZE
1304         addi    BO,  BO,  16 * SIZE
1305
1306         DCBT(AO1, PREA)
1307
1308         bdnz    LL(RemainKernel)
1309         .align 4
1310
1311 LL(RemainKernelSkip):
1312         FMADD   f0,  f16,  f24, f0
1313         FMADD   f1,  f16,  f25, f1
1314         FMADD   f2,  f17,  f24, f2
1315         FMADD   f3,  f17,  f25, f3
1316
1317         FMADD   f4,  f18,  f26, f4
1318         FMADD   f5,  f18,  f27, f5
1319         FMADD   f6,  f19,  f26, f6
1320         FMADD   f7,  f19,  f27, f7
1321
1322         LFD     f16,  8 * SIZE(AO1)
1323         LFD     f17,  9 * SIZE(AO1)
1324         LFD     f18, 10 * SIZE(AO1)
1325         LFD     f19, 11 * SIZE(AO1)
1326
1327         LFD     f24,  9 * SIZE(BO)
1328         LFD     f25, 10 * SIZE(BO)
1329         LFD     f26, 11 * SIZE(BO)
1330         LFD     f27, 12 * SIZE(BO)
1331
1332         FMADD   f8,  f20,  f28, f8
1333         FMADD   f9,  f20,  f29, f9
1334         FMADD   f10, f21,  f28, f10
1335         FMADD   f11, f21,  f29, f11
1336
1337         FMADD   f12, f22,  f30, f12
1338         FMADD   f13, f22,  f31, f13
1339         FMADD   f14, f23,  f30, f14
1340         FMADD   f15, f23,  f31, f15
1341
1342         LFD     f20, 12 * SIZE(AO1)
1343         LFD     f21, 13 * SIZE(AO1)
1344         LFD     f22, 14 * SIZE(AO1)
1345         LFD     f23, 15 * SIZE(AO1)
1346
1347         LFD     f28, 13 * SIZE(BO)
1348         LFD     f29, 14 * SIZE(BO)
1349         LFD     f30, 15 * SIZE(BO)
1350         LFDU    f31, 16 * SIZE(BO)
1351
1352         FMADD   f0,  f16,  f24, f0
1353         FMADD   f1,  f16,  f25, f1
1354         FMADD   f2,  f17,  f24, f2
1355         FMADD   f3,  f17,  f25, f3
1356
1357         FMADD   f4,  f18,  f26, f4
1358         FMADD   f5,  f18,  f27, f5
1359         FMADD   f6,  f19,  f26, f6
1360         FMADD   f7,  f19,  f27, f7
1361
1362         FMADD   f8,  f20,  f28, f8
1363         FMADD   f9,  f20,  f29, f9
1364         FMADD   f10, f21,  f28, f10
1365         FMADD   f11, f21,  f29, f11
1366
1367         FMADD   f12, f22,  f30, f12
1368         FMADD   f13, f22,  f31, f13
1369         FMADD   f14, f23,  f30, f14
1370         FMADD   f15, f23,  f31, f15
1371
1372         addi    AO1, AO1, 16 * SIZE
1373         .align 4
1374
1375 LL(RemainN3):
1376         andi.   r0,  MIN_N, 7
1377         mtspr   CTR, r0
1378         ble     LL(RemainFinish)
1379         .align 4
1380
1381         LFD     f16, 0 * SIZE(AO1)
1382         LFD     f17, 1 * SIZE(AO1)
1383         LFD     f24, 1 * SIZE(BO)
1384         LFDU    f25, 2 * SIZE(BO)
1385         addi    AO1, AO1, 2 * SIZE
1386         bdz     LL(RemainN3KernelSkip)
1387         .align 4
1388
1389 LL(RemainN3Kernel):
1390         FMADD   f0,  f16,  f24, f0
1391         FMADD   f1,  f16,  f25, f1
1392         FMADD   f2,  f17,  f24, f2
1393         FMADD   f3,  f17,  f25, f3
1394
1395         LFD     f16, 0 * SIZE(AO1)
1396         LFD     f17, 1 * SIZE(AO1)
1397         LFD     f24, 1 * SIZE(BO)
1398         LFDU    f25, 2 * SIZE(BO)
1399         addi    AO1, AO1, 2 * SIZE
1400         bdnz    LL(RemainN3Kernel)
1401         .align 4
1402
1403 LL(RemainN3KernelSkip):
1404         FMADD   f0,  f16,  f24, f0
1405         FMADD   f1,  f16,  f25, f1
1406         FMADD   f2,  f17,  f24, f2
1407         FMADD   f3,  f17,  f25, f3
1408         .align 4
1409
1410 LL(RemainFinish):
1411         lfd     f30, ALPHA_R
1412         lfd     f31, ALPHA_I
1413         LFD     f16,  0 * SIZE(CO)
1414         LFD     f17,  1 * SIZE(CO)
1415
1416         FADD    f0, f0, f4
1417         FADD    f1, f1, f5
1418         FADD    f2, f2, f6
1419         FADD    f3, f3, f7
1420
1421         FADD    f8,  f8,  f12
1422         FADD    f9,  f9,  f13
1423         FADD    f10, f10, f14
1424         FADD    f11, f11, f15
1425
1426         FADD    f0, f0, f8
1427         FADD    f1, f1, f9
1428         FADD    f2, f2, f10
1429         FADD    f3, f3, f11
1430
1431 #ifndef XCONJ
1432 #ifndef CONJ
1433         FSUB    f0,  f0,  f3
1434         FADD    f1,  f1,  f2
1435 #else
1436         FADD    f0,  f0,  f3
1437         FSUB    f1,  f1,  f2
1438 #endif
1439 #else
1440 #ifndef CONJ
1441         FADD    f0,  f0,  f3
1442         FSUB    f1,  f2,  f1
1443 #else
1444         FSUB    f0,  f0,  f3
1445         FADD    f1,  f1,  f2
1446 #endif
1447 #endif
1448
1449         FMADD   f16, f30, f0,  f16
1450         FMADDR  f17, f30, f1,  f17
1451         FMSUBR  f16, f31, f1,  f16
1452         FMADD   f17, f31, f0,  f17
1453
1454         STFD    f16,  0 * SIZE(CO)
1455         STFD    f17,  1 * SIZE(CO)
1456         add     CO, CO, INCY
1457
1458         addi    J, J, -1
1459         cmpi    cr0, 0, J, 0
1460         bgt     LL(RemainHead)
1461         .align 4
1462
1463 LL(ISEnd):
1464         subf    A, PLDA_M, A
1465         addi    IS, IS, P
1466
1467         cmp     cr0, 0, IS, M
1468         blt     LL(ISLoop)
1469         .align 4
1470
1471 LL(End):
1472         li      r3, 0
1473
1474         lfd     f14,     0(SP)
1475         lfd     f15,     8(SP)
1476         lfd     f16,    16(SP)
1477         lfd     f17,    24(SP)
1478         lfd     f18,    32(SP)
1479         lfd     f19,    40(SP)
1480         lfd     f20,    48(SP)
1481         lfd     f21,    56(SP)
1482         lfd     f22,    64(SP)
1483         lfd     f23,    72(SP)
1484         lfd     f24,    80(SP)
1485         lfd     f25,    88(SP)
1486         lfd     f26,    96(SP)
1487         lfd     f27,   104(SP)
1488         lfd     f28,   112(SP)
1489         lfd     f29,   120(SP)
1490         lfd     f30,   128(SP)
1491         lfd     f31,   136(SP)
1492
1493 #ifdef __64BIT__
1494         ld      r14,   144(SP)
1495         ld      r15,   152(SP)
1496         ld      r16,   160(SP)
1497         ld      r17,   168(SP)
1498         ld      r18,   176(SP)
1499         ld      r19,   184(SP)
1500         ld      r20,   192(SP)
1501         ld      r21,   200(SP)
1502         ld      r22,   208(SP)
1503         ld      r23,   216(SP)
1504         ld      r24,   224(SP)
1505         ld      r25,   232(SP)
1506 #else
1507         lwz     r14,   144(SP)
1508         lwz     r15,   148(SP)
1509         lwz     r16,   152(SP)
1510         lwz     r17,   156(SP)
1511         lwz     r18,   160(SP)
1512         lwz     r19,   164(SP)
1513         lwz     r20,   168(SP)
1514         lwz     r21,   172(SP)
1515         lwz     r22,   176(SP)
1516         lwz     r23,   180(SP)
1517         lwz     r24,   184(SP)
1518         lwz     r25,   188(SP)
1519 #endif
1520
1521         addi    SP, SP, STACKSIZE
1522
1523         blr
1524
1525         EPILOGUE
1526
1527 #endif