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