added dgemm-, dtrmm-, zgemm- and ztrmm-kernel for power8
[platform/upstream/openblas.git] / kernel / power / dgemm_kernel_16x4_power8.S
1 /*********************************************************************/
2 /* Copyright 2009, 2010 The University of Texas at Austin.           */
3 /* All rights reserved.                                              */
4 /*                                                                   */
5 /* Redistribution and use in source and binary forms, with or        */
6 /* without modification, are permitted provided that the following   */
7 /* conditions are met:                                               */
8 /*                                                                   */
9 /*   1. Redistributions of source code must retain the above         */
10 /*      copyright notice, this list of conditions and the following  */
11 /*      disclaimer.                                                  */
12 /*                                                                   */
13 /*   2. Redistributions in binary form must reproduce the above      */
14 /*      copyright notice, this list of conditions and the following  */
15 /*      disclaimer in the documentation and/or other materials       */
16 /*      provided with the distribution.                              */
17 /*                                                                   */
18 /*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19 /*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20 /*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21 /*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22 /*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23 /*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24 /*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25 /*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26 /*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27 /*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28 /*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29 /*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30 /*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31 /*    POSSIBILITY OF SUCH DAMAGE.                                    */
32 /*                                                                   */
33 /* The views and conclusions contained in the software and           */
34 /* documentation are those of the authors and should not be          */
35 /* interpreted as representing official policies, either expressed   */
36 /* or implied, of The University of Texas at Austin.                 */
37 /*********************************************************************/
38
39 #define ASSEMBLER
40 #include "common.h"
41 #include "def_vsx.h"
42
43 #ifndef __64BIT__
44 #define LOAD    lwz
45 #else
46 #define LOAD    ld
47 #endif
48
49 #ifdef __64BIT__
50 #define STACKSIZE 320
51 #define ALPHA_SP   296(SP)
52 #define FZERO   304(SP)
53 #else
54 #define STACKSIZE 240
55 #define ALPHA_SP   224(SP)
56 #define FZERO   232(SP)
57 #endif
58
59 #define M       r3
60 #define N       r4
61 #define K       r5
62
63 #ifdef linux
64 #ifndef __64BIT__
65 #define A       r6
66 #define B       r7
67 #define C       r8
68 #define LDC     r9
69 #define OFFSET  r10
70 #else
71 #define A       r7
72 #define B       r8
73 #define C       r9
74 #define LDC     r10
75 #define OFFSET  r6
76 #endif
77 #endif
78
79 #if defined(_AIX) || defined(__APPLE__)
80 #if !defined(__64BIT__) && defined(DOUBLE)
81 #define A       r8
82 #define B       r9
83 #define C       r10
84 #define LDC     r7
85 #define OFFSET  r6
86 #else
87 #define A       r7
88 #define B       r8
89 #define C       r9
90 #define LDC     r10
91 #define OFFSET  r6
92 #endif
93 #endif
94
95 #define alpha_r vs18
96
97 #define o0      0
98
99 #define o8      r15
100 #define o24     r16
101 #define ALPHA   r17
102 #define L       r18
103 #define T1      r19
104 #define KK      r20
105 #define BB      r21
106 #define I       r22
107 #define J       r23
108 #define AO      r24
109 #define BO      r25
110 #define CO      r26
111 #define o16     r27
112 #define o32     r28
113 #define o48     r29
114
115 #define PRE     r30
116 #define T2      r31
117
118 #include "dgemm_macros_16x4_power8.S"
119
120
121 #ifndef NEEDPARAM
122
123         PROLOGUE
124         PROFCODE
125
126         addi    SP, SP, -STACKSIZE
127         li      r0, 0
128
129         stfd    f14,    0(SP)
130         stfd    f15,    8(SP)
131         stfd    f16,   16(SP)
132         stfd    f17,   24(SP)
133
134         stfd    f18,   32(SP)
135         stfd    f19,   40(SP)
136         stfd    f20,   48(SP)
137         stfd    f21,   56(SP)
138
139         stfd    f22,   64(SP)
140         stfd    f23,   72(SP)
141         stfd    f24,   80(SP)
142         stfd    f25,   88(SP)
143
144         stfd    f26,   96(SP)
145         stfd    f27,  104(SP)
146         stfd    f28,  112(SP)
147         stfd    f29,  120(SP)
148
149         stfd    f30,  128(SP)
150         stfd    f31,  136(SP)
151
152 #ifdef __64BIT__
153         std     r31,  144(SP)
154         std     r30,  152(SP)
155         std     r29,  160(SP)
156         std     r28,  168(SP)
157         std     r27,  176(SP)
158         std     r26,  184(SP)
159         std     r25,  192(SP)
160         std     r24,  200(SP)
161         std     r23,  208(SP)
162         std     r22,  216(SP)
163         std     r21,  224(SP)
164         std     r20,  232(SP)
165         std     r19,  240(SP)
166         std     r18,  248(SP)
167         std     r17,  256(SP)
168         std     r16,  264(SP)
169         std     r15,  272(SP)
170 #else
171         stw     r31,  144(SP)
172         stw     r30,  148(SP)
173         stw     r29,  152(SP)
174         stw     r28,  156(SP)
175         stw     r27,  160(SP)
176         stw     r26,  164(SP)
177         stw     r25,  168(SP)
178         stw     r24,  172(SP)
179         stw     r23,  176(SP)
180         stw     r22,  180(SP)
181         stw     r21,  184(SP)
182         stw     r20,  188(SP)
183         stw     r19,  192(SP)
184         stw     r18,  196(SP)
185         stw     r17,  200(SP)
186         stw     r16,  204(SP)
187         stw     r15,  208(SP)
188 #endif
189
190         stfd    f1,  ALPHA_SP
191         stw     r0,  FZERO
192
193 #if defined(_AIX) || defined(__APPLE__)
194 #if !defined(__64BIT__) && defined(DOUBLE)
195         lwz     LDC, FRAMESLOT(0) + STACKSIZE(SP)
196 #endif
197 #endif
198
199         slwi    LDC, LDC, BASE_SHIFT
200
201 #if defined(TRMMKERNEL)
202 #if defined(linux) && defined(__64BIT__)
203         ld      OFFSET,  FRAMESLOT(0) + STACKSIZE(SP)
204 #endif
205
206 #if defined(_AIX) || defined(__APPLE__)
207 #ifdef __64BIT__
208         ld      OFFSET,  FRAMESLOT(0) + STACKSIZE(SP)
209 #else
210 #ifdef DOUBLE
211         lwz     OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
212 #else
213         lwz     OFFSET,  FRAMESLOT(0) + STACKSIZE(SP)
214 #endif
215 #endif
216 #endif
217 #endif
218
219
220         cmpwi   cr0, M, 0
221         ble     L999_H1
222         cmpwi   cr0, N, 0
223         ble     L999_H1
224         cmpwi   cr0, K, 0
225         ble     L999_H1
226
227 #ifdef __64BIT__
228         addi    ALPHA, SP, 296
229 #else
230         addi    ALPHA, SP, 224
231 #endif
232
233         li      PRE, 256 
234         li      o8 , 8
235         li      o16, 16
236         li      o24, 24
237         li      o32, 32
238         li      o48, 48
239
240         lxvdsx  alpha_r, 0, ALPHA
241
242 #include "dgemm_logic_16x4_power8.S"
243
244 L999:
245         addi    r3, 0, 0
246
247         lfd     f14,    0(SP)
248         lfd     f15,    8(SP)
249         lfd     f16,   16(SP)
250         lfd     f17,   24(SP)
251
252         lfd     f18,   32(SP)
253         lfd     f19,   40(SP)
254         lfd     f20,   48(SP)
255         lfd     f21,   56(SP)
256
257         lfd     f22,   64(SP)
258         lfd     f23,   72(SP)
259         lfd     f24,   80(SP)
260         lfd     f25,   88(SP)
261
262         lfd     f26,   96(SP)
263         lfd     f27,  104(SP)
264         lfd     f28,  112(SP)
265         lfd     f29,  120(SP)
266
267         lfd     f30,  128(SP)
268         lfd     f31,  136(SP)
269
270 #ifdef __64BIT__
271         ld      r31,  144(SP)
272         ld      r30,  152(SP)
273         ld      r29,  160(SP)
274         ld      r28,  168(SP)
275         ld      r27,  176(SP)
276         ld      r26,  184(SP)
277         ld      r25,  192(SP)
278         ld      r24,  200(SP)
279         ld      r23,  208(SP)
280         ld      r22,  216(SP)
281         ld      r21,  224(SP)
282         ld      r20,  232(SP)
283         ld      r19,  240(SP)
284         ld      r18,  248(SP)
285         ld      r17,  256(SP)
286         ld      r16,  264(SP)
287         ld      r15,  272(SP)
288 #else
289         lwz     r31,  144(SP)
290         lwz     r30,  148(SP)
291         lwz     r29,  152(SP)
292         lwz     r28,  156(SP)
293         lwz     r27,  160(SP)
294         lwz     r26,  164(SP)
295         lwz     r25,  168(SP)
296         lwz     r24,  172(SP)
297         lwz     r23,  176(SP)
298         lwz     r22,  180(SP)
299         lwz     r21,  184(SP)
300         lwz     r20,  188(SP)
301         lwz     r19,  192(SP)
302         lwz     r18,  196(SP)
303         lwz     r17,  200(SP)
304         lwz     r16,  204(SP)
305         lwz     r15,  208(SP)
306 #endif
307
308         addi    SP, SP, STACKSIZE
309
310         blr
311
312         EPILOGUE
313 #endif