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