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 ALPHA_I [fp, #-272]
63 #define ALPHA_R [fp, #-280]
67 #define OLD_LDC [fp, #12 ]
68 #define OFFSET [fp, #16 ]
87 #if defined(NN) || defined(NT) || defined(TN) || defined(TT)
92 #define FMAC_R1 fnmuld
93 #define FMAC_R2 fnmacd
95 #define FMAC_I2 fnmacd
97 #elif defined(CN) || defined(CT)
102 #define FMAC_R1 fmuld
103 #define FMAC_R2 fmacd
104 #define FMAC_I1 fnmuld
105 #define FMAC_I2 fmacd
107 #elif defined(NC) || defined(TC)
112 #define FMAC_R1 fmuld
113 #define FMAC_R2 fnmacd
114 #define FMAC_I1 fmuld
115 #define FMAC_I2 fmacd
122 #define FMAC_R1 fnmuld
123 #define FMAC_R2 fmacd
124 #define FMAC_I1 fnmuld
125 #define FMAC_I2 fnmacd
131 /**************************************************************************************
133 **************************************************************************************/
137 vsub.f64 d16 , d16 , d16
165 fldd d2 , [ AO, #16 ]
167 fldd d3 , [ AO, #24 ]
169 fldd d10, [ BO, #16 ]
172 fldd d11, [ BO, #24 ]
192 fldd d6 , [ AO, #16 ]
194 fldd d7 , [ AO, #24 ]
196 fldd d14, [ BO, #16 ]
198 fldd d15, [ BO, #24 ]
221 fldd d6 , [ AO, #16 ]
223 fldd d7 , [ AO, #24 ]
227 fldd d14, [ BO, #16 ]
230 fldd d15, [ BO, #24 ]
260 fldd d2 , [ AO, #16 ]
262 fldd d3 , [ AO, #24 ]
265 fldd d10, [ BO, #16 ]
268 fldd d11, [ BO, #24 ]
313 fldd d2 , [ AO, #16 ]
315 fldd d3 , [ AO, #24 ]
317 fldd d10, [ BO, #16 ]
320 fldd d11, [ BO, #24 ]
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
360 FMAC_R1 d4 , d0 , d16
361 FMAC_I1 d5 , d0 , d17
362 FMAC_R2 d4 , d1 , d17
363 FMAC_I2 d5 , d1 , d16
365 FMAC_R1 d6 , d0 , d18
366 FMAC_I1 d7 , d0 , d19
367 FMAC_R2 d6 , d1 , d19
368 FMAC_I2 d7 , d1 , d18
370 FMAC_R1 d8 , d0 , d20
371 FMAC_I1 d9 , d0 , d21
372 FMAC_R2 d8 , d1 , d21
373 FMAC_I2 d9 , d1 , d20
375 FMAC_R1 d10, d0 , d22
376 FMAC_I1 d11, d0 , d23
377 FMAC_R2 d10, d1 , d23
378 FMAC_I2 d11, d1 , d22
380 fstmiad CO1, { d4 - d7 }
381 fstmiad CO2, { d8 - d11 }
387 /******************************************************************************/
391 vsub.f64 d16 , d16 , d16
409 fldd d10, [ BO, #16 ]
410 fldd d11, [ BO, #24 ]
432 fldd d14, [ BO, #16 ]
433 fldd d15, [ BO, #24 ]
459 fldd d14, [ BO, #16 ]
460 fldd d15, [ BO, #24 ]
485 fldd d10, [ BO, #16 ]
486 fldd d11, [ BO, #24 ]
515 fldd d10, [ BO, #16 ]
516 fldd d11, [ BO, #24 ]
543 FADD_R d16, d24 , d16
544 FADD_I d17, d25 , d17
545 FADD_R d20, d28 , d20
546 FADD_I d21, d29 , d21
548 FMAC_R1 d4 , d0 , d16
549 FMAC_I1 d5 , d0 , d17
550 FMAC_R2 d4 , d1 , d17
551 FMAC_I2 d5 , d1 , d16
553 FMAC_R1 d8 , d0 , d20
554 FMAC_I1 d9 , d0 , d21
555 FMAC_R2 d8 , d1 , d21
556 FMAC_I2 d9 , d1 , d20
558 fstmiad CO1, { d4 - d5 }
559 fstmiad CO2, { d8 - d9 }
565 /******************************************************************************/
569 vsub.f64 d16 , d16 , d16
585 fldd d2 , [ AO, #16 ]
586 fldd d3 , [ AO, #24 ]
608 fldd d6 , [ AO, #16 ]
609 fldd d7 , [ AO, #24 ]
636 fldd d6 , [ AO, #16 ]
637 fldd d7 , [ AO, #24 ]
662 fldd d2 , [ AO, #16 ]
663 fldd d3 , [ AO, #24 ]
693 fldd d2 , [ AO, #16 ]
694 fldd d3 , [ AO, #24 ]
721 FADD_R d16, d24 , d16
722 FADD_I d17, d25 , d17
723 FADD_R d18, d26 , d18
724 FADD_I d19, d27 , d19
726 FMAC_R1 d4 , d0 , d16
727 FMAC_I1 d5 , d0 , d17
728 FMAC_R2 d4 , d1 , d17
729 FMAC_I2 d5 , d1 , d16
731 FMAC_R1 d6 , d0 , d18
732 FMAC_I1 d7 , d0 , d19
733 FMAC_R2 d6 , d1 , d19
734 FMAC_I2 d7 , d1 , d18
736 fstmiad CO1, { d4 - d7 }
742 /******************************************************************************/
746 vsub.f64 d16 , d16 , d16
853 FADD_R d16, d24 , d16
854 FADD_I d17, d25 , d17
856 FMAC_R1 d4 , d0 , d16
857 FMAC_I1 d5 , d0 , d17
858 FMAC_R2 d4 , d1 , d17
859 FMAC_I2 d5 , d1 , d16
861 fstmiad CO1, { d4 - d5 }
867 /******************************************************************************/
870 /**************************************************************************************
871 * End of macro definitions
872 **************************************************************************************/
880 sub sp, sp, #STACKSIZE // reserve stack
886 vstr OLD_ALPHA_R, ALPHA_R
887 vstr OLD_ALPHA_I, ALPHA_I
890 vstm r3, { d8 - d15} // store floating point registers
893 lsl r3, r3, #4 // ldc = ldc * 8 * 2
905 asrs J, J, #1 // J = J / 2
910 ldr CO1, C // CO1 = C
912 lsl r4 , r4 , #1 // LDC * 2
914 str r3 , C // store C
931 asrs I, I, #1 // I = I / 2
936 #if (defined(LEFT) && defined(TRANSA)) || \
937 (!defined(LEFT) && !defined(TRANSA))
943 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
945 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
952 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
960 add K1, K1, #2 // number of values in AO
962 add K1, K1, #2 // number of values in BO
968 asrs L , K1, #3 // L = L / 8
1070 ands L , K1, #7 // L = L % 8
1084 #if (defined(LEFT) && defined(TRANSA)) || \
1085 (!defined(LEFT) && !defined(TRANSA))
1089 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1091 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1097 add r3 , r3 , #2 // number of values in AO
1113 tst I, #1 // I = I % 2
1120 #if (defined(LEFT) && defined(TRANSA)) || \
1121 (!defined(LEFT) && !defined(TRANSA))
1127 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1129 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1136 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1144 add K1, K1, #1 // number of values in AO
1146 add K1, K1, #2 // number of values in BO
1151 asrs L , K1, #3 // L = L / 8
1172 ands L , K1, #7 // L = L % 8
1186 #if (defined(LEFT) && defined(TRANSA)) || \
1187 (!defined(LEFT) && !defined(TRANSA))
1191 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1193 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1199 add r3 , r3 , #1 // number of values in AO
1209 lsl r4, r4, #5 // k * 2 * 8 * 2
1210 add r3, r3, r4 // B = B + K * 4 * 8
1215 add r3 , r3 , #2 // number of values in BO
1225 /*********************************************************************************************/
1234 ldr CO1, C // CO1 = C
1237 str r3 , C // store C
1250 asrs I, I, #1 // I = I / 2
1255 #if (defined(LEFT) && defined(TRANSA)) || \
1256 (!defined(LEFT) && !defined(TRANSA))
1262 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1264 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1271 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1279 add K1, K1, #2 // number of values in AO
1281 add K1, K1, #1 // number of values in BO
1286 asrs L , K1, #3 // L = L / 8
1388 ands L , K1, #7 // L = L % 8
1402 #if (defined(LEFT) && defined(TRANSA)) || \
1403 (!defined(LEFT) && !defined(TRANSA))
1407 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1409 lsls r4 , r3 , #5 // 2 * 8 * 2 double values
1415 add r3 , r3 , #2 // number of values in AO
1430 tst I, #1 // I = I % 2
1437 #if (defined(LEFT) && defined(TRANSA)) || \
1438 (!defined(LEFT) && !defined(TRANSA))
1444 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1446 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1453 #elif (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
1461 add K1, K1, #1 // number of values in AO
1463 add K1, K1, #1 // number of values in BO
1468 asrs L , K1, #3 // L = L / 8
1489 ands L , K1, #7 // L = L % 8
1504 #if (defined(LEFT) && defined(TRANSA)) || \
1505 (!defined(LEFT) && !defined(TRANSA))
1509 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1511 lsls r4 , r3 , #4 // 1 * 8 * 2 double values
1517 add r3 , r3 , #1 // number of values in AO
1530 vldm r3, { d8 - d15} // restore floating point registers
1532 movs r0, #0 // set return value