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