Merge pull request #1226 from ashwinyes/develop_arm_clang_ual_fix
[platform/upstream/openblas.git] / kernel / arm / cgemm_kernel_2x2_vfp.S
1 /***************************************************************************
2 Copyright (c) 2013, The OpenBLAS Project
3 All rights reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
7 1. Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 2. Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
12 distribution.
13 3. Neither the name of the OpenBLAS project nor the names of
14 its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
25 USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *****************************************************************************/
27
28 /**************************************************************************************
29 * 2013/11/28 Saar
30 *        BLASTEST               : OK
31 *        CTEST                  : OK
32 *        TEST                   : OK
33 *
34 **************************************************************************************/
35
36 #define ASSEMBLER
37 #include "common.h"
38
39 #define STACKSIZE 256
40
41 #define OLD_M   r0
42 #define OLD_N   r1
43 #define OLD_K   r2
44 #define OLD_A   r3
45 #define OLD_ALPHA_R s0
46 #define OLD_ALPHA_I s1
47
48 /******************************************************
49 * [fp, #-128] - [fp, #-64] is reserved
50 * for store and restore of floating point
51 * registers
52 *******************************************************/
53
54 #define A       [fp, #-248 ]
55 #define LDC     [fp, #-252 ]
56 #define M       [fp, #-256 ]
57 #define N       [fp, #-260 ]
58 #define K       [fp, #-264 ]
59
60 #define FP_ZERO [fp, #-240]
61 #define FP_ZERO_0 [fp, # -240]
62 #define FP_ZERO_1 [fp, # -236]
63
64 #define ALPHA_I [fp, #-272]
65 #define ALPHA_R [fp, #-280]
66
67 #if !defined(__ARM_PCS_VFP)
68 #define OLD_ALPHAR_SOFTFP       r3
69 #define OLD_ALPHAI_SOFTFP       [fp, #4]
70 #define OLD_A_SOFTFP    [fp, #8 ]
71 #define B       [fp, #12 ]
72 #define C       [fp, #16 ]
73 #define OLD_LDC [fp, #20 ]
74 #else
75 #define B       [fp, #4 ]
76 #define C       [fp, #8 ]
77 #define OLD_LDC [fp, #12 ]
78 #endif
79
80 #define I       r0
81 #define J       r1
82 #define L       r2
83
84 #define AO      r5
85 #define BO      r6
86
87 #define CO1     r8
88 #define CO2     r9
89
90 #define K1      r7
91 #define BC      r12
92
93 #define A_PRE   96
94 #define B_PRE   96
95 #define C_PRE   64
96
97
98
99 /**************************************************************************************
100 * Macro definitions
101 **************************************************************************************/
102
103
104 #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
105
106         #define KMAC_R  vmls.f32
107         #define KMAC_I  fmacs
108
109         #define FMAC_R1 fmacs
110         #define FMAC_R2 vmls.f32
111         #define FMAC_I1 fmacs
112         #define FMAC_I2 fmacs
113
114 #elif defined(CN) || defined(CT)
115
116         #define KMAC_R  fmacs
117         #define KMAC_I  vmls.f32
118
119         #define FMAC_R1 fmacs
120         #define FMAC_R2 vmls.f32
121         #define FMAC_I1 fmacs
122         #define FMAC_I2 fmacs
123
124 #elif defined(NC) || defined(TC)
125
126         #define KMAC_R  fmacs
127         #define KMAC_I  vmls.f32
128
129         #define FMAC_R1 fmacs
130         #define FMAC_R2 fmacs
131         #define FMAC_I1 vmls.f32
132         #define FMAC_I2 fmacs
133
134 #else
135
136         #define KMAC_R  vmls.f32
137         #define KMAC_I  fmacs
138
139         #define FMAC_R1 fmacs
140         #define FMAC_R2 fmacs
141         #define FMAC_I1 vmls.f32
142         #define FMAC_I2 fmacs
143
144 #endif
145
146
147
148 /**************************************************************************************
149 * Macro definitions
150 **************************************************************************************/
151
152 .macro INIT2x2
153
154         flds                    s8 , FP_ZERO
155         vmov.f32                s9 , s8
156         vmov.f32                s10, s8
157         vmov.f32                s11, s8
158         vmov.f32                s12, s8
159         vmov.f32                s13, s8
160         vmov.f32                s14, s8
161         vmov.f32                s15, s8
162
163 .endm
164
165 .macro KERNEL2x2_I
166
167         pld     [ AO, #A_PRE ]
168         fldmias AO!, { s0 - s3 }
169         pld     [ BO, #B_PRE ]
170         fldmias BO!, { s4 - s7 }
171
172
173         fmuls   s8  , s0,  s4
174         fmuls   s9  , s0,  s5
175         fmuls   s10 , s2,  s4
176         fmuls   s11 , s2,  s5
177
178         KMAC_R  s8  , s1,  s5
179         KMAC_I  s9  , s1,  s4
180         KMAC_R  s10 , s3,  s5
181         KMAC_I  s11 , s3,  s4
182
183         fmuls   s12 , s0,  s6
184         fmuls   s13 , s0,  s7
185         fmuls   s14 , s2,  s6
186         fmuls   s15 , s2,  s7
187
188         KMAC_R  s12 , s1,  s7
189         KMAC_I  s13 , s1,  s6
190         KMAC_R  s14 , s3,  s7
191         KMAC_I  s15 , s3,  s6
192
193 .endm
194
195
196
197 .macro KERNEL2x2_M1
198
199         pld     [ AO, #A_PRE ]
200         fldmias AO!, { s0 - s3 }
201         pld     [ BO, #B_PRE ]
202         fldmias BO!, { s4 - s7 }
203
204         fmacs   s8  , s0,  s4
205         fmacs   s9  , s0,  s5
206         fmacs   s10 , s2,  s4
207         fmacs   s11 , s2,  s5
208
209         KMAC_R  s8  , s1,  s5
210         KMAC_I  s9  , s1,  s4
211         KMAC_R  s10 , s3,  s5
212         KMAC_I  s11 , s3,  s4
213
214         fmacs   s12 , s0,  s6
215         fmacs   s13 , s0,  s7
216         fmacs   s14 , s2,  s6
217         fmacs   s15 , s2,  s7
218
219         KMAC_R  s12 , s1,  s7
220         KMAC_I  s13 , s1,  s6
221         KMAC_R  s14 , s3,  s7
222         KMAC_I  s15 , s3,  s6
223
224 .endm
225
226 .macro KERNEL2x2_M2
227
228         fldmias AO!, { s0 - s3 }
229         fldmias BO!, { s4 - s7 }
230
231         fmacs   s8  , s0,  s4
232         fmacs   s9  , s0,  s5
233         fmacs   s10 , s2,  s4
234         fmacs   s11 , s2,  s5
235
236         KMAC_R  s8  , s1,  s5
237         KMAC_I  s9  , s1,  s4
238         KMAC_R  s10 , s3,  s5
239         KMAC_I  s11 , s3,  s4
240
241         fmacs   s12 , s0,  s6
242         fmacs   s13 , s0,  s7
243         fmacs   s14 , s2,  s6
244         fmacs   s15 , s2,  s7
245
246         KMAC_R  s12 , s1,  s7
247         KMAC_I  s13 , s1,  s6
248         KMAC_R  s14 , s3,  s7
249         KMAC_I  s15 , s3,  s6
250
251
252 .endm
253
254
255 .macro KERNEL2x2_E
256
257         fldmias AO!, { s0 - s3 }
258         fldmias BO!, { s4 - s7 }
259
260         fmacs   s8  , s0,  s4
261         fmacs   s9  , s0,  s5
262         fmacs   s10 , s2,  s4
263         fmacs   s11 , s2,  s5
264
265         KMAC_R  s8  , s1,  s5
266         KMAC_I  s9  , s1,  s4
267         KMAC_R  s10 , s3,  s5
268         KMAC_I  s11 , s3,  s4
269
270         fmacs   s12 , s0,  s6
271         fmacs   s13 , s0,  s7
272         fmacs   s14 , s2,  s6
273         fmacs   s15 , s2,  s7
274
275         KMAC_R  s12 , s1,  s7
276         KMAC_I  s13 , s1,  s6
277         KMAC_R  s14 , s3,  s7
278         KMAC_I  s15 , s3,  s6
279
280
281 .endm
282
283 .macro KERNEL2x2_SUB
284
285         fldmias AO!, { s0 - s3 }
286         fldmias BO!, { s4 - s7 }
287
288         fmacs   s8  , s0,  s4
289         fmacs   s9  , s0,  s5
290         fmacs   s10 , s2,  s4
291         fmacs   s11 , s2,  s5
292
293         KMAC_R  s8  , s1,  s5
294         KMAC_I  s9  , s1,  s4
295         KMAC_R  s10 , s3,  s5
296         KMAC_I  s11 , s3,  s4
297
298         fmacs   s12 , s0,  s6
299         fmacs   s13 , s0,  s7
300         fmacs   s14 , s2,  s6
301         fmacs   s15 , s2,  s7
302
303         KMAC_R  s12 , s1,  s7
304         KMAC_I  s13 , s1,  s6
305         KMAC_R  s14 , s3,  s7
306         KMAC_I  s15 , s3,  s6
307
308
309 .endm
310
311
312 .macro SAVE2x2
313
314         ldr     r3  , LDC
315         add     CO2 , CO1, r3
316
317         flds            s0, ALPHA_R
318         flds            s1, ALPHA_I
319
320         fldmias CO1, { s4 - s7 }
321
322         FMAC_R1 s4 , s0 , s8
323         FMAC_I1 s5 , s0 , s9
324         FMAC_R2 s4 , s1 , s9
325         FMAC_I2 s5 , s1 , s8
326
327         FMAC_R1 s6 , s0 , s10
328         FMAC_I1 s7 , s0 , s11
329         FMAC_R2 s6 , s1 , s11
330         FMAC_I2 s7 , s1 , s10
331
332         fstmias CO1, { s4 - s7 }
333
334         fldmias CO2, { s4 - s7 }
335
336         FMAC_R1 s4 , s0 , s12
337         FMAC_I1 s5 , s0 , s13
338         FMAC_R2 s4 , s1 , s13
339         FMAC_I2 s5 , s1 , s12
340
341         FMAC_R1 s6 , s0 , s14
342         FMAC_I1 s7 , s0 , s15
343         FMAC_R2 s6 , s1 , s15
344         FMAC_I2 s7 , s1 , s14
345
346         fstmias CO2, { s4 - s7 }
347
348         add     CO1, CO1, #16
349
350 .endm
351
352 /******************************************************************************/
353
354 .macro INIT1x2
355
356         flds                    s8 , FP_ZERO
357         vmov.f32                s9 , s8
358         vmov.f32                s12, s8
359         vmov.f32                s13, s8
360
361 .endm
362
363 .macro KERNEL1x2_I
364
365         flds    s0 , [ AO ]
366         flds    s1 , [ AO, #4 ]
367
368         flds    s4 , [ BO ]
369         flds    s5 , [ BO, #4 ]
370
371         flds    s6 , [ BO, #8 ]
372         flds    s7 , [ BO, #12 ]
373
374         fmuls   s8  , s0,  s4
375         KMAC_R  s8  , s1,  s5
376         fmuls   s9  , s0,  s5
377         KMAC_I  s9  , s1,  s4
378
379         fmuls   s12 , s0,  s6
380         KMAC_R  s12 , s1,  s7
381         fmuls   s13 , s0,  s7
382         KMAC_I  s13 , s1,  s6
383
384         add     BO , BO, #16
385         add     AO , AO, #8
386
387 .endm
388
389
390
391 .macro KERNEL1x2_M1
392
393         flds    s0 , [ AO ]
394         flds    s1 , [ AO, #4 ]
395
396         flds    s4 , [ BO ]
397         flds    s5 , [ BO, #4 ]
398         flds    s6 , [ BO, #8 ]
399         flds    s7 , [ BO, #12 ]
400
401         fmacs   s8  , s0,  s4
402         KMAC_R  s8  , s1,  s5
403         fmacs   s9  , s0,  s5
404         KMAC_I  s9  , s1,  s4
405
406         fmacs   s12 , s0,  s6
407         KMAC_R  s12 , s1,  s7
408         fmacs   s13 , s0,  s7
409         KMAC_I  s13 , s1,  s6
410
411         add     BO , BO, #16
412         add     AO , AO, #8
413
414 .endm
415
416 .macro KERNEL1x2_M2
417
418         flds    s0 , [ AO ]
419         flds    s1 , [ AO, #4 ]
420
421         flds    s4 , [ BO ]
422         flds    s5 , [ BO, #4 ]
423         flds    s6 , [ BO, #8 ]
424         flds    s7 , [ BO, #12 ]
425
426         fmacs   s8  , s0,  s4
427         KMAC_R  s8  , s1,  s5
428         fmacs   s9  , s0,  s5
429         KMAC_I  s9  , s1,  s4
430
431         fmacs   s12 , s0,  s6
432         KMAC_R  s12 , s1,  s7
433         fmacs   s13 , s0,  s7
434         KMAC_I  s13 , s1,  s6
435
436         add     BO , BO, #16
437         add     AO , AO, #8
438
439
440 .endm
441
442
443 .macro KERNEL1x2_E
444
445         flds    s0 , [ AO ]
446         flds    s1 , [ AO, #4 ]
447
448         flds    s4 , [ BO ]
449         flds    s5 , [ BO, #4 ]
450         flds    s6 , [ BO, #8 ]
451         flds    s7 , [ BO, #12 ]
452
453         fmacs   s8  , s0,  s4
454         KMAC_R  s8  , s1,  s5
455         fmacs   s9  , s0,  s5
456         KMAC_I  s9  , s1,  s4
457
458         fmacs   s12 , s0,  s6
459         KMAC_R  s12 , s1,  s7
460         fmacs   s13 , s0,  s7
461         KMAC_I  s13 , s1,  s6
462
463         add     BO , BO, #16
464         add     AO , AO, #8
465
466 .endm
467
468 .macro KERNEL1x2_SUB
469
470         flds    s0 , [ AO ]
471         flds    s1 , [ AO, #4 ]
472
473         flds    s4 , [ BO ]
474         flds    s5 , [ BO, #4 ]
475         flds    s6 , [ BO, #8 ]
476         flds    s7 , [ BO, #12 ]
477
478         fmacs   s8  , s0,  s4
479         KMAC_R  s8  , s1,  s5
480         fmacs   s9  , s0,  s5
481         KMAC_I  s9  , s1,  s4
482
483         fmacs   s12 , s0,  s6
484         KMAC_R  s12 , s1,  s7
485         fmacs   s13 , s0,  s7
486         KMAC_I  s13 , s1,  s6
487
488         add     BO , BO, #16
489         add     AO , AO, #8
490
491
492 .endm
493
494
495 .macro SAVE1x2
496
497         ldr     r3  , LDC
498         add     CO2 , CO1, r3
499
500         flds            s0, ALPHA_R
501         flds            s1, ALPHA_I
502
503         fldmias CO1, { s4 - s5 }
504
505         FMAC_R1 s4 , s0 , s8
506         FMAC_I1 s5 , s0 , s9
507         FMAC_R2 s4 , s1 , s9
508         FMAC_I2 s5 , s1 , s8
509
510         fstmias CO1, { s4 - s5 }
511
512         fldmias CO2, { s4 - s5 }
513
514         FMAC_R1 s4 , s0 , s12
515         FMAC_I1 s5 , s0 , s13
516         FMAC_R2 s4 , s1 , s13
517         FMAC_I2 s5 , s1 , s12
518
519         fstmias CO2, { s4 - s5 }
520
521         add     CO1, CO1, #8
522
523 .endm
524
525
526 /******************************************************************************/
527
528 .macro INIT2x1
529
530         flds                    s8 , FP_ZERO
531         vmov.f32                s9 , s8
532         vmov.f32                s10, s8
533         vmov.f32                s11, s8
534
535 .endm
536
537 .macro KERNEL2x1_I
538
539         flds    s0 , [ AO ]
540         flds    s1 , [ AO, #4 ]
541
542         flds    s2 , [ AO, #8 ]
543         flds    s3 , [ AO, #12 ]
544
545         flds    s4 , [ BO ]
546         flds    s5 , [ BO, #4 ]
547
548         fmuls   s8  , s0,  s4
549         KMAC_R  s8  , s1,  s5
550         fmuls   s9  , s0,  s5
551         KMAC_I  s9  , s1,  s4
552
553         fmuls   s10 , s2,  s4
554         KMAC_R  s10 , s3,  s5
555         fmuls   s11 , s2,  s5
556         KMAC_I  s11 , s3,  s4
557
558         add     BO , BO, #8
559         add     AO , AO, #16
560
561 .endm
562
563
564
565 .macro KERNEL2x1_M1
566
567         flds    s0 , [ AO ]
568         flds    s1 , [ AO, #4 ]
569         flds    s2 , [ AO, #8 ]
570         flds    s3 , [ AO, #12 ]
571
572         flds    s4 , [ BO ]
573         flds    s5 , [ BO, #4 ]
574
575         fmacs   s8  , s0,  s4
576         KMAC_R  s8  , s1,  s5
577         fmacs   s9  , s0,  s5
578         KMAC_I  s9  , s1,  s4
579
580         fmacs   s10 , s2,  s4
581         KMAC_R  s10 , s3,  s5
582         fmacs   s11 , s2,  s5
583         KMAC_I  s11 , s3,  s4
584
585         add     BO , BO, #8
586         add     AO , AO, #16
587
588 .endm
589
590 .macro KERNEL2x1_M2
591
592         flds    s0 , [ AO ]
593         flds    s1 , [ AO, #4 ]
594         flds    s2 , [ AO, #8 ]
595         flds    s3 , [ AO, #12 ]
596
597         flds    s4 , [ BO ]
598         flds    s5 , [ BO, #4 ]
599
600         fmacs   s8  , s0,  s4
601         KMAC_R  s8  , s1,  s5
602         fmacs   s9  , s0,  s5
603         KMAC_I  s9  , s1,  s4
604
605         fmacs   s10 , s2,  s4
606         KMAC_R  s10 , s3,  s5
607         fmacs   s11 , s2,  s5
608         KMAC_I  s11 , s3,  s4
609
610         add     BO , BO, #8
611         add     AO , AO, #16
612
613
614 .endm
615
616
617 .macro KERNEL2x1_E
618
619         flds    s0 , [ AO ]
620         flds    s1 , [ AO, #4 ]
621         flds    s2 , [ AO, #8 ]
622         flds    s3 , [ AO, #12 ]
623
624         flds    s4 , [ BO ]
625         flds    s5 , [ BO, #4 ]
626
627         fmacs   s8  , s0,  s4
628         KMAC_R  s8  , s1,  s5
629         fmacs   s9  , s0,  s5
630         KMAC_I  s9  , s1,  s4
631
632         fmacs   s10 , s2,  s4
633         KMAC_R  s10 , s3,  s5
634         fmacs   s11 , s2,  s5
635         KMAC_I  s11 , s3,  s4
636
637         add     BO , BO, #8
638         add     AO , AO, #16
639
640 .endm
641
642 .macro KERNEL2x1_SUB
643
644         flds    s0 , [ AO ]
645         flds    s1 , [ AO, #4 ]
646         flds    s2 , [ AO, #8 ]
647         flds    s3 , [ AO, #12 ]
648
649         flds    s4 , [ BO ]
650         flds    s5 , [ BO, #4 ]
651
652         fmacs   s8  , s0,  s4
653         KMAC_R  s8  , s1,  s5
654         fmacs   s9  , s0,  s5
655         KMAC_I  s9  , s1,  s4
656
657         fmacs   s10 , s2,  s4
658         KMAC_R  s10 , s3,  s5
659         fmacs   s11 , s2,  s5
660         KMAC_I  s11 , s3,  s4
661
662         add     BO , BO, #8
663         add     AO , AO, #16
664
665
666 .endm
667
668
669 .macro SAVE2x1
670
671         flds            s0, ALPHA_R
672         flds            s1, ALPHA_I
673
674         fldmias CO1, { s4 - s7 }
675
676         FMAC_R1 s4 , s0 , s8
677         FMAC_I1 s5 , s0 , s9
678         FMAC_R2 s4 , s1 , s9
679         FMAC_I2 s5 , s1 , s8
680
681         FMAC_R1 s6 , s0 , s10
682         FMAC_I1 s7 , s0 , s11
683         FMAC_R2 s6 , s1 , s11
684         FMAC_I2 s7 , s1 , s10
685
686         fstmias CO1, { s4 - s7 }
687
688         add     CO1, CO1, #16
689
690 .endm
691
692
693 /******************************************************************************/
694
695 .macro INIT1x1
696
697         flds                    s8 , FP_ZERO
698         vmov.f32                s9 , s8
699
700 .endm
701
702 .macro KERNEL1x1_I
703
704         flds    s0 , [ AO ]
705         flds    s1 , [ AO, #4 ]
706
707         flds    s4 , [ BO ]
708         flds    s5 , [ BO, #4 ]
709
710         fmuls   s8  , s0,  s4
711         KMAC_R  s8  , s1,  s5
712         fmuls   s9  , s0,  s5
713         KMAC_I  s9  , s1,  s4
714
715         add     BO , BO, #8
716         add     AO , AO, #8
717
718 .endm
719
720
721
722 .macro KERNEL1x1_M1
723
724         flds    s0 , [ AO ]
725         flds    s1 , [ AO, #4 ]
726
727         flds    s4 , [ BO ]
728         flds    s5 , [ BO, #4 ]
729
730         fmacs   s8  , s0,  s4
731         KMAC_R  s8  , s1,  s5
732         fmacs   s9  , s0,  s5
733         KMAC_I  s9  , s1,  s4
734
735         add     BO , BO, #8
736         add     AO , AO, #8
737
738 .endm
739
740 .macro KERNEL1x1_M2
741
742         flds    s0 , [ AO ]
743         flds    s1 , [ AO, #4 ]
744
745         flds    s4 , [ BO ]
746         flds    s5 , [ BO, #4 ]
747
748         fmacs   s8  , s0,  s4
749         KMAC_R  s8  , s1,  s5
750         fmacs   s9  , s0,  s5
751         KMAC_I  s9  , s1,  s4
752
753         add     BO , BO, #8
754         add     AO , AO, #8
755
756
757 .endm
758
759
760 .macro KERNEL1x1_E
761
762         flds    s0 , [ AO ]
763         flds    s1 , [ AO, #4 ]
764
765         flds    s4 , [ BO ]
766         flds    s5 , [ BO, #4 ]
767
768         fmacs   s8  , s0,  s4
769         KMAC_R  s8  , s1,  s5
770         fmacs   s9  , s0,  s5
771         KMAC_I  s9  , s1,  s4
772
773         add     BO , BO, #8
774         add     AO , AO, #8
775
776 .endm
777
778 .macro KERNEL1x1_SUB
779
780         flds    s0 , [ AO ]
781         flds    s1 , [ AO, #4 ]
782
783         flds    s4 , [ BO ]
784         flds    s5 , [ BO, #4 ]
785
786         fmacs   s8  , s0,  s4
787         KMAC_R  s8  , s1,  s5
788         fmacs   s9  , s0,  s5
789         KMAC_I  s9  , s1,  s4
790
791         add     BO , BO, #8
792         add     AO , AO, #8
793
794
795 .endm
796
797
798 .macro SAVE1x1
799
800         flds            s0, ALPHA_R
801         flds            s1, ALPHA_I
802
803         fldmias CO1, { s4 - s5 }
804
805         FMAC_R1 s4 , s0 , s8
806         FMAC_I1 s5 , s0 , s9
807         FMAC_R2 s4 , s1 , s9
808         FMAC_I2 s5 , s1 , s8
809
810         fstmias CO1, { s4 - s5 }
811
812         add     CO1, CO1, #8
813
814 .endm
815
816 /**************************************************************************************
817 * End of macro definitions
818 **************************************************************************************/
819
820         PROLOGUE
821
822         .align 5
823
824         push    {r4 - r9, fp}
825         add     fp, sp, #24
826         sub     sp, sp, #STACKSIZE                              // reserve stack
827
828 #if !defined(__ARM_PCS_VFP)
829         vmov    OLD_ALPHA_R, OLD_ALPHAR_SOFTFP
830         vldr    OLD_ALPHA_I, OLD_ALPHAI_SOFTFP
831         ldr     OLD_A, OLD_A_SOFTFP
832 #endif
833         str     OLD_M, M
834         str     OLD_N, N
835         str     OLD_K, K
836         str     OLD_A, A
837         vstr    OLD_ALPHA_R, ALPHA_R
838         vstr    OLD_ALPHA_I, ALPHA_I
839
840         sub     r3, fp, #128
841         vstm    r3, { s8 - s15}                                 // store floating point registers
842
843         movs    r4, #0
844         str     r4, FP_ZERO
845         str     r4, FP_ZERO_1
846
847         ldr     r3, OLD_LDC
848         lsl     r3, r3, #3                                      // ldc = ldc * 4 * 2
849         str     r3, LDC
850
851         ldr     K1, K
852         ldr     BC, B
853
854         ldr     J, N
855         asrs    J, J, #1                                        // J = J / 2
856         ble     cgemm_kernel_L1_BEGIN
857
858 cgemm_kernel_L2_BEGIN:
859
860         ldr     CO1, C                                          // CO1 = C
861         ldr     r4 , LDC
862         lsl     r4 , r4 , #1                                    // LDC * 2
863         add     r3 , r4, CO1
864         str     r3 , C                                          // store C
865
866         ldr     AO, A                                           // AO = A
867         pld     [AO , #A_PRE-64]
868         pld     [AO , #A_PRE-32]
869
870
871
872 cgemm_kernel_L2_M2_BEGIN:
873
874         ldr     I, M
875         asrs    I, I, #1                                        // I = I / 2
876         ble     cgemm_kernel_L2_M1_BEGIN
877
878 cgemm_kernel_L2_M2_20:
879
880
881         mov     BO, BC
882         asrs    L , K1, #3                                      // L = L / 8
883         cmp     L , #3
884         blt     cgemm_kernel_L2_M2_30
885         .align 5
886
887
888
889         KERNEL2x2_I
890         KERNEL2x2_M2
891         KERNEL2x2_M1
892         KERNEL2x2_M2
893
894         KERNEL2x2_M1
895         KERNEL2x2_M2
896         KERNEL2x2_M1
897         KERNEL2x2_M2
898
899         sub     L, L, #2
900
901 cgemm_kernel_L2_M2_22:
902
903         KERNEL2x2_M1
904         KERNEL2x2_M2
905         KERNEL2x2_M1
906         KERNEL2x2_M2
907
908         KERNEL2x2_M1
909         KERNEL2x2_M2
910         KERNEL2x2_M1
911         KERNEL2x2_M2
912
913         subs    L, L, #1
914         bgt     cgemm_kernel_L2_M2_22
915
916         KERNEL2x2_M1
917         KERNEL2x2_M2
918         KERNEL2x2_M1
919         KERNEL2x2_M2
920
921         KERNEL2x2_M1
922         KERNEL2x2_M2
923         KERNEL2x2_M1
924         KERNEL2x2_E
925
926         b        cgemm_kernel_L2_M2_44
927
928
929 cgemm_kernel_L2_M2_30:
930         tst     L, #3
931         ble     cgemm_kernel_L2_M2_40
932
933         tst     L, #2
934         ble     cgemm_kernel_L2_M2_32
935
936         KERNEL2x2_I
937         KERNEL2x2_M2
938         KERNEL2x2_M1
939         KERNEL2x2_M2
940
941         KERNEL2x2_M1
942         KERNEL2x2_M2
943         KERNEL2x2_M1
944         KERNEL2x2_M2
945
946         KERNEL2x2_M1
947         KERNEL2x2_M2
948         KERNEL2x2_M1
949         KERNEL2x2_M2
950
951
952         KERNEL2x2_M1
953         KERNEL2x2_M2
954         KERNEL2x2_M1
955         KERNEL2x2_E
956
957         b        cgemm_kernel_L2_M2_44
958
959 cgemm_kernel_L2_M2_32:
960
961         tst     L, #1
962         ble     cgemm_kernel_L2_M2_40
963
964         KERNEL2x2_I
965         KERNEL2x2_M2
966         KERNEL2x2_M1
967         KERNEL2x2_M2
968
969         KERNEL2x2_M1
970         KERNEL2x2_M2
971         KERNEL2x2_M1
972         KERNEL2x2_E
973
974         b        cgemm_kernel_L2_M2_44
975
976
977 cgemm_kernel_L2_M2_40:
978
979         INIT2x2
980
981
982 cgemm_kernel_L2_M2_44:
983
984         ands    L , K1, #7                                      // L = L % 8
985         ble     cgemm_kernel_L2_M2_100
986
987 cgemm_kernel_L2_M2_46:
988
989         KERNEL2x2_SUB
990
991         subs    L, L, #1
992         bne     cgemm_kernel_L2_M2_46
993
994 cgemm_kernel_L2_M2_100:
995
996         SAVE2x2
997
998 cgemm_kernel_L2_M2_END:
999
1000         subs    I, I, #1
1001         bne     cgemm_kernel_L2_M2_20
1002
1003
1004 cgemm_kernel_L2_M1_BEGIN:
1005
1006         ldr     I, M
1007         tst     I, #1                                   // I = I % 2
1008         ble     cgemm_kernel_L2_END
1009
1010 cgemm_kernel_L2_M1_20:
1011
1012         INIT1x2
1013
1014         mov     BO, BC
1015         asrs    L , K1, #3                                      // L = L / 8
1016         ble     cgemm_kernel_L2_M1_40
1017
1018 cgemm_kernel_L2_M1_22:
1019
1020         KERNEL1x2_SUB
1021         KERNEL1x2_SUB
1022         KERNEL1x2_SUB
1023         KERNEL1x2_SUB
1024
1025         KERNEL1x2_SUB
1026         KERNEL1x2_SUB
1027         KERNEL1x2_SUB
1028         KERNEL1x2_SUB
1029
1030         subs    L, L, #1
1031         bgt     cgemm_kernel_L2_M1_22
1032
1033
1034 cgemm_kernel_L2_M1_40:
1035
1036         ands    L , K1, #7                                      // L = L % 8
1037         ble     cgemm_kernel_L2_M1_100
1038
1039 cgemm_kernel_L2_M1_42:
1040
1041         KERNEL1x2_SUB
1042
1043         subs    L, L, #1
1044         bgt     cgemm_kernel_L2_M1_42
1045
1046 cgemm_kernel_L2_M1_100:
1047
1048         SAVE1x2
1049
1050
1051 cgemm_kernel_L2_END:
1052
1053         mov     r3, BC
1054         mov     r4, K1
1055         lsl     r4, r4, #4                                      // k * 2 * 4 * 2
1056         add     r3, r3, r4                                      // B = B + K * 2 * 8
1057         mov     BC, r3
1058
1059         subs    J , #1                                          // j--
1060         bgt     cgemm_kernel_L2_BEGIN
1061
1062
1063
1064 /*********************************************************************************************/
1065
1066 cgemm_kernel_L1_BEGIN:
1067
1068         ldr     J , N
1069         tst     J , #1
1070         ble     cgemm_kernel_L999
1071
1072
1073         ldr     CO1, C                                          // CO1 = C
1074         ldr     r4 , LDC
1075         add     r3 , r4, CO1
1076         str     r3 , C                                          // store C
1077
1078         ldr     AO, A                                           // AO = A
1079
1080 cgemm_kernel_L1_M2_BEGIN:
1081
1082         ldr     I, M
1083         asrs    I, I, #1                                        // I = I / 2
1084         ble     cgemm_kernel_L1_M1_BEGIN
1085
1086 cgemm_kernel_L1_M2_20:
1087
1088
1089         mov     BO, BC
1090         asrs    L , K1, #3                                      // L = L / 8
1091         cmp     L , #3
1092         blt     cgemm_kernel_L1_M2_30
1093         .align 5
1094
1095
1096
1097         KERNEL2x1_I
1098         KERNEL2x1_M2
1099         KERNEL2x1_M1
1100         KERNEL2x1_M2
1101
1102         KERNEL2x1_M1
1103         KERNEL2x1_M2
1104         KERNEL2x1_M1
1105         KERNEL2x1_M2
1106
1107         sub     L, L, #2
1108
1109 cgemm_kernel_L1_M2_22:
1110
1111         KERNEL2x1_M1
1112         KERNEL2x1_M2
1113         KERNEL2x1_M1
1114         KERNEL2x1_M2
1115
1116         KERNEL2x1_M1
1117         KERNEL2x1_M2
1118         KERNEL2x1_M1
1119         KERNEL2x1_M2
1120
1121         subs    L, L, #1
1122         bgt     cgemm_kernel_L1_M2_22
1123
1124         KERNEL2x1_M1
1125         KERNEL2x1_M2
1126         KERNEL2x1_M1
1127         KERNEL2x1_M2
1128
1129         KERNEL2x1_M1
1130         KERNEL2x1_M2
1131         KERNEL2x1_M1
1132         KERNEL2x1_E
1133
1134         b        cgemm_kernel_L1_M2_44
1135
1136
1137 cgemm_kernel_L1_M2_30:
1138         tst     L, #3
1139         ble     cgemm_kernel_L1_M2_40
1140
1141         tst     L, #2
1142         ble     cgemm_kernel_L1_M2_32
1143
1144         KERNEL2x1_I
1145         KERNEL2x1_M2
1146         KERNEL2x1_M1
1147         KERNEL2x1_M2
1148
1149         KERNEL2x1_M1
1150         KERNEL2x1_M2
1151         KERNEL2x1_M1
1152         KERNEL2x1_M2
1153
1154         KERNEL2x1_M1
1155         KERNEL2x1_M2
1156         KERNEL2x1_M1
1157         KERNEL2x1_M2
1158
1159
1160         KERNEL2x1_M1
1161         KERNEL2x1_M2
1162         KERNEL2x1_M1
1163         KERNEL2x1_E
1164
1165         b        cgemm_kernel_L1_M2_44
1166
1167 cgemm_kernel_L1_M2_32:
1168
1169         tst     L, #1
1170         ble     cgemm_kernel_L1_M2_40
1171
1172         KERNEL2x1_I
1173         KERNEL2x1_M2
1174         KERNEL2x1_M1
1175         KERNEL2x1_M2
1176
1177         KERNEL2x1_M1
1178         KERNEL2x1_M2
1179         KERNEL2x1_M1
1180         KERNEL2x1_E
1181
1182         b        cgemm_kernel_L1_M2_44
1183
1184
1185 cgemm_kernel_L1_M2_40:
1186
1187         INIT2x1
1188
1189
1190 cgemm_kernel_L1_M2_44:
1191
1192         ands    L , K1, #7                                      // L = L % 8
1193         ble     cgemm_kernel_L1_M2_100
1194
1195 cgemm_kernel_L1_M2_46:
1196
1197         KERNEL2x1_SUB
1198
1199         subs    L, L, #1
1200         bne     cgemm_kernel_L1_M2_46
1201
1202 cgemm_kernel_L1_M2_100:
1203
1204         SAVE2x1
1205
1206 cgemm_kernel_L1_M2_END:
1207
1208         subs    I, I, #1
1209         bne     cgemm_kernel_L1_M2_20
1210
1211
1212 cgemm_kernel_L1_M1_BEGIN:
1213
1214         ldr     I, M
1215         tst     I, #1                                   // I = I % 2
1216         ble     cgemm_kernel_L1_END
1217
1218 cgemm_kernel_L1_M1_20:
1219
1220         INIT1x1
1221
1222         mov     BO, BC
1223         asrs    L , K1, #3                                      // L = L / 8
1224         ble     cgemm_kernel_L1_M1_40
1225
1226 cgemm_kernel_L1_M1_22:
1227
1228         KERNEL1x1_SUB
1229         KERNEL1x1_SUB
1230         KERNEL1x1_SUB
1231         KERNEL1x1_SUB
1232
1233         KERNEL1x1_SUB
1234         KERNEL1x1_SUB
1235         KERNEL1x1_SUB
1236         KERNEL1x1_SUB
1237
1238         subs    L, L, #1
1239         bgt     cgemm_kernel_L1_M1_22
1240
1241
1242 cgemm_kernel_L1_M1_40:
1243
1244         ands    L , K1, #7                                      // L = L % 8
1245         ble     cgemm_kernel_L1_M1_100
1246
1247 cgemm_kernel_L1_M1_42:
1248
1249         KERNEL1x1_SUB
1250
1251         subs    L, L, #1
1252         bgt     cgemm_kernel_L1_M1_42
1253
1254 cgemm_kernel_L1_M1_100:
1255
1256         SAVE1x1
1257
1258
1259 cgemm_kernel_L1_END:
1260
1261
1262
1263 cgemm_kernel_L999:
1264
1265         sub     r3, fp, #128
1266         vldm    r3, { s8 - s15}                                 // restore floating point registers
1267
1268         movs    r0, #0                                          // set return value
1269         sub     sp, fp, #24
1270         pop     {r4 - r9, fp}
1271         bx      lr
1272
1273         EPILOGUE
1274