added dgemm-, dtrmm-, zgemm- and ztrmm-kernel for power8
[platform/upstream/openblas.git] / kernel / power / zgemm_kernel_8x2_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_R_SP 296(SP)
52 #define ALPHA_I_SP 304(SP)
53 #define FZERO   312(SP)
54 #else
55 #define STACKSIZE 256
56 #define ALPHA_R_SP 224(SP)
57 #define ALPHA_I_SP 232(SP)
58 #define FZERO   240(SP)
59 #endif
60
61 #define M       r3
62 #define N       r4
63 #define K       r5
64
65 #ifdef linux
66 #ifndef __64BIT__
67 #define A       r6
68 #define B       r7
69 #define C       r8
70 #define LDC     r9
71 #define OFFSET  r10
72 #else
73 #define A       r8
74 #define B       r9
75 #define C       r10
76 #define LDC     r6
77 #define OFFSET  r7
78 #endif
79 #endif
80
81 #if defined(_AIX) || defined(__APPLE__)
82 #if !defined(__64BIT__) && defined(DOUBLE)
83 #define A       r10
84 #define B       r6
85 #define C       r7
86 #define LDC     r8
87 #define OFFSET  r9
88 #else
89 #define A       r8
90 #define B       r9
91 #define C       r10
92 #define LDC     r6
93 #define OFFSET  r7
94 #endif
95 #endif
96
97 #define o0      0
98 #define alpha_r vs30
99 #define alpha_i vs31
100
101 #define L       r15
102 #define ALPHA   r16
103 #define o24     r17
104 #define T2      r19
105 #define KK      r20
106 #define o8      r21
107 #define I       r22
108 #define J       r23
109 #define AO      r24
110 #define BO      r25
111 #define CO      r26
112 #define o16     r27
113 #define o32     r28
114 #define o48     r29
115
116 #define PRE     r30
117 #define T1      r31
118
119 #ifndef NEEDPARAM
120
121         PROLOGUE
122         PROFCODE
123
124         addi    SP, SP, -STACKSIZE
125         li      r0, 0
126
127         stfd    f14,    0(SP)
128         stfd    f15,    8(SP)
129         stfd    f16,   16(SP)
130         stfd    f17,   24(SP)
131
132         stfd    f18,   32(SP)
133         stfd    f19,   40(SP)
134         stfd    f20,   48(SP)
135         stfd    f21,   56(SP)
136
137         stfd    f22,   64(SP)
138         stfd    f23,   72(SP)
139         stfd    f24,   80(SP)
140         stfd    f25,   88(SP)
141
142         stfd    f26,   96(SP)
143         stfd    f27,  104(SP)
144         stfd    f28,  112(SP)
145         stfd    f29,  120(SP)
146
147         stfd    f30,  128(SP)
148         stfd    f31,  136(SP)
149
150 #ifdef __64BIT__
151         std     r31,  144(SP)
152         std     r30,  152(SP)
153         std     r29,  160(SP)
154         std     r28,  168(SP)
155         std     r27,  176(SP)
156         std     r26,  184(SP)
157         std     r25,  192(SP)
158         std     r24,  200(SP)
159         std     r23,  208(SP)
160         std     r22,  216(SP)
161         std     r21,  224(SP)
162         std     r20,  232(SP)
163         std     r19,  240(SP)
164         std     r18,  248(SP)
165         std     r17,  256(SP)
166         std     r16,  264(SP)
167         std     r15,  272(SP)
168 #else
169         stw     r31,  144(SP)
170         stw     r30,  148(SP)
171         stw     r29,  152(SP)
172         stw     r28,  156(SP)
173         stw     r27,  160(SP)
174         stw     r26,  164(SP)
175         stw     r25,  168(SP)
176         stw     r24,  172(SP)
177         stw     r23,  176(SP)
178         stw     r22,  180(SP)
179         stw     r21,  184(SP)
180         stw     r20,  188(SP)
181         stw     r19,  192(SP)
182         stw     r18,  196(SP)
183         stw     r17,  200(SP)
184         stw     r16,  204(SP)
185         stw     r15,  208(SP)
186 #endif
187
188         stfd    f1,  ALPHA_R_SP
189         stfd    f2,  ALPHA_I_SP
190         stw     r0,  FZERO
191
192 #ifdef linux
193 #ifdef __64BIT__
194         ld      LDC, FRAMESLOT(0) + STACKSIZE(SP)
195 #endif
196 #endif
197
198 #if defined(_AIX) || defined(__APPLE__)
199 #ifdef __64BIT__
200         ld      LDC, FRAMESLOT(0) + STACKSIZE(SP)
201 #else
202 #ifdef DOUBLE
203         lwz     B,   FRAMESLOT(0) + STACKSIZE(SP)
204         lwz     C,   FRAMESLOT(1) + STACKSIZE(SP)
205         lwz     LDC, FRAMESLOT(2) + STACKSIZE(SP)
206 #else
207         lwz     LDC, FRAMESLOT(0) + STACKSIZE(SP)
208 #endif
209 #endif
210 #endif
211
212 #ifdef TRMMKERNEL
213 #if defined(linux) && defined(__64BIT__)
214         ld      OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
215 #endif
216
217 #if defined(_AIX) || defined(__APPLE__)
218 #ifdef __64BIT__
219         ld      OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
220 #else
221 #ifdef DOUBLE
222         lwz     OFFSET,  FRAMESLOT(3) + STACKSIZE(SP)
223 #else
224         lwz     OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
225 #endif
226 #endif
227 #endif
228 #if defined(TRMMKERNEL) && !defined(LEFT)
229         neg     KK, OFFSET
230 #endif
231 #endif
232
233 #include "zgemm_macros_8x2_power8.S"
234
235         cmpwi   cr0, M, 0
236         ble     L999
237         cmpwi   cr0, N, 0
238         ble     L999
239         cmpwi   cr0, K, 0
240         ble     L999
241
242         slwi    LDC, LDC, ZBASE_SHIFT
243         li      PRE, 256 
244         li      o8  , 8
245         li      o16 , 16
246         li      o24 , 24
247         li      o32 , 32
248         li      o48 , 48
249
250 #ifdef __64BIT__
251         addi    ALPHA, SP, 296
252 #else
253         addi    ALPHA, SP, 224
254 #endif
255
256         lxvdsx  alpha_r, 0, ALPHA
257         lxvdsx  alpha_i, o8, ALPHA
258
259         .align 5
260
261 #include "zgemm_logic_8x2_power8.S"
262
263 L999:
264         addi    r3, 0, 0
265
266         lfd     f14,    0(SP)
267         lfd     f15,    8(SP)
268         lfd     f16,   16(SP)
269         lfd     f17,   24(SP)
270
271         lfd     f18,   32(SP)
272         lfd     f19,   40(SP)
273         lfd     f20,   48(SP)
274         lfd     f21,   56(SP)
275
276         lfd     f22,   64(SP)
277         lfd     f23,   72(SP)
278         lfd     f24,   80(SP)
279         lfd     f25,   88(SP)
280
281         lfd     f26,   96(SP)
282         lfd     f27,  104(SP)
283         lfd     f28,  112(SP)
284         lfd     f29,  120(SP)
285
286         lfd     f30,  128(SP)
287         lfd     f31,  136(SP)
288
289 #ifdef __64BIT__
290         ld      r31,  144(SP)
291         ld      r30,  152(SP)
292         ld      r29,  160(SP)
293         ld      r28,  168(SP)
294         ld      r27,  176(SP)
295         ld      r26,  184(SP)
296         ld      r25,  192(SP)
297         ld      r24,  200(SP)
298         ld      r23,  208(SP)
299         ld      r22,  216(SP)
300         ld      r21,  224(SP)
301         ld      r20,  232(SP)
302         ld      r19,  240(SP)
303         ld      r18,  248(SP)
304         ld      r17,  256(SP)
305         ld      r16,  264(SP)
306         ld      r15,  272(SP)
307 #else
308         lwz     r31,  144(SP)
309         lwz     r30,  148(SP)
310         lwz     r29,  152(SP)
311         lwz     r28,  156(SP)
312         lwz     r27,  160(SP)
313         lwz     r26,  164(SP)
314         lwz     r25,  168(SP)
315         lwz     r24,  172(SP)
316         lwz     r23,  176(SP)
317         lwz     r22,  180(SP)
318         lwz     r21,  184(SP)
319         lwz     r20,  188(SP)
320         lwz     r19,  192(SP)
321         lwz     r18,  196(SP)
322         lwz     r17,  200(SP)
323         lwz     r16,  204(SP)
324         lwz     r15,  208(SP)
325 #endif
326
327         addi    SP, SP, STACKSIZE
328
329         blr
330
331         EPILOGUE
332 #endif