added dgemm-, dtrmm-, zgemm- and ztrmm-kernel for power8
[platform/upstream/openblas.git] / kernel / power / dgemm_logic_16x4_power8.S
1         srawi.          J,      N,      2
2         ble             DGEMM_L4_END
3
4 DGEMM_L4_BEGIN:
5
6         mr              CO,     C
7         mr              AO,     A
8         slwi            T1,     LDC     ,       2
9         add             C,      C,      T1
10         srawi.          I,      M,      4
11         ble             DGEMM_L4x16_END
12
13 DGEMM_L4x16_BEGIN:
14
15
16         mr              BO,     B
17         srawi.          L,      K,      3
18         ble             DGEMM_L4x16_SUB0
19         cmpwi           cr0,    L,      1
20         ble             DGEMM_L4x16_SUB4
21
22 DGEMM_L4x16_LOOP_START:
23
24         dcbt            AO,     PRE
25         LOAD4x16_1
26         dcbt            AO,     PRE
27         KERNEL4x16_I1
28         dcbt            AO,     PRE
29         KERNEL4x16_2
30         dcbt            AO,     PRE
31         KERNEL4x16_1
32         dcbt            AO,     PRE
33         KERNEL4x16_2
34
35         dcbt            AO,     PRE
36         KERNEL4x16_1
37         dcbt            AO,     PRE
38         KERNEL4x16_2
39         dcbt            AO,     PRE
40         KERNEL4x16_1
41         dcbt            AO,     PRE
42         KERNEL4x16_2
43
44         addic.          L,      L,      -2
45         ble             DGEMM_L4x16_LOOP_END
46
47         .align 5
48
49 DGEMM_L4x16_LOOP:
50
51         dcbt            AO,     PRE
52         KERNEL4x16_1
53         dcbt            AO,     PRE
54         KERNEL4x16_2
55         dcbt            AO,     PRE
56         KERNEL4x16_1
57         dcbt            AO,     PRE
58         KERNEL4x16_2
59
60         dcbt            AO,     PRE
61         KERNEL4x16_1
62         dcbt            AO,     PRE
63         KERNEL4x16_2
64         dcbt            AO,     PRE
65         KERNEL4x16_1
66         dcbt            AO,     PRE
67         KERNEL4x16_2
68
69         addic.          L,      L,      -1
70         bgt             DGEMM_L4x16_LOOP
71
72 DGEMM_L4x16_LOOP_END:
73
74         dcbt            AO,     PRE
75         KERNEL4x16_1
76         dcbt            AO,     PRE
77         KERNEL4x16_2
78         dcbt            AO,     PRE
79         KERNEL4x16_1
80         dcbt            AO,     PRE
81         KERNEL4x16_2
82
83         dcbt            AO,     PRE
84         KERNEL4x16_1
85         dcbt            AO,     PRE
86         KERNEL4x16_2
87         dcbt            AO,     PRE
88         KERNEL4x16_1
89         KERNEL4x16_E2
90
91         b               DGEMM_L4x16_SUB1
92
93 DGEMM_L4x16_SUB4:
94
95         dcbt            AO,     PRE
96         KERNEL4x16_SUBI1
97         dcbt            AO,     PRE
98         KERNEL4x16_SUB1
99         dcbt            AO,     PRE
100         KERNEL4x16_SUB1
101         dcbt            AO,     PRE
102         KERNEL4x16_SUB1
103
104         KERNEL4x16_SUB1
105         KERNEL4x16_SUB1
106         KERNEL4x16_SUB1
107         KERNEL4x16_SUB1
108
109         b               DGEMM_L4x16_SUB1
110
111 DGEMM_L4x16_SUB0:
112
113         andi.           L,      K,      7
114
115         KERNEL4x16_SUBI1
116
117         addic.          L,      L,      -1
118         ble             DGEMM_L4x16_SAVE
119         b               DGEMM_L4x16_SUB2
120
121 DGEMM_L4x16_SUB1:
122
123         andi.           L,      K,      7
124         ble             DGEMM_L4x16_SAVE
125
126 DGEMM_L4x16_SUB2:
127
128         KERNEL4x16_SUB1
129
130         addic.          L,      L,      -1
131         bgt             DGEMM_L4x16_SUB2
132
133 DGEMM_L4x16_SAVE:
134
135         SAVE4x16
136
137         addic.          I,      I,      -1
138         bgt             DGEMM_L4x16_BEGIN
139
140 DGEMM_L4x16_END:
141
142 DGEMM_L4x8_BEGIN:
143
144         andi.           T2,     M,      15
145         ble             DGEMM_L4x1_END
146
147         andi.           T1,     M,      8
148         ble             DGEMM_L4x8_END
149         mr              BO,     B
150         srawi.          L,      K,      3
151         ble             DGEMM_L4x8_SUB0
152         cmpwi           cr0,    L,      1
153         ble             DGEMM_L4x8_SUB4
154
155 DGEMM_L4x8_LOOP_START:
156
157         LOAD4x8_1
158         KERNEL4x8_I1
159         KERNEL4x8_2
160         KERNEL4x8_1
161         KERNEL4x8_2
162
163         KERNEL4x8_1
164         KERNEL4x8_2
165         KERNEL4x8_1
166         KERNEL4x8_2
167
168         addic.          L,      L,      -2
169         ble             DGEMM_L4x8_LOOP_END
170
171         .align 5
172
173 DGEMM_L4x8_LOOP:
174
175         KERNEL4x8_1
176         KERNEL4x8_2
177         KERNEL4x8_1
178         KERNEL4x8_2
179
180         KERNEL4x8_1
181         KERNEL4x8_2
182         KERNEL4x8_1
183         KERNEL4x8_2
184
185         addic.          L,      L,      -1
186         bgt             DGEMM_L4x8_LOOP
187
188 DGEMM_L4x8_LOOP_END:
189
190         KERNEL4x8_1
191         KERNEL4x8_2
192         KERNEL4x8_1
193         KERNEL4x8_2
194
195         KERNEL4x8_1
196         KERNEL4x8_2
197         KERNEL4x8_1
198         KERNEL4x8_E2
199
200         b               DGEMM_L4x8_SUB1
201
202 DGEMM_L4x8_SUB4:
203
204         KERNEL4x8_SUBI1
205         KERNEL4x8_SUB1
206         KERNEL4x8_SUB1
207         KERNEL4x8_SUB1
208
209         KERNEL4x8_SUB1
210         KERNEL4x8_SUB1
211         KERNEL4x8_SUB1
212         KERNEL4x8_SUB1
213
214         b               DGEMM_L4x8_SUB1
215
216 DGEMM_L4x8_SUB0:
217
218         andi.           L,      K,      7
219
220         KERNEL4x8_SUBI1
221
222         addic.          L,      L,      -1
223         ble             DGEMM_L4x8_SAVE
224         b               DGEMM_L4x8_SUB2
225
226 DGEMM_L4x8_SUB1:
227
228         andi.           L,      K,      7
229         ble             DGEMM_L4x8_SAVE
230
231 DGEMM_L4x8_SUB2:
232
233         KERNEL4x8_SUB1
234
235         addic.          L,      L,      -1
236         bgt             DGEMM_L4x8_SUB2
237
238 DGEMM_L4x8_SAVE:
239
240         SAVE4x8
241
242 DGEMM_L4x8_END:
243
244 DGEMM_L4x4_BEGIN:
245
246
247         andi.           T1,     M,      4
248         ble             DGEMM_L4x4_END
249         mr              BO,     B
250         srawi.          L,      K,      3
251         ble             DGEMM_L4x4_SUB0
252         cmpwi           cr0,    L,      1
253         ble             DGEMM_L4x4_SUB4
254
255 DGEMM_L4x4_LOOP_START:
256
257         LOAD4x4_1
258         KERNEL4x4_I1
259         KERNEL4x4_2
260         KERNEL4x4_1
261         KERNEL4x4_2
262
263         KERNEL4x4_1
264         KERNEL4x4_2
265         KERNEL4x4_1
266         KERNEL4x4_2
267
268         addic.          L,      L,      -2
269         ble             DGEMM_L4x4_LOOP_END
270
271         .align 5
272
273 DGEMM_L4x4_LOOP:
274
275         KERNEL4x4_1
276         KERNEL4x4_2
277         KERNEL4x4_1
278         KERNEL4x4_2
279
280         KERNEL4x4_1
281         KERNEL4x4_2
282         KERNEL4x4_1
283         KERNEL4x4_2
284
285         addic.          L,      L,      -1
286         bgt             DGEMM_L4x4_LOOP
287
288 DGEMM_L4x4_LOOP_END:
289
290         KERNEL4x4_1
291         KERNEL4x4_2
292         KERNEL4x4_1
293         KERNEL4x4_2
294
295         KERNEL4x4_1
296         KERNEL4x4_2
297         KERNEL4x4_1
298         KERNEL4x4_E2
299
300         b               DGEMM_L4x4_SUB1
301
302 DGEMM_L4x4_SUB4:
303
304         KERNEL4x4_SUBI1
305         KERNEL4x4_SUB1
306         KERNEL4x4_SUB1
307         KERNEL4x4_SUB1
308
309         KERNEL4x4_SUB1
310         KERNEL4x4_SUB1
311         KERNEL4x4_SUB1
312         KERNEL4x4_SUB1
313
314         b               DGEMM_L4x4_SUB1
315
316 DGEMM_L4x4_SUB0:
317
318         andi.           L,      K,      7
319
320         KERNEL4x4_SUBI1
321
322         addic.          L,      L,      -1
323         ble             DGEMM_L4x4_SAVE
324         b               DGEMM_L4x4_SUB2
325
326 DGEMM_L4x4_SUB1:
327
328         andi.           L,      K,      7
329         ble             DGEMM_L4x4_SAVE
330
331 DGEMM_L4x4_SUB2:
332
333         KERNEL4x4_SUB1
334
335         addic.          L,      L,      -1
336         bgt             DGEMM_L4x4_SUB2
337
338 DGEMM_L4x4_SAVE:
339
340         SAVE4x4
341
342 DGEMM_L4x4_END:
343
344 DGEMM_L4x2_BEGIN:
345
346
347         andi.           T1,     M,      2
348         ble             DGEMM_L4x2_END
349         mr              BO,     B
350         srawi.          L,      K,      3
351         ble             DGEMM_L4x2_SUB0
352         cmpwi           cr0,    L,      1
353         ble             DGEMM_L4x2_SUB4
354
355 DGEMM_L4x2_LOOP_START:
356
357         LOAD4x2_1
358         KERNEL4x2_I1
359         KERNEL4x2_2
360         KERNEL4x2_1
361         KERNEL4x2_2
362
363         KERNEL4x2_1
364         KERNEL4x2_2
365         KERNEL4x2_1
366         KERNEL4x2_2
367
368         addic.          L,      L,      -2
369         ble             DGEMM_L4x2_LOOP_END
370
371         .align 5
372
373 DGEMM_L4x2_LOOP:
374
375         KERNEL4x2_1
376         KERNEL4x2_2
377         KERNEL4x2_1
378         KERNEL4x2_2
379
380         KERNEL4x2_1
381         KERNEL4x2_2
382         KERNEL4x2_1
383         KERNEL4x2_2
384
385         addic.          L,      L,      -1
386         bgt             DGEMM_L4x2_LOOP
387
388 DGEMM_L4x2_LOOP_END:
389
390         KERNEL4x2_1
391         KERNEL4x2_2
392         KERNEL4x2_1
393         KERNEL4x2_2
394
395         KERNEL4x2_1
396         KERNEL4x2_2
397         KERNEL4x2_1
398         KERNEL4x2_E2
399
400         b               DGEMM_L4x2_SUB1
401
402 DGEMM_L4x2_SUB4:
403
404         KERNEL4x2_SUBI1
405         KERNEL4x2_SUB1
406         KERNEL4x2_SUB1
407         KERNEL4x2_SUB1
408
409         KERNEL4x2_SUB1
410         KERNEL4x2_SUB1
411         KERNEL4x2_SUB1
412         KERNEL4x2_SUB1
413
414         b               DGEMM_L4x2_SUB1
415
416 DGEMM_L4x2_SUB0:
417
418         andi.           L,      K,      7
419
420         KERNEL4x2_SUBI1
421
422         addic.          L,      L,      -1
423         ble             DGEMM_L4x2_SAVE
424         b               DGEMM_L4x2_SUB2
425
426 DGEMM_L4x2_SUB1:
427
428         andi.           L,      K,      7
429         ble             DGEMM_L4x2_SAVE
430
431 DGEMM_L4x2_SUB2:
432
433         KERNEL4x2_SUB1
434
435         addic.          L,      L,      -1
436         bgt             DGEMM_L4x2_SUB2
437
438 DGEMM_L4x2_SAVE:
439
440         SAVE4x2
441
442 DGEMM_L4x2_END:
443
444 DGEMM_L4x1_BEGIN:
445
446
447         andi.           T1,     M,      1
448         ble             DGEMM_L4x1_END
449         mr              BO,     B
450         srawi.          L,      K,      3
451         ble             DGEMM_L4x1_SUB0
452         cmpwi           cr0,    L,      1
453         ble             DGEMM_L4x1_SUB4
454
455 DGEMM_L4x1_LOOP_START:
456
457         LOAD4x1_1
458         KERNEL4x1_I1
459         KERNEL4x1_2
460         KERNEL4x1_1
461         KERNEL4x1_2
462
463         KERNEL4x1_1
464         KERNEL4x1_2
465         KERNEL4x1_1
466         KERNEL4x1_2
467
468         addic.          L,      L,      -2
469         ble             DGEMM_L4x1_LOOP_END
470
471         .align 5
472
473 DGEMM_L4x1_LOOP:
474
475         KERNEL4x1_1
476         KERNEL4x1_2
477         KERNEL4x1_1
478         KERNEL4x1_2
479
480         KERNEL4x1_1
481         KERNEL4x1_2
482         KERNEL4x1_1
483         KERNEL4x1_2
484
485         addic.          L,      L,      -1
486         bgt             DGEMM_L4x1_LOOP
487
488 DGEMM_L4x1_LOOP_END:
489
490         KERNEL4x1_1
491         KERNEL4x1_2
492         KERNEL4x1_1
493         KERNEL4x1_2
494
495         KERNEL4x1_1
496         KERNEL4x1_2
497         KERNEL4x1_1
498         KERNEL4x1_E2
499
500         b               DGEMM_L4x1_SUB1
501
502 DGEMM_L4x1_SUB4:
503
504         KERNEL4x1_SUBI1
505         KERNEL4x1_SUB1
506         KERNEL4x1_SUB1
507         KERNEL4x1_SUB1
508
509         KERNEL4x1_SUB1
510         KERNEL4x1_SUB1
511         KERNEL4x1_SUB1
512         KERNEL4x1_SUB1
513
514         b               DGEMM_L4x1_SUB1
515
516 DGEMM_L4x1_SUB0:
517
518         andi.           L,      K,      7
519
520         KERNEL4x1_SUBI1
521
522         addic.          L,      L,      -1
523         ble             DGEMM_L4x1_SAVE
524         b               DGEMM_L4x1_SUB2
525
526 DGEMM_L4x1_SUB1:
527
528         andi.           L,      K,      7
529         ble             DGEMM_L4x1_SAVE
530
531 DGEMM_L4x1_SUB2:
532
533         KERNEL4x1_SUB1
534
535         addic.          L,      L,      -1
536         bgt             DGEMM_L4x1_SUB2
537
538 DGEMM_L4x1_SAVE:
539
540         SAVE4x1
541
542 DGEMM_L4x1_END:
543
544         slwi            T1,     K,      5
545         add             B,      B,      T1
546
547         addic.          J,      J,      -1
548         bgt             DGEMM_L4_BEGIN
549
550         andi.           T2,     N,      3
551         ble             L999
552
553 DGEMM_L4_END:
554
555         b               DGEMM_L2_BEGIN
556
557 L999_H1:
558
559         b               L999
560
561 DGEMM_L2_BEGIN:
562
563         andi.           T1,     N,      2
564         ble             DGEMM_L2_END
565         mr              CO,     C
566         mr              AO,     A
567         slwi            T1,     LDC     ,       1
568         add             C,      C,      T1
569         srawi.          I,      M,      4
570         ble             DGEMM_L2x16_END
571
572 DGEMM_L2x16_BEGIN:
573
574
575         mr              BO,     B
576         srawi.          L,      K,      3
577         ble             DGEMM_L2x16_SUB0
578         cmpwi           cr0,    L,      1
579         ble             DGEMM_L2x16_SUB4
580
581 DGEMM_L2x16_LOOP_START:
582
583         dcbt            AO,     PRE
584         LOAD2x16_1
585         dcbt            AO,     PRE
586         KERNEL2x16_I1
587         dcbt            AO,     PRE
588         KERNEL2x16_2
589         dcbt            AO,     PRE
590         KERNEL2x16_1
591         dcbt            AO,     PRE
592         KERNEL2x16_2
593
594         dcbt            AO,     PRE
595         KERNEL2x16_1
596         dcbt            AO,     PRE
597         KERNEL2x16_2
598         dcbt            AO,     PRE
599         KERNEL2x16_1
600         dcbt            AO,     PRE
601         KERNEL2x16_2
602
603         addic.          L,      L,      -2
604         ble             DGEMM_L2x16_LOOP_END
605
606         .align 5
607
608 DGEMM_L2x16_LOOP:
609
610         dcbt            AO,     PRE
611         KERNEL2x16_1
612         dcbt            AO,     PRE
613         KERNEL2x16_2
614         dcbt            AO,     PRE
615         KERNEL2x16_1
616         dcbt            AO,     PRE
617         KERNEL2x16_2
618
619         dcbt            AO,     PRE
620         KERNEL2x16_1
621         dcbt            AO,     PRE
622         KERNEL2x16_2
623         dcbt            AO,     PRE
624         KERNEL2x16_1
625         dcbt            AO,     PRE
626         KERNEL2x16_2
627
628         addic.          L,      L,      -1
629         bgt             DGEMM_L2x16_LOOP
630
631 DGEMM_L2x16_LOOP_END:
632
633         dcbt            AO,     PRE
634         KERNEL2x16_1
635         dcbt            AO,     PRE
636         KERNEL2x16_2
637         dcbt            AO,     PRE
638         KERNEL2x16_1
639         dcbt            AO,     PRE
640         KERNEL2x16_2
641
642         dcbt            AO,     PRE
643         KERNEL2x16_1
644         dcbt            AO,     PRE
645         KERNEL2x16_2
646         dcbt            AO,     PRE
647         KERNEL2x16_1
648         KERNEL2x16_E2
649
650         b               DGEMM_L2x16_SUB1
651
652 DGEMM_L2x16_SUB4:
653
654         dcbt            AO,     PRE
655         KERNEL2x16_SUBI1
656         dcbt            AO,     PRE
657         KERNEL2x16_SUB1
658         dcbt            AO,     PRE
659         KERNEL2x16_SUB1
660         dcbt            AO,     PRE
661         KERNEL2x16_SUB1
662
663         KERNEL2x16_SUB1
664         KERNEL2x16_SUB1
665         KERNEL2x16_SUB1
666         KERNEL2x16_SUB1
667
668         b               DGEMM_L2x16_SUB1
669
670 DGEMM_L2x16_SUB0:
671
672         andi.           L,      K,      7
673
674         KERNEL2x16_SUBI1
675
676         addic.          L,      L,      -1
677         ble             DGEMM_L2x16_SAVE
678         b               DGEMM_L2x16_SUB2
679
680 DGEMM_L2x16_SUB1:
681
682         andi.           L,      K,      7
683         ble             DGEMM_L2x16_SAVE
684
685 DGEMM_L2x16_SUB2:
686
687         KERNEL2x16_SUB1
688
689         addic.          L,      L,      -1
690         bgt             DGEMM_L2x16_SUB2
691
692 DGEMM_L2x16_SAVE:
693
694         SAVE2x16
695
696         addic.          I,      I,      -1
697         bgt             DGEMM_L2x16_BEGIN
698
699 DGEMM_L2x16_END:
700
701 DGEMM_L2x8_BEGIN:
702
703         andi.           T2,     M,      15
704         ble             DGEMM_L2x1_END
705
706         andi.           T1,     M,      8
707         ble             DGEMM_L2x8_END
708         mr              BO,     B
709         srawi.          L,      K,      3
710         ble             DGEMM_L2x8_SUB0
711         cmpwi           cr0,    L,      1
712         ble             DGEMM_L2x8_SUB4
713
714 DGEMM_L2x8_LOOP_START:
715
716         LOAD2x8_1
717         KERNEL2x8_I1
718         KERNEL2x8_2
719         KERNEL2x8_1
720         KERNEL2x8_2
721
722         KERNEL2x8_1
723         KERNEL2x8_2
724         KERNEL2x8_1
725         KERNEL2x8_2
726
727         addic.          L,      L,      -2
728         ble             DGEMM_L2x8_LOOP_END
729
730         .align 5
731
732 DGEMM_L2x8_LOOP:
733
734         KERNEL2x8_1
735         KERNEL2x8_2
736         KERNEL2x8_1
737         KERNEL2x8_2
738
739         KERNEL2x8_1
740         KERNEL2x8_2
741         KERNEL2x8_1
742         KERNEL2x8_2
743
744         addic.          L,      L,      -1
745         bgt             DGEMM_L2x8_LOOP
746
747 DGEMM_L2x8_LOOP_END:
748
749         KERNEL2x8_1
750         KERNEL2x8_2
751         KERNEL2x8_1
752         KERNEL2x8_2
753
754         KERNEL2x8_1
755         KERNEL2x8_2
756         KERNEL2x8_1
757         KERNEL2x8_E2
758
759         b               DGEMM_L2x8_SUB1
760
761 DGEMM_L2x8_SUB4:
762
763         KERNEL2x8_SUBI1
764         KERNEL2x8_SUB1
765         KERNEL2x8_SUB1
766         KERNEL2x8_SUB1
767
768         KERNEL2x8_SUB1
769         KERNEL2x8_SUB1
770         KERNEL2x8_SUB1
771         KERNEL2x8_SUB1
772
773         b               DGEMM_L2x8_SUB1
774
775 DGEMM_L2x8_SUB0:
776
777         andi.           L,      K,      7
778
779         KERNEL2x8_SUBI1
780
781         addic.          L,      L,      -1
782         ble             DGEMM_L2x8_SAVE
783         b               DGEMM_L2x8_SUB2
784
785 DGEMM_L2x8_SUB1:
786
787         andi.           L,      K,      7
788         ble             DGEMM_L2x8_SAVE
789
790 DGEMM_L2x8_SUB2:
791
792         KERNEL2x8_SUB1
793
794         addic.          L,      L,      -1
795         bgt             DGEMM_L2x8_SUB2
796
797 DGEMM_L2x8_SAVE:
798
799         SAVE2x8
800
801 DGEMM_L2x8_END:
802
803 DGEMM_L2x4_BEGIN:
804
805
806         andi.           T1,     M,      4
807         ble             DGEMM_L2x4_END
808         mr              BO,     B
809         srawi.          L,      K,      3
810         ble             DGEMM_L2x4_SUB0
811         cmpwi           cr0,    L,      1
812         ble             DGEMM_L2x4_SUB4
813
814 DGEMM_L2x4_LOOP_START:
815
816         LOAD2x4_1
817         KERNEL2x4_I1
818         KERNEL2x4_2
819         KERNEL2x4_1
820         KERNEL2x4_2
821
822         KERNEL2x4_1
823         KERNEL2x4_2
824         KERNEL2x4_1
825         KERNEL2x4_2
826
827         addic.          L,      L,      -2
828         ble             DGEMM_L2x4_LOOP_END
829
830         .align 5
831
832 DGEMM_L2x4_LOOP:
833
834         KERNEL2x4_1
835         KERNEL2x4_2
836         KERNEL2x4_1
837         KERNEL2x4_2
838
839         KERNEL2x4_1
840         KERNEL2x4_2
841         KERNEL2x4_1
842         KERNEL2x4_2
843
844         addic.          L,      L,      -1
845         bgt             DGEMM_L2x4_LOOP
846
847 DGEMM_L2x4_LOOP_END:
848
849         KERNEL2x4_1
850         KERNEL2x4_2
851         KERNEL2x4_1
852         KERNEL2x4_2
853
854         KERNEL2x4_1
855         KERNEL2x4_2
856         KERNEL2x4_1
857         KERNEL2x4_E2
858
859         b               DGEMM_L2x4_SUB1
860
861 DGEMM_L2x4_SUB4:
862
863         KERNEL2x4_SUBI1
864         KERNEL2x4_SUB1
865         KERNEL2x4_SUB1
866         KERNEL2x4_SUB1
867
868         KERNEL2x4_SUB1
869         KERNEL2x4_SUB1
870         KERNEL2x4_SUB1
871         KERNEL2x4_SUB1
872
873         b               DGEMM_L2x4_SUB1
874
875 DGEMM_L2x4_SUB0:
876
877         andi.           L,      K,      7
878
879         KERNEL2x4_SUBI1
880
881         addic.          L,      L,      -1
882         ble             DGEMM_L2x4_SAVE
883         b               DGEMM_L2x4_SUB2
884
885 DGEMM_L2x4_SUB1:
886
887         andi.           L,      K,      7
888         ble             DGEMM_L2x4_SAVE
889
890 DGEMM_L2x4_SUB2:
891
892         KERNEL2x4_SUB1
893
894         addic.          L,      L,      -1
895         bgt             DGEMM_L2x4_SUB2
896
897 DGEMM_L2x4_SAVE:
898
899         SAVE2x4
900
901 DGEMM_L2x4_END:
902
903 DGEMM_L2x2_BEGIN:
904
905
906         andi.           T1,     M,      2
907         ble             DGEMM_L2x2_END
908         mr              BO,     B
909         srawi.          L,      K,      3
910         ble             DGEMM_L2x2_SUB0
911         cmpwi           cr0,    L,      1
912         ble             DGEMM_L2x2_SUB4
913
914 DGEMM_L2x2_LOOP_START:
915
916         LOAD2x2_1
917         KERNEL2x2_I1
918         KERNEL2x2_2
919         KERNEL2x2_1
920         KERNEL2x2_2
921
922         KERNEL2x2_1
923         KERNEL2x2_2
924         KERNEL2x2_1
925         KERNEL2x2_2
926
927         addic.          L,      L,      -2
928         ble             DGEMM_L2x2_LOOP_END
929
930         .align 5
931
932 DGEMM_L2x2_LOOP:
933
934         KERNEL2x2_1
935         KERNEL2x2_2
936         KERNEL2x2_1
937         KERNEL2x2_2
938
939         KERNEL2x2_1
940         KERNEL2x2_2
941         KERNEL2x2_1
942         KERNEL2x2_2
943
944         addic.          L,      L,      -1
945         bgt             DGEMM_L2x2_LOOP
946
947 DGEMM_L2x2_LOOP_END:
948
949         KERNEL2x2_1
950         KERNEL2x2_2
951         KERNEL2x2_1
952         KERNEL2x2_2
953
954         KERNEL2x2_1
955         KERNEL2x2_2
956         KERNEL2x2_1
957         KERNEL2x2_E2
958
959         b               DGEMM_L2x2_SUB1
960
961 DGEMM_L2x2_SUB4:
962
963         KERNEL2x2_SUBI1
964         KERNEL2x2_SUB1
965         KERNEL2x2_SUB1
966         KERNEL2x2_SUB1
967
968         KERNEL2x2_SUB1
969         KERNEL2x2_SUB1
970         KERNEL2x2_SUB1
971         KERNEL2x2_SUB1
972
973         b               DGEMM_L2x2_SUB1
974
975 DGEMM_L2x2_SUB0:
976
977         andi.           L,      K,      7
978
979         KERNEL2x2_SUBI1
980
981         addic.          L,      L,      -1
982         ble             DGEMM_L2x2_SAVE
983         b               DGEMM_L2x2_SUB2
984
985 DGEMM_L2x2_SUB1:
986
987         andi.           L,      K,      7
988         ble             DGEMM_L2x2_SAVE
989
990 DGEMM_L2x2_SUB2:
991
992         KERNEL2x2_SUB1
993
994         addic.          L,      L,      -1
995         bgt             DGEMM_L2x2_SUB2
996
997 DGEMM_L2x2_SAVE:
998
999         SAVE2x2
1000
1001 DGEMM_L2x2_END:
1002
1003 DGEMM_L2x1_BEGIN:
1004
1005
1006         andi.           T1,     M,      1
1007         ble             DGEMM_L2x1_END
1008         mr              BO,     B
1009         srawi.          L,      K,      3
1010         ble             DGEMM_L2x1_SUB0
1011         cmpwi           cr0,    L,      1
1012         ble             DGEMM_L2x1_SUB4
1013
1014 DGEMM_L2x1_LOOP_START:
1015
1016         LOAD2x1_1
1017         KERNEL2x1_I1
1018         KERNEL2x1_2
1019         KERNEL2x1_1
1020         KERNEL2x1_2
1021
1022         KERNEL2x1_1
1023         KERNEL2x1_2
1024         KERNEL2x1_1
1025         KERNEL2x1_2
1026
1027         addic.          L,      L,      -2
1028         ble             DGEMM_L2x1_LOOP_END
1029
1030         .align 5
1031
1032 DGEMM_L2x1_LOOP:
1033
1034         KERNEL2x1_1
1035         KERNEL2x1_2
1036         KERNEL2x1_1
1037         KERNEL2x1_2
1038
1039         KERNEL2x1_1
1040         KERNEL2x1_2
1041         KERNEL2x1_1
1042         KERNEL2x1_2
1043
1044         addic.          L,      L,      -1
1045         bgt             DGEMM_L2x1_LOOP
1046
1047 DGEMM_L2x1_LOOP_END:
1048
1049         KERNEL2x1_1
1050         KERNEL2x1_2
1051         KERNEL2x1_1
1052         KERNEL2x1_2
1053
1054         KERNEL2x1_1
1055         KERNEL2x1_2
1056         KERNEL2x1_1
1057         KERNEL2x1_E2
1058
1059         b               DGEMM_L2x1_SUB1
1060
1061 DGEMM_L2x1_SUB4:
1062
1063         KERNEL2x1_SUBI1
1064         KERNEL2x1_SUB1
1065         KERNEL2x1_SUB1
1066         KERNEL2x1_SUB1
1067
1068         KERNEL2x1_SUB1
1069         KERNEL2x1_SUB1
1070         KERNEL2x1_SUB1
1071         KERNEL2x1_SUB1
1072
1073         b               DGEMM_L2x1_SUB1
1074
1075 DGEMM_L2x1_SUB0:
1076
1077         andi.           L,      K,      7
1078
1079         KERNEL2x1_SUBI1
1080
1081         addic.          L,      L,      -1
1082         ble             DGEMM_L2x1_SAVE
1083         b               DGEMM_L2x1_SUB2
1084
1085 DGEMM_L2x1_SUB1:
1086
1087         andi.           L,      K,      7
1088         ble             DGEMM_L2x1_SAVE
1089
1090 DGEMM_L2x1_SUB2:
1091
1092         KERNEL2x1_SUB1
1093
1094         addic.          L,      L,      -1
1095         bgt             DGEMM_L2x1_SUB2
1096
1097 DGEMM_L2x1_SAVE:
1098
1099         SAVE2x1
1100
1101 DGEMM_L2x1_END:
1102
1103         slwi            T1,     K,      4
1104         add             B,      B,      T1
1105
1106 DGEMM_L2_END:
1107 DGEMM_L1_BEGIN:
1108
1109         andi.           T1,     N,      1
1110         ble             DGEMM_L1_END
1111         mr              CO,     C
1112         mr              AO,     A
1113         srawi.          I,      M,      4
1114         ble             DGEMM_L1x16_END
1115
1116 DGEMM_L1x16_BEGIN:
1117
1118
1119         mr              BO,     B
1120         srawi.          L,      K,      3
1121         ble             DGEMM_L1x16_SUB0
1122         cmpwi           cr0,    L,      1
1123         ble             DGEMM_L1x16_SUB4
1124
1125 DGEMM_L1x16_LOOP_START:
1126
1127         dcbt            AO,     PRE
1128         LOAD1x16_1
1129         dcbt            AO,     PRE
1130         KERNEL1x16_I1
1131         dcbt            AO,     PRE
1132         KERNEL1x16_2
1133         dcbt            AO,     PRE
1134         KERNEL1x16_1
1135         dcbt            AO,     PRE
1136         KERNEL1x16_2
1137
1138         dcbt            AO,     PRE
1139         KERNEL1x16_1
1140         dcbt            AO,     PRE
1141         KERNEL1x16_2
1142         dcbt            AO,     PRE
1143         KERNEL1x16_1
1144         dcbt            AO,     PRE
1145         KERNEL1x16_2
1146
1147         addic.          L,      L,      -2
1148         ble             DGEMM_L1x16_LOOP_END
1149
1150         .align 5
1151
1152 DGEMM_L1x16_LOOP:
1153
1154         dcbt            AO,     PRE
1155         KERNEL1x16_1
1156         dcbt            AO,     PRE
1157         KERNEL1x16_2
1158         dcbt            AO,     PRE
1159         KERNEL1x16_1
1160         dcbt            AO,     PRE
1161         KERNEL1x16_2
1162
1163         dcbt            AO,     PRE
1164         KERNEL1x16_1
1165         dcbt            AO,     PRE
1166         KERNEL1x16_2
1167         dcbt            AO,     PRE
1168         KERNEL1x16_1
1169         dcbt            AO,     PRE
1170         KERNEL1x16_2
1171
1172         addic.          L,      L,      -1
1173         bgt             DGEMM_L1x16_LOOP
1174
1175 DGEMM_L1x16_LOOP_END:
1176
1177         dcbt            AO,     PRE
1178         KERNEL1x16_1
1179         dcbt            AO,     PRE
1180         KERNEL1x16_2
1181         dcbt            AO,     PRE
1182         KERNEL1x16_1
1183         dcbt            AO,     PRE
1184         KERNEL1x16_2
1185
1186         dcbt            AO,     PRE
1187         KERNEL1x16_1
1188         dcbt            AO,     PRE
1189         KERNEL1x16_2
1190         dcbt            AO,     PRE
1191         KERNEL1x16_1
1192         KERNEL1x16_E2
1193
1194         b               DGEMM_L1x16_SUB1
1195
1196 DGEMM_L1x16_SUB4:
1197
1198         dcbt            AO,     PRE
1199         KERNEL1x16_SUBI1
1200         dcbt            AO,     PRE
1201         KERNEL1x16_SUB1
1202         dcbt            AO,     PRE
1203         KERNEL1x16_SUB1
1204         dcbt            AO,     PRE
1205         KERNEL1x16_SUB1
1206
1207         KERNEL1x16_SUB1
1208         KERNEL1x16_SUB1
1209         KERNEL1x16_SUB1
1210         KERNEL1x16_SUB1
1211
1212         b               DGEMM_L1x16_SUB1
1213
1214 DGEMM_L1x16_SUB0:
1215
1216         andi.           L,      K,      7
1217
1218         KERNEL1x16_SUBI1
1219
1220         addic.          L,      L,      -1
1221         ble             DGEMM_L1x16_SAVE
1222         b               DGEMM_L1x16_SUB2
1223
1224 DGEMM_L1x16_SUB1:
1225
1226         andi.           L,      K,      7
1227         ble             DGEMM_L1x16_SAVE
1228
1229 DGEMM_L1x16_SUB2:
1230
1231         KERNEL1x16_SUB1
1232
1233         addic.          L,      L,      -1
1234         bgt             DGEMM_L1x16_SUB2
1235
1236 DGEMM_L1x16_SAVE:
1237
1238         SAVE1x16
1239
1240         addic.          I,      I,      -1
1241         bgt             DGEMM_L1x16_BEGIN
1242
1243 DGEMM_L1x16_END:
1244
1245 DGEMM_L1x8_BEGIN:
1246
1247         andi.           T2,     M,      15
1248         ble             DGEMM_L1x1_END
1249
1250         andi.           T1,     M,      8
1251         ble             DGEMM_L1x8_END
1252         mr              BO,     B
1253         srawi.          L,      K,      3
1254         ble             DGEMM_L1x8_SUB0
1255         cmpwi           cr0,    L,      1
1256         ble             DGEMM_L1x8_SUB4
1257
1258 DGEMM_L1x8_LOOP_START:
1259
1260         LOAD1x8_1
1261         KERNEL1x8_I1
1262         KERNEL1x8_2
1263         KERNEL1x8_1
1264         KERNEL1x8_2
1265
1266         KERNEL1x8_1
1267         KERNEL1x8_2
1268         KERNEL1x8_1
1269         KERNEL1x8_2
1270
1271         addic.          L,      L,      -2
1272         ble             DGEMM_L1x8_LOOP_END
1273
1274         .align 5
1275
1276 DGEMM_L1x8_LOOP:
1277
1278         KERNEL1x8_1
1279         KERNEL1x8_2
1280         KERNEL1x8_1
1281         KERNEL1x8_2
1282
1283         KERNEL1x8_1
1284         KERNEL1x8_2
1285         KERNEL1x8_1
1286         KERNEL1x8_2
1287
1288         addic.          L,      L,      -1
1289         bgt             DGEMM_L1x8_LOOP
1290
1291 DGEMM_L1x8_LOOP_END:
1292
1293         KERNEL1x8_1
1294         KERNEL1x8_2
1295         KERNEL1x8_1
1296         KERNEL1x8_2
1297
1298         KERNEL1x8_1
1299         KERNEL1x8_2
1300         KERNEL1x8_1
1301         KERNEL1x8_E2
1302
1303         b               DGEMM_L1x8_SUB1
1304
1305 DGEMM_L1x8_SUB4:
1306
1307         KERNEL1x8_SUBI1
1308         KERNEL1x8_SUB1
1309         KERNEL1x8_SUB1
1310         KERNEL1x8_SUB1
1311
1312         KERNEL1x8_SUB1
1313         KERNEL1x8_SUB1
1314         KERNEL1x8_SUB1
1315         KERNEL1x8_SUB1
1316
1317         b               DGEMM_L1x8_SUB1
1318
1319 DGEMM_L1x8_SUB0:
1320
1321         andi.           L,      K,      7
1322
1323         KERNEL1x8_SUBI1
1324
1325         addic.          L,      L,      -1
1326         ble             DGEMM_L1x8_SAVE
1327         b               DGEMM_L1x8_SUB2
1328
1329 DGEMM_L1x8_SUB1:
1330
1331         andi.           L,      K,      7
1332         ble             DGEMM_L1x8_SAVE
1333
1334 DGEMM_L1x8_SUB2:
1335
1336         KERNEL1x8_SUB1
1337
1338         addic.          L,      L,      -1
1339         bgt             DGEMM_L1x8_SUB2
1340
1341 DGEMM_L1x8_SAVE:
1342
1343         SAVE1x8
1344
1345 DGEMM_L1x8_END:
1346
1347 DGEMM_L1x4_BEGIN:
1348
1349
1350         andi.           T1,     M,      4
1351         ble             DGEMM_L1x4_END
1352         mr              BO,     B
1353         srawi.          L,      K,      3
1354         ble             DGEMM_L1x4_SUB0
1355         cmpwi           cr0,    L,      1
1356         ble             DGEMM_L1x4_SUB4
1357
1358 DGEMM_L1x4_LOOP_START:
1359
1360         LOAD1x4_1
1361         KERNEL1x4_I1
1362         KERNEL1x4_2
1363         KERNEL1x4_1
1364         KERNEL1x4_2
1365
1366         KERNEL1x4_1
1367         KERNEL1x4_2
1368         KERNEL1x4_1
1369         KERNEL1x4_2
1370
1371         addic.          L,      L,      -2
1372         ble             DGEMM_L1x4_LOOP_END
1373
1374         .align 5
1375
1376 DGEMM_L1x4_LOOP:
1377
1378         KERNEL1x4_1
1379         KERNEL1x4_2
1380         KERNEL1x4_1
1381         KERNEL1x4_2
1382
1383         KERNEL1x4_1
1384         KERNEL1x4_2
1385         KERNEL1x4_1
1386         KERNEL1x4_2
1387
1388         addic.          L,      L,      -1
1389         bgt             DGEMM_L1x4_LOOP
1390
1391 DGEMM_L1x4_LOOP_END:
1392
1393         KERNEL1x4_1
1394         KERNEL1x4_2
1395         KERNEL1x4_1
1396         KERNEL1x4_2
1397
1398         KERNEL1x4_1
1399         KERNEL1x4_2
1400         KERNEL1x4_1
1401         KERNEL1x4_E2
1402
1403         b               DGEMM_L1x4_SUB1
1404
1405 DGEMM_L1x4_SUB4:
1406
1407         KERNEL1x4_SUBI1
1408         KERNEL1x4_SUB1
1409         KERNEL1x4_SUB1
1410         KERNEL1x4_SUB1
1411
1412         KERNEL1x4_SUB1
1413         KERNEL1x4_SUB1
1414         KERNEL1x4_SUB1
1415         KERNEL1x4_SUB1
1416
1417         b               DGEMM_L1x4_SUB1
1418
1419 DGEMM_L1x4_SUB0:
1420
1421         andi.           L,      K,      7
1422
1423         KERNEL1x4_SUBI1
1424
1425         addic.          L,      L,      -1
1426         ble             DGEMM_L1x4_SAVE
1427         b               DGEMM_L1x4_SUB2
1428
1429 DGEMM_L1x4_SUB1:
1430
1431         andi.           L,      K,      7
1432         ble             DGEMM_L1x4_SAVE
1433
1434 DGEMM_L1x4_SUB2:
1435
1436         KERNEL1x4_SUB1
1437
1438         addic.          L,      L,      -1
1439         bgt             DGEMM_L1x4_SUB2
1440
1441 DGEMM_L1x4_SAVE:
1442
1443         SAVE1x4
1444
1445 DGEMM_L1x4_END:
1446
1447 DGEMM_L1x2_BEGIN:
1448
1449
1450         andi.           T1,     M,      2
1451         ble             DGEMM_L1x2_END
1452         mr              BO,     B
1453         srawi.          L,      K,      3
1454         ble             DGEMM_L1x2_SUB0
1455         cmpwi           cr0,    L,      1
1456         ble             DGEMM_L1x2_SUB4
1457
1458 DGEMM_L1x2_LOOP_START:
1459
1460         LOAD1x2_1
1461         KERNEL1x2_I1
1462         KERNEL1x2_2
1463         KERNEL1x2_1
1464         KERNEL1x2_2
1465
1466         KERNEL1x2_1
1467         KERNEL1x2_2
1468         KERNEL1x2_1
1469         KERNEL1x2_2
1470
1471         addic.          L,      L,      -2
1472         ble             DGEMM_L1x2_LOOP_END
1473
1474         .align 5
1475
1476 DGEMM_L1x2_LOOP:
1477
1478         KERNEL1x2_1
1479         KERNEL1x2_2
1480         KERNEL1x2_1
1481         KERNEL1x2_2
1482
1483         KERNEL1x2_1
1484         KERNEL1x2_2
1485         KERNEL1x2_1
1486         KERNEL1x2_2
1487
1488         addic.          L,      L,      -1
1489         bgt             DGEMM_L1x2_LOOP
1490
1491 DGEMM_L1x2_LOOP_END:
1492
1493         KERNEL1x2_1
1494         KERNEL1x2_2
1495         KERNEL1x2_1
1496         KERNEL1x2_2
1497
1498         KERNEL1x2_1
1499         KERNEL1x2_2
1500         KERNEL1x2_1
1501         KERNEL1x2_E2
1502
1503         b               DGEMM_L1x2_SUB1
1504
1505 DGEMM_L1x2_SUB4:
1506
1507         KERNEL1x2_SUBI1
1508         KERNEL1x2_SUB1
1509         KERNEL1x2_SUB1
1510         KERNEL1x2_SUB1
1511
1512         KERNEL1x2_SUB1
1513         KERNEL1x2_SUB1
1514         KERNEL1x2_SUB1
1515         KERNEL1x2_SUB1
1516
1517         b               DGEMM_L1x2_SUB1
1518
1519 DGEMM_L1x2_SUB0:
1520
1521         andi.           L,      K,      7
1522
1523         KERNEL1x2_SUBI1
1524
1525         addic.          L,      L,      -1
1526         ble             DGEMM_L1x2_SAVE
1527         b               DGEMM_L1x2_SUB2
1528
1529 DGEMM_L1x2_SUB1:
1530
1531         andi.           L,      K,      7
1532         ble             DGEMM_L1x2_SAVE
1533
1534 DGEMM_L1x2_SUB2:
1535
1536         KERNEL1x2_SUB1
1537
1538         addic.          L,      L,      -1
1539         bgt             DGEMM_L1x2_SUB2
1540
1541 DGEMM_L1x2_SAVE:
1542
1543         SAVE1x2
1544
1545 DGEMM_L1x2_END:
1546
1547 DGEMM_L1x1_BEGIN:
1548
1549
1550         andi.           T1,     M,      1
1551         ble             DGEMM_L1x1_END
1552         mr              BO,     B
1553         srawi.          L,      K,      3
1554         ble             DGEMM_L1x1_SUB0
1555         cmpwi           cr0,    L,      1
1556         ble             DGEMM_L1x1_SUB4
1557
1558 DGEMM_L1x1_LOOP_START:
1559
1560         LOAD1x1_1
1561         KERNEL1x1_I1
1562         KERNEL1x1_2
1563         KERNEL1x1_1
1564         KERNEL1x1_2
1565
1566         KERNEL1x1_1
1567         KERNEL1x1_2
1568         KERNEL1x1_1
1569         KERNEL1x1_2
1570
1571         addic.          L,      L,      -2
1572         ble             DGEMM_L1x1_LOOP_END
1573
1574         .align 5
1575
1576 DGEMM_L1x1_LOOP:
1577
1578         KERNEL1x1_1
1579         KERNEL1x1_2
1580         KERNEL1x1_1
1581         KERNEL1x1_2
1582
1583         KERNEL1x1_1
1584         KERNEL1x1_2
1585         KERNEL1x1_1
1586         KERNEL1x1_2
1587
1588         addic.          L,      L,      -1
1589         bgt             DGEMM_L1x1_LOOP
1590
1591 DGEMM_L1x1_LOOP_END:
1592
1593         KERNEL1x1_1
1594         KERNEL1x1_2
1595         KERNEL1x1_1
1596         KERNEL1x1_2
1597
1598         KERNEL1x1_1
1599         KERNEL1x1_2
1600         KERNEL1x1_1
1601         KERNEL1x1_E2
1602
1603         b               DGEMM_L1x1_SUB1
1604
1605 DGEMM_L1x1_SUB4:
1606
1607         KERNEL1x1_SUBI1
1608         KERNEL1x1_SUB1
1609         KERNEL1x1_SUB1
1610         KERNEL1x1_SUB1
1611
1612         KERNEL1x1_SUB1
1613         KERNEL1x1_SUB1
1614         KERNEL1x1_SUB1
1615         KERNEL1x1_SUB1
1616
1617         b               DGEMM_L1x1_SUB1
1618
1619 DGEMM_L1x1_SUB0:
1620
1621         andi.           L,      K,      7
1622
1623         KERNEL1x1_SUBI1
1624
1625         addic.          L,      L,      -1
1626         ble             DGEMM_L1x1_SAVE
1627         b               DGEMM_L1x1_SUB2
1628
1629 DGEMM_L1x1_SUB1:
1630
1631         andi.           L,      K,      7
1632         ble             DGEMM_L1x1_SAVE
1633
1634 DGEMM_L1x1_SUB2:
1635
1636         KERNEL1x1_SUB1
1637
1638         addic.          L,      L,      -1
1639         bgt             DGEMM_L1x1_SUB2
1640
1641 DGEMM_L1x1_SAVE:
1642
1643         SAVE1x1
1644
1645 DGEMM_L1x1_END:
1646
1647 DGEMM_L1_END: