powerpc: Optimized SGEMM/DGEMM/CGEMM for POWER10
[platform/upstream/openblas.git] / kernel / power / cgemm_kernel_power10.S
1 /***************************************************************************
2 Copyright (c) 2013-2020, The OpenBLAS Project
3 All rights reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions are
6 met:
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
12 distribution.
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 *****************************************************************************/
27
28 #define ASSEMBLER
29 #include "common.h"
30 #include "def_vsx.h"
31
32  
33 #define LOAD    ld
34 #define STACKSIZE  (512 )  
35 #define FLINK_SAVE (STACKSIZE+16) /* 16($r12) */  
36 #define M       r3
37 #define N       r4
38 #define K       r5
39
40
41 #define A       r8
42 #define B       r9
43 #define C       r10
44 #define LDC     r6
45 #define OFFSET  r7
46
47
48 #define alpha_r vs51
49 #define alpha_i vs55
50 #define save_permute_1 vs59
51 #define permute_mask vs63
52 #define o0      0
53  
54
55 #define T1      r11
56 #define T2      r12
57 #define T3      r14
58 #define T4      r15
59 #define T5      r16
60 #define T6      r17
61 #define L       r18
62 #define T7      r19
63 #define T8      r20
64 #define TEMP_REG        r21
65 #define I       r22
66 #define J       r23
67 #define AO      r24
68 #define BO      r25
69 #define CO      r26
70 #define T9      r27
71 #define T10     r28
72 #define PRE     r29
73
74 #define T12     r30
75 #define T13     r31
76
77 #include "cgemm_macros_power10.S"
78
79 .equ    perm_const1, 0x0405060700010203
80 .equ    perm_const2, 0x0c0d0e0f08090a0b
81 .equ save_permute_12, 0x0c0d0e0f1c1d1e1f
82 .equ save_permute_11, 0x0405060714151617
83
84
85
86 #ifndef NEEDPARAM
87
88         PROLOGUE
89         PROFCODE
90
91
92         addi    SP, SP, -STACKSIZE
93         mflr r0
94
95
96         stfd    f14,    0(SP)
97         stfd    f15,    8(SP)
98         stfd    f16,   16(SP)
99         stfd    f17,   24(SP)
100
101         stfd    f18,   32(SP)
102         stfd    f19,   40(SP)
103         stfd    f20,   48(SP)
104         stfd    f21,   56(SP)
105
106         stfd    f22,   64(SP)
107         stfd    f23,   72(SP)
108         stfd    f24,   80(SP)
109         stfd    f25,   88(SP)
110
111         stfd    f26,   96(SP)
112         stfd    f27,  104(SP)
113         stfd    f28,  112(SP)
114         stfd    f29,  120(SP)
115
116         stfd    f30,  128(SP)
117         stfd    f31,  136(SP)
118
119
120         std     r31,  144(SP)
121         std     r30,  152(SP)
122         std     r29,  160(SP)
123         std     r28,  168(SP)
124         std     r27,  176(SP)
125         std     r26,  184(SP)
126         std     r25,  192(SP)
127         std     r24,  200(SP)
128         std     r23,  208(SP)
129         std     r22,  216(SP)
130         std     r21,  224(SP)
131         std     r20,  232(SP)
132         std     r19,  240(SP)
133         std     r18,  248(SP)
134         std     r17,  256(SP)
135         std     r16,  264(SP)
136         std     r15,  272(SP)
137         std     r14,  280(SP)
138  
139  
140   stxv    vs52,  288(SP)
141   stxv    vs53,  304(SP)
142   stxv    vs54,  320(SP)
143   stxv    vs55,  336(SP)
144   stxv    vs56,  352(SP)
145   stxv    vs57,  368(SP)
146   stxv    vs58,  384(SP)
147   stxv    vs59,  400(SP)
148   stxv    vs60,  416(SP)
149   stxv    vs61,  432(SP)
150   stxv    vs62,  448(SP)
151   stxv    vs63,  464(SP)
152   std     r0,   FLINK_SAVE(SP)
153  
154
155
156         ld      LDC, FRAMESLOT(0) + STACKSIZE(SP)
157
158
159
160 #ifdef TRMMKERNEL
161         ld      OFFSET,  FRAMESLOT(1) + STACKSIZE(SP)
162 #endif
163    slwi    LDC, LDC, ZBASE_SHIFT
164
165  
166  
167         /*alpha is stored in f1. convert to single and splat*/
168     xscvdpspn alpha_r,vs1 
169     xscvdpspn alpha_i,vs2 
170         xxspltw   alpha_r,alpha_r,0 
171         xxspltw   alpha_i,alpha_i,0 
172 /*load reverse permute mask for big endian
173   uint128 = 0xc0d0e0f08090a0b0405060700010203
174 */ 
175                 
176         lis T2, perm_const2@highest
177         lis T1, perm_const1@highest
178         lis T3, save_permute_12@highest
179         lis T4, save_permute_11@highest
180
181         
182         ori T2, T2, perm_const2@higher
183         ori T1, T1, perm_const1@higher
184         ori T3, T3, save_permute_12@higher
185         ori T4, T4, save_permute_11@higher
186
187         
188         rldicr T2, T2, 32, 31
189         rldicr T1, T1, 32, 31
190         rldicr T3, T3, 32, 31
191         rldicr T4, T4, 32, 31 
192
193         oris T2, T2, perm_const2@h
194         oris T1, T1, perm_const1@h
195         oris T3, T3, save_permute_12@h
196         oris T4, T4, save_permute_11@h
197
198         
199         ori T2, T2, perm_const2@l  
200         ori T1, T1, perm_const1@l
201         ori T3, T3, save_permute_12@l  
202         ori T4, T4, save_permute_11@l
203
204         
205   li r0,0
206   li PRE,512
207
208 #if defined(CC) || defined(CR) || defined(RC) || defined(RR) 
209 /*negate for this case as we will use addition -1*(a+b) */
210   xvnegsp alpha_r,alpha_r
211   xvnegsp alpha_i,alpha_i
212 #endif
213
214         mtvsrdd permute_mask,T2,T1
215         mtvsrdd save_permute_1,T3,T4    
216
217      /*mask is reverse permute so we have to make it inner permute */
218         xxpermdi        permute_mask,   permute_mask,   permute_mask,2 
219
220 #include "cgemm_logic_power10.S"
221
222 .L999: 
223         lfd     f14,    0(SP)
224         lfd     f15,    8(SP)
225         lfd     f16,   16(SP)
226         lfd     f17,   24(SP)
227
228         lfd     f18,   32(SP)
229         lfd     f19,   40(SP)
230         lfd     f20,   48(SP)
231         lfd     f21,   56(SP)
232
233         lfd     f22,   64(SP)
234         lfd     f23,   72(SP)
235         lfd     f24,   80(SP)
236         lfd     f25,   88(SP)
237
238         lfd     f26,   96(SP)
239         lfd     f27,  104(SP)
240         lfd     f28,  112(SP)
241         lfd     f29,  120(SP)
242
243         lfd     f30,  128(SP)
244         lfd     f31,  136(SP)
245
246         ld      r31,  144(SP)
247         ld      r30,  152(SP)
248         ld      r29,  160(SP)
249         ld      r28,  168(SP)
250         ld      r27,  176(SP)
251         ld      r26,  184(SP)
252         ld      r25,  192(SP)
253         ld      r24,  200(SP)
254         ld      r23,  208(SP)
255         ld      r22,  216(SP)
256         ld      r21,  224(SP)
257         ld      r20,  232(SP)
258         ld      r19,  240(SP)
259         ld      r18,  248(SP)
260         ld      r17,  256(SP)
261         ld      r16,  264(SP)
262         ld      r15,  272(SP)
263         ld      r14,  280(SP)
264
265         ld    r0,        FLINK_SAVE(SP) 
266  
267     lxv    vs52,  288(SP)
268     lxv    vs53,  304(SP)
269     lxv    vs54,  320(SP)
270     lxv    vs55,  336(SP)
271     lxv    vs56,  352(SP)
272     lxv    vs57,  368(SP)
273     lxv    vs58,  384(SP) 
274     lxv    vs59,  400(SP)
275         mtlr r0
276     lxv    vs60,  416(SP)
277     lxv    vs61,  432(SP) 
278     lxv    vs62,  448(SP)
279     lxv    vs63,  464(SP)
280
281         addi    SP, SP, STACKSIZE 
282         blr
283
284
285         EPILOGUE
286 #endif