added dgemm-, dtrmm-, zgemm- and ztrmm-kernel for power8
[platform/upstream/openblas.git] / kernel / power / ztrmm_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 KKK     r13
102 #define K1      r14
103 #define L       r15
104 #define ALPHA   r16
105 #define o24     r17
106 #define T2      r19
107 #define KK      r20
108 #define o8      r21
109 #define I       r22
110 #define J       r23
111 #define AO      r24
112 #define BO      r25
113 #define CO      r26
114 #define o16     r27
115 #define o32     r28
116 #define o48     r29
117
118 #define PRE     r30
119 #define T1      r31
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         std     r14,  280(SP)
171         std     r13,  288(SP)
172 #else
173         stw     r31,  144(SP)
174         stw     r30,  148(SP)
175         stw     r29,  152(SP)
176         stw     r28,  156(SP)
177         stw     r27,  160(SP)
178         stw     r26,  164(SP)
179         stw     r25,  168(SP)
180         stw     r24,  172(SP)
181         stw     r23,  176(SP)
182         stw     r22,  180(SP)
183         stw     r21,  184(SP)
184         stw     r20,  188(SP)
185         stw     r19,  192(SP)
186         stw     r18,  196(SP)
187         stw     r17,  200(SP)
188         stw     r16,  204(SP)
189         stw     r15,  208(SP)
190         stw     r14,  212(SP)
191         stw     r13,  216(SP)
192 #endif
193
194         stfd    f1,  ALPHA_R_SP
195         stfd    f2,  ALPHA_I_SP
196         stw     r0,  FZERO
197
198 #ifdef linux
199 #ifdef __64BIT__
200         ld      LDC, FRAMESLOT(0) + STACKSIZE(SP)
201 #endif
202 #endif
203
204 #if defined(_AIX) || defined(__APPLE__)
205 #ifdef __64BIT__
206         ld      LDC, FRAMESLOT(0) + STACKSIZE(SP)
207 #else
208 #ifdef DOUBLE
209         lwz     B,   FRAMESLOT(0) + STACKSIZE(SP)
210         lwz     C,   FRAMESLOT(1) + STACKSIZE(SP)
211         lwz     LDC, FRAMESLOT(2) + STACKSIZE(SP)
212 #else
213         lwz     LDC, FRAMESLOT(0) + STACKSIZE(SP)
214 #endif
215 #endif
216 #endif
217
218 #ifdef TRMMKERNEL
219 #if defined(linux) && defined(__64BIT__)
220         ld      OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
221 #endif
222
223 #if defined(_AIX) || defined(__APPLE__)
224 #ifdef __64BIT__
225         ld      OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
226 #else
227 #ifdef DOUBLE
228         lwz     OFFSET,  FRAMESLOT(3) + STACKSIZE(SP)
229 #else
230         lwz     OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
231 #endif
232 #endif
233 #endif
234 #if defined(TRMMKERNEL) && !defined(LEFT)
235         neg     KK, OFFSET
236 #endif
237 #endif
238
239 #include "zgemm_macros_8x2_power8.S"
240
241         cmpwi   cr0, M, 0
242         ble     L999
243         cmpwi   cr0, N, 0
244         ble     L999
245         cmpwi   cr0, K, 0
246         ble     L999
247
248         slwi    LDC, LDC, ZBASE_SHIFT
249         li      PRE, 256 
250         li      o8  , 8
251         li      o16 , 16
252         li      o24 , 24
253         li      o32 , 32
254         li      o48 , 48
255
256 #ifdef __64BIT__
257         addi    ALPHA, SP, 296
258 #else
259         addi    ALPHA, SP, 224
260 #endif
261
262         lxsdx   alpha_r, 0, ALPHA
263         lxsdx   alpha_i, o8, ALPHA
264
265         .align 4
266
267 #include "ztrmm_logic_8x2_power8.S"
268
269 L999:
270         addi    r3, 0, 0
271
272         lfd     f14,    0(SP)
273         lfd     f15,    8(SP)
274         lfd     f16,   16(SP)
275         lfd     f17,   24(SP)
276
277         lfd     f18,   32(SP)
278         lfd     f19,   40(SP)
279         lfd     f20,   48(SP)
280         lfd     f21,   56(SP)
281
282         lfd     f22,   64(SP)
283         lfd     f23,   72(SP)
284         lfd     f24,   80(SP)
285         lfd     f25,   88(SP)
286
287         lfd     f26,   96(SP)
288         lfd     f27,  104(SP)
289         lfd     f28,  112(SP)
290         lfd     f29,  120(SP)
291
292         lfd     f30,  128(SP)
293         lfd     f31,  136(SP)
294
295 #ifdef __64BIT__
296         ld      r31,  144(SP)
297         ld      r30,  152(SP)
298         ld      r29,  160(SP)
299         ld      r28,  168(SP)
300         ld      r27,  176(SP)
301         ld      r26,  184(SP)
302         ld      r25,  192(SP)
303         ld      r24,  200(SP)
304         ld      r23,  208(SP)
305         ld      r22,  216(SP)
306         ld      r21,  224(SP)
307         ld      r20,  232(SP)
308         ld      r19,  240(SP)
309         ld      r18,  248(SP)
310         ld      r17,  256(SP)
311         ld      r16,  264(SP)
312         ld      r15,  272(SP)
313         ld      r14,  280(SP)
314         ld      r13,  288(SP)
315 #else
316         lwz     r31,  144(SP)
317         lwz     r30,  148(SP)
318         lwz     r29,  152(SP)
319         lwz     r28,  156(SP)
320         lwz     r27,  160(SP)
321         lwz     r26,  164(SP)
322         lwz     r25,  168(SP)
323         lwz     r24,  172(SP)
324         lwz     r23,  176(SP)
325         lwz     r22,  180(SP)
326         lwz     r21,  184(SP)
327         lwz     r20,  188(SP)
328         lwz     r19,  192(SP)
329         lwz     r18,  196(SP)
330         lwz     r17,  200(SP)
331         lwz     r16,  204(SP)
332         lwz     r15,  208(SP)
333         lwz     r14,  212(SP)
334         lwz     r13,  216(SP)
335 #endif
336
337         addi    SP, SP, STACKSIZE
338
339         blr
340
341         EPILOGUE
342 #endif