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