Merge branch 'develop' into arm_soft_fp_abi
[platform/upstream/openblas.git] / kernel / arm / ztrmm_kernel_2x2_vfpv3.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/10/16 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 d0
46 #define OLD_ALPHA_I d1
47
48 /******************************************************
49 * [fp, #-128] - [fp, #-64] is reserved
50 * for store and restore of floating point
51 * registers
52 *******************************************************/
53
54 #define KKK     [fp, #-240]
55 #define KK      [fp, #-244 ]
56 #define A       [fp, #-248 ]
57 #define LDC     [fp, #-252 ]
58 #define M       [fp, #-256 ]
59 #define N       [fp, #-260 ]
60 #define K       [fp, #-264 ]
61
62 #define FP_ZERO [fp, #-236]
63 #define FP_ZERO_0 [fp, #-236]
64 #define FP_ZERO_1 [fp, #-232]
65
66 #define ALPHA_I [fp, #-272]
67 #define ALPHA_R [fp, #-280]
68
69 #define B       [fp, #4 ]
70 #define C       [fp, #8 ]
71 #define OLD_LDC [fp, #12 ]
72 #define OFFSET  [fp, #16 ]
73
74 #define I       r0
75 #define J       r1
76 #define L       r2
77
78 #define AO      r5
79 #define BO      r6
80
81 #define CO1     r8
82 #define CO2     r9
83
84 #define K1      r7
85 #define BC      r12
86
87 #define A_PRE   96
88 #define B_PRE   96
89 #define C_PRE   64
90
91 #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
92
93         #define FADD_R  fsubd
94         #define FADD_I  faddd
95
96         #define FMAC_R1 fnmuld
97         #define FMAC_R2 fnmacd
98         #define FMAC_I1 fmuld
99         #define FMAC_I2 fnmacd
100
101 #elif defined(CN) || defined(CT)
102
103         #define FADD_R  faddd
104         #define FADD_I  fsubd
105
106         #define FMAC_R1 fmuld
107         #define FMAC_R2 fmacd
108         #define FMAC_I1 fnmuld
109         #define FMAC_I2 fmacd
110
111 #elif defined(NC) || defined(TC)
112
113         #define FADD_R  faddd
114         #define FADD_I  fsubd
115
116         #define FMAC_R1 fmuld
117         #define FMAC_R2 fnmacd
118         #define FMAC_I1 fmuld
119         #define FMAC_I2 fmacd
120
121 #else
122
123         #define FADD_R  fsubd
124         #define FADD_I  faddd
125
126         #define FMAC_R1 fnmuld
127         #define FMAC_R2 fmacd
128         #define FMAC_I1 fnmuld
129         #define FMAC_I2 fnmacd
130
131 #endif
132
133
134
135 /**************************************************************************************
136 * Macro definitions
137 **************************************************************************************/
138
139 .macro INIT2x2
140
141         fldd                    d16 , FP_ZERO
142         vmov.f64                d17, d16
143         vmov.f64                d18, d16
144         vmov.f64                d19, d16
145         vmov.f64                d20, d16
146         vmov.f64                d21, d16
147         vmov.f64                d22, d16
148         vmov.f64                d23, d16
149         vmov.f64                d24, d16
150         vmov.f64                d25, d16
151         vmov.f64                d26, d16
152         vmov.f64                d27, d16
153         vmov.f64                d28, d16
154         vmov.f64                d29, d16
155         vmov.f64                d30, d16
156         vmov.f64                d31, d16
157
158 .endm
159
160 .macro KERNEL2x2_I
161         pld     [ AO , #A_PRE ]
162         pld     [ BO , #B_PRE ]
163         fldd    d0 , [ AO ]
164         fldd    d1 , [ AO, #8 ]
165         fldd    d8 , [ BO ]
166         fldd    d9 , [ BO, #8 ]
167
168         fmuld   d16  , d0,  d8
169         fldd    d2 , [ AO, #16 ]
170         fmuld   d24  , d1,  d9
171         fldd    d3 , [ AO, #24 ]
172         fmuld   d17  , d0,  d9
173         fldd    d10, [ BO, #16 ]
174         fmuld   d25  , d1,  d8
175
176         fldd    d11, [ BO, #24 ]
177         fmuld   d18  , d2,  d8
178         add     BO , BO, #32
179         fmuld   d26  , d3,  d9
180         add     AO , AO, #32
181         fmuld   d19  , d2,  d9
182         pld     [ BO , #B_PRE ]
183         fmuld   d27  , d3,  d8
184
185         pld     [ AO , #A_PRE ]
186         fmuld   d20  , d0,  d10
187         fldd    d4 , [ AO, #0 ]
188         fmuld   d28  , d1,  d11
189         fldd    d5 , [ AO, #8 ]
190         fmuld   d21  , d0,  d11
191         fldd    d12, [ BO ]
192         fmuld   d29  , d1,  d10
193
194         fldd    d13, [ BO, #8 ]
195         fmuld   d22  , d2,  d10
196         fldd    d6 , [ AO, #16 ]
197         fmuld   d30  , d3,  d11
198         fldd    d7 , [ AO, #24 ]
199         fmuld   d23  , d2,  d11
200         fldd    d14, [ BO, #16 ]
201         fmuld   d31  , d3,  d10
202         fldd    d15, [ BO, #24 ]
203
204         add     BO , BO, #32
205         add     AO , AO, #32
206 .endm
207
208
209
210 .macro KERNEL2x2_M1
211         pld     [ AO , #A_PRE ]
212
213         fmacd   d16  , d0,  d8
214         pld     [ BO , #B_PRE ]
215         fmacd   d24  , d1,  d9
216         fldd    d4 , [ AO, #0 ]
217         fmacd   d17  , d0,  d9
218         fldd    d5 , [ AO, #8 ]
219         fmacd   d25  , d1,  d8
220
221         fldd    d12, [ BO ]
222         fmacd   d18  , d2,  d8
223         fldd    d13, [ BO, #8 ]
224         fmacd   d26  , d3,  d9
225         fldd    d6 , [ AO, #16 ]
226         fmacd   d19  , d2,  d9
227         fldd    d7 , [ AO, #24 ]
228         fmacd   d27  , d3,  d8
229
230         fmacd   d20  , d0,  d10
231         fldd    d14, [ BO, #16 ]
232         fmacd   d28  , d1,  d11
233         fmacd   d21  , d0,  d11
234         fldd    d15, [ BO, #24 ]
235         fmacd   d29  , d1,  d10
236
237         fmacd   d22  , d2,  d10
238         add     BO , BO, #32
239         fmacd   d30  , d3,  d11
240         fmacd   d23  , d2,  d11
241         add     AO , AO, #32
242         fmacd   d31  , d3,  d10
243
244 .endm
245
246 .macro KERNEL2x2_M2
247         pld     [ AO , #A_PRE ]
248
249         fmacd   d16  , d4,  d12
250         pld     [ BO , #B_PRE ]
251         fmacd   d24  , d5,  d13
252         fldd    d0 , [ AO, #0 ]
253         fmacd   d17  , d4,  d13
254         fldd    d1 , [ AO, #8 ]
255         fmacd   d25  , d5,  d12
256
257         fmacd   d18  , d6,  d12
258         fldd    d8 , [ BO ]
259         fmacd   d26  , d7,  d13
260         fldd    d9 , [ BO, #8 ]
261         fmacd   d19  , d6,  d13
262         fmacd   d27  , d7,  d12
263
264         fldd    d2 , [ AO, #16 ]
265         fmacd   d20  , d4,  d14
266         fldd    d3 , [ AO, #24 ]
267         fmacd   d28  , d5,  d15
268         fmacd   d21  , d4,  d15
269         fldd    d10, [ BO, #16 ]
270         fmacd   d29  , d5,  d14
271
272         fldd    d11, [ BO, #24 ]
273         fmacd   d22  , d6,  d14
274         fmacd   d30  , d7,  d15
275         add     BO , BO, #32
276         fmacd   d23  , d6,  d15
277         add     AO , AO, #32
278         fmacd   d31  , d7,  d14
279
280 .endm
281
282
283 .macro KERNEL2x2_E
284
285         fmacd   d16  , d4,  d12
286         fmacd   d24  , d5,  d13
287         fmacd   d17  , d4,  d13
288         fmacd   d25  , d5,  d12
289
290         fmacd   d18  , d6,  d12
291         fmacd   d26  , d7,  d13
292         fmacd   d19  , d6,  d13
293         fmacd   d27  , d7,  d12
294
295         fmacd   d20  , d4,  d14
296         fmacd   d28  , d5,  d15
297         fmacd   d21  , d4,  d15
298         fmacd   d29  , d5,  d14
299
300         fmacd   d22  , d6,  d14
301         fmacd   d30  , d7,  d15
302         fmacd   d23  , d6,  d15
303         fmacd   d31  , d7,  d14
304
305 .endm
306
307 .macro KERNEL2x2_SUB
308
309         pld     [ AO , #A_PRE ]
310         pld     [ BO , #B_PRE ]
311         fldd    d0 , [ AO ]
312         fldd    d1 , [ AO, #8 ]
313         fldd    d8 , [ BO ]
314         fldd    d9 , [ BO, #8 ]
315
316         fmacd   d16  , d0,  d8
317         fldd    d2 , [ AO, #16 ]
318         fmacd   d24  , d1,  d9
319         fldd    d3 , [ AO, #24 ]
320         fmacd   d17  , d0,  d9
321         fldd    d10, [ BO, #16 ]
322         fmacd   d25  , d1,  d8
323
324         fldd    d11, [ BO, #24 ]
325         fmacd   d18  , d2,  d8
326         fmacd   d26  , d3,  d9
327         fmacd   d19  , d2,  d9
328         fmacd   d27  , d3,  d8
329
330         fmacd   d20  , d0,  d10
331         fmacd   d28  , d1,  d11
332         fmacd   d21  , d0,  d11
333         fmacd   d29  , d1,  d10
334
335         fmacd   d22  , d2,  d10
336         add     BO , BO, #32
337         fmacd   d30  , d3,  d11
338         fmacd   d23  , d2,  d11
339         add     AO , AO, #32
340         fmacd   d31  , d3,  d10
341
342 .endm
343
344
345
346
347 .macro SAVE2x2
348
349         ldr     r3  , LDC
350         add     CO2 , CO1, r3
351         fldd            d0, ALPHA_R
352         fldd            d1, ALPHA_I
353
354
355         FADD_R  d16, d24 , d16
356         FADD_I  d17, d25 , d17
357         FADD_R  d18, d26 , d18
358         FADD_I  d19, d27 , d19
359         FADD_R  d20, d28 , d20
360         FADD_I  d21, d29 , d21
361         FADD_R  d22, d30 , d22
362         FADD_I  d23, d31 , d23
363
364         FMAC_R1 d4 , d0 , d16
365         FMAC_I1 d5 , d0 , d17
366         FMAC_R2 d4 , d1 , d17
367         FMAC_I2 d5 , d1 , d16
368
369         FMAC_R1 d6 , d0 , d18
370         FMAC_I1 d7 , d0 , d19
371         FMAC_R2 d6 , d1 , d19
372         FMAC_I2 d7 , d1 , d18
373
374         FMAC_R1 d8 , d0 , d20
375         FMAC_I1 d9 , d0 , d21
376         FMAC_R2 d8 , d1 , d21
377         FMAC_I2 d9 , d1 , d20
378
379         FMAC_R1 d10, d0 , d22
380         FMAC_I1 d11, d0 , d23
381         FMAC_R2 d10, d1 , d23
382         FMAC_I2 d11, d1 , d22
383
384         fstmiad CO1, { d4 - d7 }
385         fstmiad CO2, { d8 - d11 }
386
387         add     CO1, CO1, #32
388
389 .endm
390
391 /******************************************************************************/
392
393 .macro INIT1x2
394
395         fldd                    d16 , FP_ZERO
396         vmov.f64                d17, d16
397         vmov.f64                d20, d16
398         vmov.f64                d21, d16
399         vmov.f64                d24, d16
400         vmov.f64                d25, d16
401         vmov.f64                d28, d16
402         vmov.f64                d29, d16
403
404 .endm
405
406 .macro KERNEL1x2_I
407         pld     [ AO , #A_PRE ]
408         pld     [ BO , #B_PRE ]
409         fldd    d0 , [ AO ]
410         fldd    d1 , [ AO, #8 ]
411         fldd    d8 , [ BO ]
412         fldd    d9 , [ BO, #8 ]
413         fldd    d10, [ BO, #16 ]
414         fldd    d11, [ BO, #24 ]
415
416         fmuld   d16  , d0,  d8
417         fmuld   d24  , d1,  d9
418         fmuld   d17  , d0,  d9
419         fmuld   d25  , d1,  d8
420
421         fmuld   d20  , d0,  d10
422         fmuld   d28  , d1,  d11
423         fmuld   d21  , d0,  d11
424         fmuld   d29  , d1,  d10
425
426         add     BO , BO, #32
427         add     AO , AO, #16
428
429         pld     [ BO , #B_PRE ]
430
431         fldd    d4 , [ AO, #0 ]
432         fldd    d5 , [ AO, #8 ]
433
434         fldd    d12, [ BO ]
435         fldd    d13, [ BO, #8 ]
436         fldd    d14, [ BO, #16 ]
437         fldd    d15, [ BO, #24 ]
438
439         add     BO , BO, #32
440         add     AO , AO, #16
441 .endm
442
443
444
445 .macro KERNEL1x2_M1
446         pld     [ BO , #B_PRE ]
447
448         fmacd   d16  , d0,  d8
449         fmacd   d24  , d1,  d9
450         fmacd   d17  , d0,  d9
451         fmacd   d25  , d1,  d8
452
453         fmacd   d20  , d0,  d10
454         fmacd   d28  , d1,  d11
455         fmacd   d21  , d0,  d11
456         fmacd   d29  , d1,  d10
457
458         fldd    d4 , [ AO, #0 ]
459         fldd    d5 , [ AO, #8 ]
460
461         fldd    d12, [ BO ]
462         fldd    d13, [ BO, #8 ]
463         fldd    d14, [ BO, #16 ]
464         fldd    d15, [ BO, #24 ]
465
466         add     BO , BO, #32
467         add     AO , AO, #16
468 .endm
469
470 .macro KERNEL1x2_M2
471         pld     [ AO , #A_PRE ]
472         pld     [ BO , #B_PRE ]
473
474         fmacd   d16  , d4,  d12
475         fmacd   d24  , d5,  d13
476         fmacd   d17  , d4,  d13
477         fmacd   d25  , d5,  d12
478
479         fmacd   d20  , d4,  d14
480         fmacd   d28  , d5,  d15
481         fmacd   d21  , d4,  d15
482         fmacd   d29  , d5,  d14
483
484         fldd    d0 , [ AO, #0 ]
485         fldd    d1 , [ AO, #8 ]
486
487         fldd    d8 , [ BO ]
488         fldd    d9 , [ BO, #8 ]
489         fldd    d10, [ BO, #16 ]
490         fldd    d11, [ BO, #24 ]
491
492         add     BO , BO, #32
493         add     AO , AO, #16
494 .endm
495
496
497 .macro KERNEL1x2_E
498
499         fmacd   d16  , d4,  d12
500         fmacd   d24  , d5,  d13
501         fmacd   d17  , d4,  d13
502         fmacd   d25  , d5,  d12
503
504         fmacd   d20  , d4,  d14
505         fmacd   d28  , d5,  d15
506         fmacd   d21  , d4,  d15
507         fmacd   d29  , d5,  d14
508
509 .endm
510
511 .macro KERNEL1x2_SUB
512
513         pld     [ AO , #A_PRE ]
514         pld     [ BO , #B_PRE ]
515         fldd    d0 , [ AO ]
516         fldd    d1 , [ AO, #8 ]
517         fldd    d8 , [ BO ]
518         fldd    d9 , [ BO, #8 ]
519         fldd    d10, [ BO, #16 ]
520         fldd    d11, [ BO, #24 ]
521
522         fmacd   d16  , d0,  d8
523         fmacd   d24  , d1,  d9
524         fmacd   d17  , d0,  d9
525         fmacd   d25  , d1,  d8
526
527         fmacd   d20  , d0,  d10
528         fmacd   d28  , d1,  d11
529         fmacd   d21  , d0,  d11
530         fmacd   d29  , d1,  d10
531
532         add     BO , BO, #32
533         add     AO , AO, #16
534
535 .endm
536
537
538
539
540 .macro SAVE1x2
541
542         ldr     r3  , LDC
543         add     CO2 , CO1, r3
544         fldd            d0, ALPHA_R
545         fldd            d1, ALPHA_I
546
547         FADD_R  d16, d24 , d16
548         FADD_I  d17, d25 , d17
549         FADD_R  d20, d28 , d20
550         FADD_I  d21, d29 , d21
551
552         FMAC_R1 d4 , d0 , d16
553         FMAC_I1 d5 , d0 , d17
554         FMAC_R2 d4 , d1 , d17
555         FMAC_I2 d5 , d1 , d16
556
557         FMAC_R1 d8 , d0 , d20
558         FMAC_I1 d9 , d0 , d21
559         FMAC_R2 d8 , d1 , d21
560         FMAC_I2 d9 , d1 , d20
561
562         fstmiad CO1, { d4 - d5 }
563         fstmiad CO2, { d8 - d9  }
564
565         add     CO1, CO1, #16
566
567 .endm
568
569 /******************************************************************************/
570
571 .macro INIT2x1
572
573         fldd                    d16 , FP_ZERO
574         vmov.f64                d17, d16
575         vmov.f64                d18, d16
576         vmov.f64                d19, d16
577         vmov.f64                d24, d16
578         vmov.f64                d25, d16
579         vmov.f64                d26, d16
580         vmov.f64                d27, d16
581
582 .endm
583
584 .macro KERNEL2x1_I
585         pld     [ AO , #A_PRE ]
586         pld     [ BO , #B_PRE ]
587         fldd    d0 , [ AO ]
588         fldd    d1 , [ AO, #8 ]
589         fldd    d2 , [ AO, #16 ]
590         fldd    d3 , [ AO, #24 ]
591         fldd    d8 , [ BO ]
592         fldd    d9 , [ BO, #8 ]
593
594         fmuld   d16  , d0,  d8
595         fmuld   d24  , d1,  d9
596         fmuld   d17  , d0,  d9
597         fmuld   d25  , d1,  d8
598
599         fmuld   d18  , d2,  d8
600         fmuld   d26  , d3,  d9
601         fmuld   d19  , d2,  d9
602         fmuld   d27  , d3,  d8
603
604         add     BO , BO, #16
605         add     AO , AO, #32
606
607         pld     [ BO , #B_PRE ]
608         pld     [ AO , #A_PRE ]
609
610         fldd    d4 , [ AO, #0 ]
611         fldd    d5 , [ AO, #8 ]
612         fldd    d6 , [ AO, #16 ]
613         fldd    d7 , [ AO, #24 ]
614
615         fldd    d12, [ BO ]
616         fldd    d13, [ BO, #8 ]
617
618         add     BO , BO, #16
619         add     AO , AO, #32
620 .endm
621
622
623
624 .macro KERNEL2x1_M1
625         pld     [ AO , #A_PRE ]
626         pld     [ BO , #B_PRE ]
627
628         fmacd   d16  , d0,  d8
629         fmacd   d24  , d1,  d9
630         fmacd   d17  , d0,  d9
631         fmacd   d25  , d1,  d8
632
633         fmacd   d18  , d2,  d8
634         fmacd   d26  , d3,  d9
635         fmacd   d19  , d2,  d9
636         fmacd   d27  , d3,  d8
637
638         fldd    d4 , [ AO, #0 ]
639         fldd    d5 , [ AO, #8 ]
640         fldd    d6 , [ AO, #16 ]
641         fldd    d7 , [ AO, #24 ]
642
643         fldd    d12, [ BO ]
644         fldd    d13, [ BO, #8 ]
645
646         add     BO , BO, #16
647         add     AO , AO, #32
648 .endm
649
650 .macro KERNEL2x1_M2
651         pld     [ AO , #A_PRE ]
652         pld     [ BO , #B_PRE ]
653
654         fmacd   d16  , d4,  d12
655         fmacd   d24  , d5,  d13
656         fmacd   d17  , d4,  d13
657         fmacd   d25  , d5,  d12
658
659         fmacd   d18  , d6,  d12
660         fmacd   d26  , d7,  d13
661         fmacd   d19  , d6,  d13
662         fmacd   d27  , d7,  d12
663
664         fldd    d0 , [ AO, #0 ]
665         fldd    d1 , [ AO, #8 ]
666         fldd    d2 , [ AO, #16 ]
667         fldd    d3 , [ AO, #24 ]
668
669         fldd    d8 , [ BO ]
670         fldd    d9 , [ BO, #8 ]
671
672         add     BO , BO, #16
673         add     AO , AO, #32
674 .endm
675
676
677 .macro KERNEL2x1_E
678
679         fmacd   d16  , d4,  d12
680         fmacd   d24  , d5,  d13
681         fmacd   d17  , d4,  d13
682         fmacd   d25  , d5,  d12
683
684         fmacd   d18  , d6,  d12
685         fmacd   d26  , d7,  d13
686         fmacd   d19  , d6,  d13
687         fmacd   d27  , d7,  d12
688
689 .endm
690
691 .macro KERNEL2x1_SUB
692
693         pld     [ AO , #A_PRE ]
694         pld     [ BO , #B_PRE ]
695         fldd    d0 , [ AO ]
696         fldd    d1 , [ AO, #8 ]
697         fldd    d2 , [ AO, #16 ]
698         fldd    d3 , [ AO, #24 ]
699         fldd    d8 , [ BO ]
700         fldd    d9 , [ BO, #8 ]
701
702         fmacd   d16  , d0,  d8
703         fmacd   d24  , d1,  d9
704         fmacd   d17  , d0,  d9
705         fmacd   d25  , d1,  d8
706
707         fmacd   d18  , d2,  d8
708         fmacd   d26  , d3,  d9
709         fmacd   d19  , d2,  d9
710         fmacd   d27  , d3,  d8
711
712         add     BO , BO, #16
713         add     AO , AO, #32
714
715 .endm
716
717
718
719
720 .macro SAVE2x1
721
722         fldd            d0, ALPHA_R
723         fldd            d1, ALPHA_I
724
725         FADD_R  d16, d24 , d16
726         FADD_I  d17, d25 , d17
727         FADD_R  d18, d26 , d18
728         FADD_I  d19, d27 , d19
729
730         FMAC_R1 d4 , d0 , d16
731         FMAC_I1 d5 , d0 , d17
732         FMAC_R2 d4 , d1 , d17
733         FMAC_I2 d5 , d1 , d16
734
735         FMAC_R1 d6 , d0 , d18
736         FMAC_I1 d7 , d0 , d19
737         FMAC_R2 d6 , d1 , d19
738         FMAC_I2 d7 , d1 , d18
739
740         fstmiad CO1, { d4 - d7 }
741
742         add     CO1, CO1, #32
743
744 .endm
745
746 /******************************************************************************/
747
748 .macro INIT1x1
749
750         fldd                    d16 , FP_ZERO
751         vmov.f64                d17, d16
752         vmov.f64                d24, d16
753         vmov.f64                d25, d16
754
755 .endm
756
757 .macro KERNEL1x1_I
758         pld     [ AO , #A_PRE ]
759         pld     [ BO , #B_PRE ]
760         fldd    d0 , [ AO ]
761         fldd    d1 , [ AO, #8 ]
762         fldd    d8 , [ BO ]
763         fldd    d9 , [ BO, #8 ]
764
765         fmuld   d16  , d0,  d8
766         fmuld   d24  , d1,  d9
767         fmuld   d17  , d0,  d9
768         fmuld   d25  , d1,  d8
769
770         add     BO , BO, #16
771         add     AO , AO, #16
772
773         pld     [ BO , #B_PRE ]
774         pld     [ AO , #A_PRE ]
775
776         fldd    d4 , [ AO, #0 ]
777         fldd    d5 , [ AO, #8 ]
778
779         fldd    d12, [ BO ]
780         fldd    d13, [ BO, #8 ]
781
782         add     BO , BO, #16
783         add     AO , AO, #16
784 .endm
785
786
787
788 .macro KERNEL1x1_M1
789
790         fmacd   d16  , d0,  d8
791         fmacd   d24  , d1,  d9
792         fmacd   d17  , d0,  d9
793         fmacd   d25  , d1,  d8
794
795         fldd    d4 , [ AO, #0 ]
796         fldd    d5 , [ AO, #8 ]
797
798         fldd    d12, [ BO ]
799         fldd    d13, [ BO, #8 ]
800
801         add     BO , BO, #16
802         add     AO , AO, #16
803 .endm
804
805 .macro KERNEL1x1_M2
806
807         fmacd   d16  , d4,  d12
808         fmacd   d24  , d5,  d13
809         fmacd   d17  , d4,  d13
810         fmacd   d25  , d5,  d12
811
812         fldd    d0 , [ AO, #0 ]
813         fldd    d1 , [ AO, #8 ]
814
815         fldd    d8 , [ BO ]
816         fldd    d9 , [ BO, #8 ]
817
818         add     BO , BO, #16
819         add     AO , AO, #16
820 .endm
821
822
823 .macro KERNEL1x1_E
824
825         fmacd   d16  , d4,  d12
826         fmacd   d24  , d5,  d13
827         fmacd   d17  , d4,  d13
828         fmacd   d25  , d5,  d12
829
830 .endm
831
832 .macro KERNEL1x1_SUB
833
834         fldd    d0 , [ AO ]
835         fldd    d1 , [ AO, #8 ]
836         fldd    d8 , [ BO ]
837         fldd    d9 , [ BO, #8 ]
838
839         fmacd   d16  , d0,  d8
840         fmacd   d24  , d1,  d9
841         fmacd   d17  , d0,  d9
842         fmacd   d25  , d1,  d8
843
844         add     BO , BO, #16
845         add     AO , AO, #16
846
847 .endm
848
849
850
851
852 .macro SAVE1x1
853
854         fldd            d0, ALPHA_R
855         fldd            d1, ALPHA_I
856
857         FADD_R  d16, d24 , d16
858         FADD_I  d17, d25 , d17
859
860         FMAC_R1 d4 , d0 , d16
861         FMAC_I1 d5 , d0 , d17
862         FMAC_R2 d4 , d1 , d17
863         FMAC_I2 d5 , d1 , d16
864
865         fstmiad CO1, { d4 - d5 }
866
867         add     CO1, CO1, #16
868
869 .endm
870
871 /******************************************************************************/
872
873
874 /**************************************************************************************
875 * End of macro definitions
876 **************************************************************************************/
877
878         PROLOGUE
879
880         .align 5
881
882         push    {r4 - r9, fp}
883         add     fp, sp, #24
884         sub     sp, sp, #STACKSIZE                              // reserve stack
885
886         str     OLD_M, M
887         str     OLD_N, N
888         str     OLD_K, K
889         str     OLD_A, A
890         vstr    OLD_ALPHA_R, ALPHA_R
891         vstr    OLD_ALPHA_I, ALPHA_I
892
893         sub     r3, fp, #128
894         vstm    r3, { d8 - d15}                                 // store floating point registers
895
896         movs    r4, #0
897         str     r4, FP_ZERO
898         str     r4, FP_ZERO_1
899
900         ldr     r3, OLD_LDC
901         lsl     r3, r3, #4                                      // ldc = ldc * 8 * 2
902         str     r3, LDC
903
904         ldr     r3, OFFSET
905 #ifndef LEFT
906         neg     r3 , r3
907 #endif
908         str     r3 , KK
909
910         ldr     BC, B
911
912         ldr     J, N
913         asrs    J, J, #1                                        // J = J / 2
914         ble     _L1_BEGIN
915
916 _L2_BEGIN:
917
918         ldr     CO1, C                                          // CO1 = C
919         ldr     r4 , LDC
920         lsl     r4 , r4 , #1                                    // LDC * 2
921         add     r3 , r4, CO1
922         str     r3 , C                                          // store C
923
924 #if defined(LEFT)
925         ldr     r3 , OFFSET
926         str     r3 , KK
927 #endif
928
929
930         ldr     AO, A                                           // AO = A
931         pld     [AO , #A_PRE-64]
932         pld     [AO , #A_PRE-32]
933
934
935
936 _L2_M2_BEGIN:
937
938         ldr     I, M
939         asrs    I, I, #1                                        // I = I / 2
940         ble     _L2_M1_BEGIN
941
942 _L2_M2_20:
943
944 #if  (defined(LEFT) &&  defined(TRANSA)) || \
945     (!defined(LEFT) && !defined(TRANSA))
946
947         mov     BO, BC
948 #else
949         mov     BO, BC
950         ldr     r3 , KK
951         lsls    r4 , r3 , #5                                    // 2 * 8 * 2 double values
952         add     BO , BO , r4
953         lsls    r4 , r3 , #5                                    // 2 * 8 * 2 double values
954         add     AO , AO , r4
955
956 #endif
957
958 #ifndef TRMMKERNEL
959         ldr     K1, K
960 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
961         ldr     K1, K
962         ldr     r3, KK
963         sub     K1, K1, r3
964         str     K1, KKK
965 #else
966         ldr     K1, KK
967 #ifdef LEFT
968         add     K1, K1, #2        // number of values in AO
969 #else
970         add     K1, K1, #2        // number of values in BO
971 #endif
972         str     K1, KKK
973 #endif
974
975
976         asrs    L , K1, #3                                      // L = L / 8
977         cmp     L , #3
978         blt     _L2_M2_30
979         .align 5
980
981
982
983         KERNEL2x2_I
984         KERNEL2x2_M2
985         KERNEL2x2_M1
986         KERNEL2x2_M2
987
988         KERNEL2x2_M1
989         KERNEL2x2_M2
990         KERNEL2x2_M1
991         KERNEL2x2_M2
992
993         sub     L, L, #2
994
995 _L2_M2_22:
996
997         KERNEL2x2_M1
998         KERNEL2x2_M2
999         KERNEL2x2_M1
1000         KERNEL2x2_M2
1001
1002         KERNEL2x2_M1
1003         KERNEL2x2_M2
1004         KERNEL2x2_M1
1005         KERNEL2x2_M2
1006
1007         subs    L, L, #1
1008         bgt     _L2_M2_22
1009
1010         KERNEL2x2_M1
1011         KERNEL2x2_M2
1012         KERNEL2x2_M1
1013         KERNEL2x2_M2
1014
1015         KERNEL2x2_M1
1016         KERNEL2x2_M2
1017         KERNEL2x2_M1
1018         KERNEL2x2_E
1019
1020         b        _L2_M2_44
1021
1022
1023 _L2_M2_30:
1024         tst     L, #3
1025         ble     _L2_M2_40
1026
1027         tst     L, #2
1028         ble     _L2_M2_32
1029
1030         KERNEL2x2_I
1031         KERNEL2x2_M2
1032         KERNEL2x2_M1
1033         KERNEL2x2_M2
1034
1035         KERNEL2x2_M1
1036         KERNEL2x2_M2
1037         KERNEL2x2_M1
1038         KERNEL2x2_M2
1039
1040         KERNEL2x2_M1
1041         KERNEL2x2_M2
1042         KERNEL2x2_M1
1043         KERNEL2x2_M2
1044
1045
1046         KERNEL2x2_M1
1047         KERNEL2x2_M2
1048         KERNEL2x2_M1
1049         KERNEL2x2_E
1050
1051         b        _L2_M2_44
1052
1053 _L2_M2_32:
1054
1055         tst     L, #1
1056         ble     _L2_M2_40
1057
1058         KERNEL2x2_I
1059         KERNEL2x2_M2
1060         KERNEL2x2_M1
1061         KERNEL2x2_M2
1062
1063         KERNEL2x2_M1
1064         KERNEL2x2_M2
1065         KERNEL2x2_M1
1066         KERNEL2x2_E
1067
1068         b        _L2_M2_44
1069
1070
1071 _L2_M2_40:
1072
1073         INIT2x2
1074
1075
1076 _L2_M2_44:
1077
1078         ands    L , K1, #7                                      // L = L % 8
1079         ble     _L2_M2_100
1080
1081 _L2_M2_46:
1082
1083         KERNEL2x2_SUB
1084
1085         subs    L, L, #1
1086         bne     _L2_M2_46
1087
1088 _L2_M2_100:
1089
1090         SAVE2x2
1091
1092 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1093     (!defined(LEFT) && !defined(TRANSA))
1094         ldr     r3 , K
1095         ldr     r4 , KKK
1096         sub     r3 , r3 , r4
1097         lsls    r4 , r3 , #5                    // 2 * 8 * 2 double values
1098         add     BO , BO , r4
1099         lsls    r4 , r3 , #5                    // 2 * 8 * 2 double values
1100         add     AO , AO , r4
1101 #endif
1102
1103 #if defined(LEFT)
1104         ldr     r3 , KK
1105         add     r3 , r3 , #2                    // number of values in AO
1106         str     r3 , KK
1107 #endif
1108
1109
1110
1111
1112 _L2_M2_END:
1113
1114         subs    I, I, #1
1115         bne     _L2_M2_20
1116
1117
1118 _L2_M1_BEGIN:
1119
1120         ldr     I, M
1121         tst     I, #1                                   // I = I % 2
1122         ble     _L2_END
1123
1124 _L2_M1_20:
1125
1126         INIT1x2
1127
1128 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1129     (!defined(LEFT) && !defined(TRANSA))
1130
1131         mov     BO, BC
1132 #else
1133         mov     BO, BC
1134         ldr     r3 , KK
1135         lsls    r4 , r3 , #5                                    // 2 * 8 * 2 double values
1136         add     BO , BO , r4
1137         lsls    r4 , r3 , #4                                    // 1 * 8 * 2 double values
1138         add     AO , AO , r4
1139
1140 #endif
1141
1142 #ifndef TRMMKERNEL
1143         ldr     K1, K
1144 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1145         ldr     K1, K
1146         ldr     r3, KK
1147         sub     K1, K1, r3
1148         str     K1, KKK
1149 #else
1150         ldr     K1, KK
1151 #ifdef LEFT
1152         add     K1, K1, #1        // number of values in AO
1153 #else
1154         add     K1, K1, #2        // number of values in BO
1155 #endif
1156         str     K1, KKK
1157 #endif
1158
1159         asrs    L , K1, #3                                      // L = L / 8
1160         ble     _L2_M1_40
1161
1162 _L2_M1_22:
1163
1164         KERNEL1x2_SUB
1165         KERNEL1x2_SUB
1166         KERNEL1x2_SUB
1167         KERNEL1x2_SUB
1168
1169         KERNEL1x2_SUB
1170         KERNEL1x2_SUB
1171         KERNEL1x2_SUB
1172         KERNEL1x2_SUB
1173
1174         subs    L, L, #1
1175         bgt     _L2_M1_22
1176
1177
1178 _L2_M1_40:
1179
1180         ands    L , K1, #7                                      // L = L % 8
1181         ble     _L2_M1_100
1182
1183 _L2_M1_42:
1184
1185         KERNEL1x2_SUB
1186
1187         subs    L, L, #1
1188         bgt     _L2_M1_42
1189
1190 _L2_M1_100:
1191
1192         SAVE1x2
1193
1194 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1195     (!defined(LEFT) && !defined(TRANSA))
1196         ldr     r3 , K
1197         ldr     r4 , KKK
1198         sub     r3 , r3 , r4
1199         lsls    r4 , r3 , #5                    // 2 * 8 * 2 double values
1200         add     BO , BO , r4
1201         lsls    r4 , r3 , #4                    // 1 * 8 * 2 double values
1202         add     AO , AO , r4
1203 #endif
1204
1205 #if defined(LEFT)
1206         ldr     r3 , KK
1207         add     r3 , r3 , #1                    // number of values in AO
1208         str     r3 , KK
1209 #endif
1210
1211
1212
1213 _L2_END:
1214
1215         mov     r3, BC
1216         ldr     r4, K
1217         lsl     r4, r4, #5                                      // k * 2 * 8 * 2
1218         add     r3, r3, r4                                      // B = B + K * 4 * 8
1219         mov     BC, r3
1220
1221 #if !defined(LEFT)
1222         ldr     r3 , KK
1223         add     r3 , r3 , #2                                    // number of values in BO
1224         str     r3 , KK
1225 #endif
1226
1227
1228         subs    J , #1                                          // j--
1229         bgt     _L2_BEGIN
1230
1231
1232
1233 /*********************************************************************************************/
1234
1235 _L1_BEGIN:
1236
1237         ldr     J , N
1238         tst     J , #1
1239         ble     _L999
1240
1241
1242         ldr     CO1, C                                          // CO1 = C
1243         ldr     r4 , LDC
1244         add     r3 , r4, CO1
1245         str     r3 , C                                          // store C
1246
1247 #if defined(LEFT)
1248         ldr     r3 , OFFSET
1249         str     r3 , KK
1250 #endif
1251
1252
1253         ldr     AO, A                                           // AO = A
1254
1255 _L1_M2_BEGIN:
1256
1257         ldr     I, M
1258         asrs    I, I, #1                                        // I = I / 2
1259         ble     _L1_M1_BEGIN
1260
1261 _L1_M2_20:
1262
1263 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1264     (!defined(LEFT) && !defined(TRANSA))
1265
1266         mov     BO, BC
1267 #else
1268         mov     BO, BC
1269         ldr     r3 , KK
1270         lsls    r4 , r3 , #4                                    // 1 * 8 * 2 double values
1271         add     BO , BO , r4
1272         lsls    r4 , r3 , #5                                    // 2 * 8 * 2 double values
1273         add     AO , AO , r4
1274
1275 #endif
1276
1277 #ifndef TRMMKERNEL
1278         ldr     K1, K
1279 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1280         ldr     K1, K
1281         ldr     r3, KK
1282         sub     K1, K1, r3
1283         str     K1, KKK
1284 #else
1285         ldr     K1, KK
1286 #ifdef LEFT
1287         add     K1, K1, #2        // number of values in AO
1288 #else
1289         add     K1, K1, #1        // number of values in BO
1290 #endif
1291         str     K1, KKK
1292 #endif
1293
1294         asrs    L , K1, #3                                      // L = L / 8
1295         cmp     L , #3
1296         blt     _L1_M2_30
1297         .align 5
1298
1299
1300
1301         KERNEL2x1_I
1302         KERNEL2x1_M2
1303         KERNEL2x1_M1
1304         KERNEL2x1_M2
1305
1306         KERNEL2x1_M1
1307         KERNEL2x1_M2
1308         KERNEL2x1_M1
1309         KERNEL2x1_M2
1310
1311         sub     L, L, #2
1312
1313 _L1_M2_22:
1314
1315         KERNEL2x1_M1
1316         KERNEL2x1_M2
1317         KERNEL2x1_M1
1318         KERNEL2x1_M2
1319
1320         KERNEL2x1_M1
1321         KERNEL2x1_M2
1322         KERNEL2x1_M1
1323         KERNEL2x1_M2
1324
1325         subs    L, L, #1
1326         bgt     _L1_M2_22
1327
1328         KERNEL2x1_M1
1329         KERNEL2x1_M2
1330         KERNEL2x1_M1
1331         KERNEL2x1_M2
1332
1333         KERNEL2x1_M1
1334         KERNEL2x1_M2
1335         KERNEL2x1_M1
1336         KERNEL2x1_E
1337
1338         b        _L1_M2_44
1339
1340
1341 _L1_M2_30:
1342         tst     L, #3
1343         ble     _L1_M2_40
1344
1345         tst     L, #2
1346         ble     _L1_M2_32
1347
1348         KERNEL2x1_I
1349         KERNEL2x1_M2
1350         KERNEL2x1_M1
1351         KERNEL2x1_M2
1352
1353         KERNEL2x1_M1
1354         KERNEL2x1_M2
1355         KERNEL2x1_M1
1356         KERNEL2x1_M2
1357
1358         KERNEL2x1_M1
1359         KERNEL2x1_M2
1360         KERNEL2x1_M1
1361         KERNEL2x1_M2
1362
1363
1364         KERNEL2x1_M1
1365         KERNEL2x1_M2
1366         KERNEL2x1_M1
1367         KERNEL2x1_E
1368
1369         b        _L1_M2_44
1370
1371 _L1_M2_32:
1372
1373         tst     L, #1
1374         ble     _L1_M2_40
1375
1376         KERNEL2x1_I
1377         KERNEL2x1_M2
1378         KERNEL2x1_M1
1379         KERNEL2x1_M2
1380
1381         KERNEL2x1_M1
1382         KERNEL2x1_M2
1383         KERNEL2x1_M1
1384         KERNEL2x1_E
1385
1386         b        _L1_M2_44
1387
1388
1389 _L1_M2_40:
1390
1391         INIT2x1
1392
1393
1394 _L1_M2_44:
1395
1396         ands    L , K1, #7                                      // L = L % 8
1397         ble     _L1_M2_100
1398
1399 _L1_M2_46:
1400
1401         KERNEL2x1_SUB
1402
1403         subs    L, L, #1
1404         bne     _L1_M2_46
1405
1406 _L1_M2_100:
1407
1408         SAVE2x1
1409
1410 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1411     (!defined(LEFT) && !defined(TRANSA))
1412         ldr     r3 , K
1413         ldr     r4 , KKK
1414         sub     r3 , r3 , r4
1415         lsls    r4 , r3 , #4                    // 1 * 8 * 2 double values
1416         add     BO , BO , r4
1417         lsls    r4 , r3 , #5                    // 2 * 8 * 2 double values
1418         add     AO , AO , r4
1419 #endif
1420
1421 #if defined(LEFT)
1422         ldr     r3 , KK
1423         add     r3 , r3 , #2                    // number of values in AO
1424         str     r3 , KK
1425 #endif
1426
1427
1428
1429 _L1_M2_END:
1430
1431         subs    I, I, #1
1432         bne     _L1_M2_20
1433
1434
1435 _L1_M1_BEGIN:
1436
1437         ldr     I, M
1438         tst     I, #1                                   // I = I % 2
1439         ble     _L1_END
1440
1441 _L1_M1_20:
1442
1443         INIT1x1
1444
1445 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1446     (!defined(LEFT) && !defined(TRANSA))
1447
1448         mov     BO, BC
1449 #else
1450         mov     BO, BC
1451         ldr     r3 , KK
1452         lsls    r4 , r3 , #4                                    // 1 * 8 * 2 double values
1453         add     BO , BO , r4
1454         lsls    r4 , r3 , #4                                    // 1 * 8 * 2 double values
1455         add     AO , AO , r4
1456
1457 #endif
1458
1459 #ifndef TRMMKERNEL
1460         ldr     K1, K
1461 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1462         ldr     K1, K
1463         ldr     r3, KK
1464         sub     K1, K1, r3
1465         str     K1, KKK
1466 #else
1467         ldr     K1, KK
1468 #ifdef LEFT
1469         add     K1, K1, #1        // number of values in AO
1470 #else
1471         add     K1, K1, #1        // number of values in BO
1472 #endif
1473         str     K1, KKK
1474 #endif
1475
1476         asrs    L , K1, #3                                      // L = L / 8
1477         ble     _L1_M1_40
1478
1479 _L1_M1_22:
1480
1481         KERNEL1x1_SUB
1482         KERNEL1x1_SUB
1483         KERNEL1x1_SUB
1484         KERNEL1x1_SUB
1485
1486         KERNEL1x1_SUB
1487         KERNEL1x1_SUB
1488         KERNEL1x1_SUB
1489         KERNEL1x1_SUB
1490
1491         subs    L, L, #1
1492         bgt     _L1_M1_22
1493
1494
1495 _L1_M1_40:
1496
1497         ands    L , K1, #7                                      // L = L % 8
1498         ble     _L1_M1_100
1499
1500 _L1_M1_42:
1501
1502         KERNEL1x1_SUB
1503
1504         subs    L, L, #1
1505         bgt     _L1_M1_42
1506
1507 _L1_M1_100:
1508
1509         SAVE1x1
1510
1511
1512 #if  (defined(LEFT) &&  defined(TRANSA)) || \
1513     (!defined(LEFT) && !defined(TRANSA))
1514         ldr     r3 , K
1515         ldr     r4 , KKK
1516         sub     r3 , r3 , r4
1517         lsls    r4 , r3 , #4                    // 1 * 8 * 2 double values
1518         add     BO , BO , r4
1519         lsls    r4 , r3 , #4                    // 1 * 8 * 2 double values
1520         add     AO , AO , r4
1521 #endif
1522
1523 #if defined(LEFT)
1524         ldr     r3 , KK
1525         add     r3 , r3 , #1                    // number of values in AO
1526         str     r3 , KK
1527 #endif
1528
1529
1530
1531 _L1_END:
1532
1533
1534
1535 _L999:
1536
1537         sub     r3, fp, #128
1538         vldm    r3, { d8 - d15}                                 // restore floating point registers
1539
1540         movs    r0, #0                                          // set return value
1541         sub     sp, fp, #24
1542         pop     {r4 - r9, fp}
1543         bx      lr
1544
1545         EPILOGUE
1546