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