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