1 /***************************************************************************
2 Copyright (c) 2013, The OpenBLAS Project
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
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
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 *****************************************************************************/
28 /**************************************************************************************
34 **************************************************************************************/
45 #define OLD_ALPHA_R d0
46 #define OLD_ALPHA_I d1
48 /******************************************************
49 * [fp, #-128] - [fp, #-64] is reserved
50 * for store and restore of floating point
52 *******************************************************/
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 ]
62 #define FP_ZERO [fp, #-236]
63 #define FP_ZERO_0 [fp, #-236]
64 #define FP_ZERO_1 [fp, #-232]
66 #define ALPHA_I [fp, #-272]
67 #define ALPHA_R [fp, #-280]
71 #define OLD_LDC [fp, #12 ]
72 #define OFFSET [fp, #16 ]
91 #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
96 #define FMAC_R1 fnmuld
97 #define FMAC_R2 fnmacd
99 #define FMAC_I2 fnmacd
101 #elif defined(CN) || defined(CT)
106 #define FMAC_R1 fmuld
107 #define FMAC_R2 fmacd
108 #define FMAC_I1 fnmuld
109 #define FMAC_I2 fmacd
111 #elif defined(NC) || defined(TC)
116 #define FMAC_R1 fmuld
117 #define FMAC_R2 fnmacd
118 #define FMAC_I1 fmuld
119 #define FMAC_I2 fmacd
126 #define FMAC_R1 fnmuld
127 #define FMAC_R2 fmacd
128 #define FMAC_I1 fnmuld
129 #define FMAC_I2 fnmacd
135 /**************************************************************************************
137 **************************************************************************************/
169 fldd d2 , [ AO, #16 ]
171 fldd d3 , [ AO, #24 ]
173 fldd d10, [ BO, #16 ]
176 fldd d11, [ BO, #24 ]
196 fldd d6 , [ AO, #16 ]
198 fldd d7 , [ AO, #24 ]
200 fldd d14, [ BO, #16 ]
202 fldd d15, [ BO, #24 ]
225 fldd d6 , [ AO, #16 ]
227 fldd d7 , [ AO, #24 ]
231 fldd d14, [ BO, #16 ]
234 fldd d15, [ BO, #24 ]
264 fldd d2 , [ AO, #16 ]
266 fldd d3 , [ AO, #24 ]
269 fldd d10, [ BO, #16 ]
272 fldd d11, [ BO, #24 ]
317 fldd d2 , [ AO, #16 ]
319 fldd d3 , [ AO, #24 ]
321 fldd d10, [ BO, #16 ]
324 fldd d11, [ BO, #24 ]
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
364 FMAC_R1 d4 , d0 , d16
365 FMAC_I1 d5 , d0 , d17
366 FMAC_R2 d4 , d1 , d17
367 FMAC_I2 d5 , d1 , d16
369 FMAC_R1 d6 , d0 , d18
370 FMAC_I1 d7 , d0 , d19
371 FMAC_R2 d6 , d1 , d19
372 FMAC_I2 d7 , d1 , d18
374 FMAC_R1 d8 , d0 , d20
375 FMAC_I1 d9 , d0 , d21
376 FMAC_R2 d8 , d1 , d21
377 FMAC_I2 d9 , d1 , d20
379 FMAC_R1 d10, d0 , d22
380 FMAC_I1 d11, d0 , d23
381 FMAC_R2 d10, d1 , d23
382 FMAC_I2 d11, d1 , d22
384 fstmiad CO1, { d4 - d7 }
385 fstmiad CO2, { d8 - d11 }
391 /******************************************************************************/
413 fldd d10, [ BO, #16 ]
414 fldd d11, [ BO, #24 ]
436 fldd d14, [ BO, #16 ]
437 fldd d15, [ BO, #24 ]
463 fldd d14, [ BO, #16 ]
464 fldd d15, [ BO, #24 ]
489 fldd d10, [ BO, #16 ]
490 fldd d11, [ BO, #24 ]
519 fldd d10, [ BO, #16 ]
520 fldd d11, [ BO, #24 ]
547 FADD_R d16, d24 , d16
548 FADD_I d17, d25 , d17
549 FADD_R d20, d28 , d20
550 FADD_I d21, d29 , d21
552 FMAC_R1 d4 , d0 , d16
553 FMAC_I1 d5 , d0 , d17
554 FMAC_R2 d4 , d1 , d17
555 FMAC_I2 d5 , d1 , d16
557 FMAC_R1 d8 , d0 , d20
558 FMAC_I1 d9 , d0 , d21
559 FMAC_R2 d8 , d1 , d21
560 FMAC_I2 d9 , d1 , d20
562 fstmiad CO1, { d4 - d5 }
563 fstmiad CO2, { d8 - d9 }
569 /******************************************************************************/
589 fldd d2 , [ AO, #16 ]
590 fldd d3 , [ AO, #24 ]
612 fldd d6 , [ AO, #16 ]
613 fldd d7 , [ AO, #24 ]
640 fldd d6 , [ AO, #16 ]
641 fldd d7 , [ AO, #24 ]
666 fldd d2 , [ AO, #16 ]
667 fldd d3 , [ AO, #24 ]
697 fldd d2 , [ AO, #16 ]
698 fldd d3 , [ AO, #24 ]
725 FADD_R d16, d24 , d16
726 FADD_I d17, d25 , d17
727 FADD_R d18, d26 , d18
728 FADD_I d19, d27 , d19
730 FMAC_R1 d4 , d0 , d16
731 FMAC_I1 d5 , d0 , d17
732 FMAC_R2 d4 , d1 , d17
733 FMAC_I2 d5 , d1 , d16
735 FMAC_R1 d6 , d0 , d18
736 FMAC_I1 d7 , d0 , d19
737 FMAC_R2 d6 , d1 , d19
738 FMAC_I2 d7 , d1 , d18
740 fstmiad CO1, { d4 - d7 }
746 /******************************************************************************/
857 FADD_R d16, d24 , d16
858 FADD_I d17, d25 , d17
860 FMAC_R1 d4 , d0 , d16
861 FMAC_I1 d5 , d0 , d17
862 FMAC_R2 d4 , d1 , d17
863 FMAC_I2 d5 , d1 , d16
865 fstmiad CO1, { d4 - d5 }
871 /******************************************************************************/
874 /**************************************************************************************
875 * End of macro definitions
876 **************************************************************************************/
884 sub sp, sp, #STACKSIZE // reserve stack
890 vstr OLD_ALPHA_R, ALPHA_R
891 vstr OLD_ALPHA_I, ALPHA_I
894 vstm r3, { d8 - d15} // store floating point registers
901 lsl r3, r3, #4 // ldc = ldc * 8 * 2
913 asrs J, J, #1 // J = J / 2
918 ldr CO1, C // CO1 = C
920 lsl r4 , r4 , #1 // LDC * 2
922 str r3 , C // store C
939 asrs I, I, #1 // I = I / 2
944 #if (defined(LEFT) && defined(TRANSA)) || \
945 (!defined(LEFT) && !defined(TRANSA))
951 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
953 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
960 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
968 add K1, K1, #2 // number of values in AO
970 add K1, K1, #2 // number of values in BO
976 asrs L , K1, #3 // L = L / 8
1078 ands L , K1, #7 // L = L % 8
1092 #if (defined(LEFT) && defined(TRANSA)) || \
1093 (!defined(LEFT) && !defined(TRANSA))
1097 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1099 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1105 add r3 , r3 , #2 // number of values in AO
1121 tst I, #1 // I = I % 2
1128 #if (defined(LEFT) && defined(TRANSA)) || \
1129 (!defined(LEFT) && !defined(TRANSA))
1135 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1137 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1144 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1152 add K1, K1, #1 // number of values in AO
1154 add K1, K1, #2 // number of values in BO
1159 asrs L , K1, #3 // L = L / 8
1180 ands L , K1, #7 // L = L % 8
1194 #if (defined(LEFT) && defined(TRANSA)) || \
1195 (!defined(LEFT) && !defined(TRANSA))
1199 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1201 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1207 add r3 , r3 , #1 // number of values in AO
1217 lsl r4, r4, #5 // k * 2 * 8 * 2
1218 add r3, r3, r4 // B = B + K * 4 * 8
1223 add r3 , r3 , #2 // number of values in BO
1233 /*********************************************************************************************/
1242 ldr CO1, C // CO1 = C
1245 str r3 , C // store C
1258 asrs I, I, #1 // I = I / 2
1263 #if (defined(LEFT) && defined(TRANSA)) || \
1264 (!defined(LEFT) && !defined(TRANSA))
1270 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1272 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1279 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1287 add K1, K1, #2 // number of values in AO
1289 add K1, K1, #1 // number of values in BO
1294 asrs L , K1, #3 // L = L / 8
1396 ands L , K1, #7 // L = L % 8
1410 #if (defined(LEFT) && defined(TRANSA)) || \
1411 (!defined(LEFT) && !defined(TRANSA))
1415 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1417 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1423 add r3 , r3 , #2 // number of values in AO
1438 tst I, #1 // I = I % 2
1445 #if (defined(LEFT) && defined(TRANSA)) || \
1446 (!defined(LEFT) && !defined(TRANSA))
1452 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1454 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1461 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1469 add K1, K1, #1 // number of values in AO
1471 add K1, K1, #1 // number of values in BO
1476 asrs L , K1, #3 // L = L / 8
1497 ands L , K1, #7 // L = L % 8
1512 #if (defined(LEFT) && defined(TRANSA)) || \
1513 (!defined(LEFT) && !defined(TRANSA))
1517 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1519 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1525 add r3 , r3 , #1 // number of values in AO
1538 vldm r3, { d8 - d15} // restore floating point registers
1540 movs r0, #0 // set return value