powerpc: Optimized SGEMM/DGEMM/CGEMM for POWER10
[platform/upstream/openblas.git] / kernel / power / cgemm_macros_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 unit_size 8
29 #define DISP32(ind, disp) (ind*unit_size*32+disp)
30 #define DISP16(ind, disp) (ind*unit_size*16+disp)
31 #define DISP8(ind, disp) (ind*unit_size*8+disp)
32 #define DISP4(ind, disp) (ind*unit_size*4+disp)
33 #define DISP2(ind, disp) (ind*unit_size*2+disp)
34 #define DISP1(ind, disp) (ind*unit_size+disp)
35 #define DISPX(disp)  (disp)
36
37 .macro  AGGREGATE_REALS_IMAGES  VSINR_OUT1, VSINR, VSINI_OUT2, VSINI
38 #if     defined(NN) || defined(NT) || defined(TN) || defined(TT)
39         xvsubsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
40         xvaddsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
41 #elif  defined(CN) || defined(CT) || defined(RN) || defined(RT)
42         xvaddsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
43         xvsubsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
44 #elif  defined(NC) || defined(TC) || defined(NR) || defined(TR)
45         xvaddsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
46         xvsubsp  \VSINI_OUT2, \VSINI, \VSINI_OUT2
47 #else   // CC || CR || RC || RR
48     /*we will assume {-alpha_r,-alpha_i} for this case */
49     /*i1i2-r1r2 so we will negate alpha real instead to fix sign*/
50         xvsubsp  \VSINR_OUT1, \VSINR, \VSINR_OUT1
51     /*we will negate alpha image   instead to fix sign*/
52         xvaddsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
53 #endif
54 .endm
55
56 .macro  AGGREGATE_REALS_IMAGES_A_PERMUTE  VSINR_OUT1, VSINR, VSINI_OUT2, VSINI
57 #if     defined(NN) || defined(NT) || defined(TN) || defined(TT)
58         xvsubsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
59         xvaddsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
60 #elif  defined(CN) || defined(CT) || defined(RN) || defined(RT)
61         xvaddsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
62         xvsubsp  \VSINI_OUT2, \VSINI, \VSINI_OUT2
63 #elif  defined(NC) || defined(TC) || defined(NR) || defined(TR)
64         xvaddsp  \VSINR_OUT1, \VSINR_OUT1, \VSINR
65         xvsubsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
66 #else   // CC || CR || RC || RR
67     /*we will assume {-alpha_r,-alpha_i} for this case */
68     /*i1i2-r1r2 so we will negate alpha real instead to fix sign*/
69         xvsubsp  \VSINR_OUT1, \VSINR, \VSINR_OUT1
70     /*we will negate alpha image   instead to fix sign*/
71         xvaddsp  \VSINI_OUT2, \VSINI_OUT2, \VSINI
72 #endif
73 .endm
74
75 /* {i0,i1} * {alpha_i,alpha_i} [- VSOUT1] ;[VSOUT2 +] {r0,r1}*{alpha_i,alpha_i} */
76
77 .macro MULT_APLHA_PART1  VSINRR, VSINII, VSOUT1, VSOUT2
78         xvmulsp \VSOUT1, \VSINII, alpha_i
79         xvmulsp  \VSOUT2, \VSINRR, alpha_i
80 .endm
81
82 /*   {r0,r1} * {alpha_r,alpha_r} -  VSOUT1 ;VSOUT2 + {i0,i1} * {alpha_r,alpha_r} */
83
84 .macro MULT_APLHA_PART2  VSINRR, VSINII, VSOUT1, VSOUT2
85         xvmsubasp  \VSOUT1, \VSINRR, alpha_r
86         xvmaddasp \VSOUT2, \VSINII, alpha_r
87 .endm
88
89 .macro  PERMUTE1        OUT, R1, R2, R3, R4
90         xxsel   vs62, \R1, \R2, vs57
91         xxsel   \OUT, \R3, \R4, vs57
92         xxpermdi        \OUT, \OUT, vs62, 1
93 .endm
94 .macro  PERMUTE2        OUT, R1, R2, R3, R4
95         xxsel   vs62, \R2, \R1, vs57
96         xxsel   \OUT, \R4, \R3, vs57
97         xxpermdi        \OUT, vs62, \OUT, 1
98         xxperm  \OUT, \OUT, permute_mask
99 .endm
100 .macro PERMUTE3 OUT, R1, R2, R3, R4
101         xxsel   vs62, \R1, \R2, vs57
102         xxsel   \OUT, \R3, \R4, vs57
103         xxpermdi \OUT, vs62, \OUT, 2
104 .endm
105 .macro PERMUTE4 OUT, R1, R2, R3, R4
106         xxsel   vs62, \R2, \R1, vs57
107         xxsel   \OUT, \R4, \R3, vs57
108         xxpermdi        \OUT, \OUT, vs62, 2
109         xxperm  \OUT, \OUT, permute_mask
110 .endm
111 .macro  GROUP1
112         xxperm  vs0, vs32, permute_mask
113         xxperm  vs4, vs40, permute_mask
114         xxperm  vs1, vs33, permute_mask
115         xxperm  vs5, vs41, permute_mask
116         xxperm  vs8, vs36, permute_mask
117         xxperm  vs12, vs44, permute_mask
118         xxperm  vs9, vs37, permute_mask
119         xxperm  vs13, vs45, permute_mask
120 .endm
121 .macro  AGG_GROUP1
122         AGGREGATE_REALS_IMAGES  vs32, vs0, vs40, vs4
123         AGGREGATE_REALS_IMAGES  vs33, vs1, vs41, vs5
124         AGGREGATE_REALS_IMAGES  vs36, vs8, vs44, vs12
125         AGGREGATE_REALS_IMAGES  vs37, vs9, vs45, vs13
126 .endm
127 .macro  GROUP2
128         xxperm  vs0, vs34, permute_mask
129         xxperm  vs4, vs42, permute_mask
130         xxperm  vs1, vs35, permute_mask
131         xxperm  vs5, vs43, permute_mask
132         xxperm  vs8, vs38, permute_mask
133         xxperm  vs12, vs46, permute_mask
134         xxperm  vs9, vs39, permute_mask
135         xxperm  vs13, vs47, permute_mask
136 .endm
137 .macro  AGG_GROUP2
138         AGGREGATE_REALS_IMAGES  vs34, vs0, vs42, vs4
139         AGGREGATE_REALS_IMAGES  vs35, vs1, vs43, vs5
140         AGGREGATE_REALS_IMAGES  vs38, vs8, vs46, vs12
141         AGGREGATE_REALS_IMAGES  vs39, vs9, vs47, vs13
142 .endm
143 .macro  MULTIPLY_GROUP1
144         MULT_APLHA_PART1        vs32, vs40, vs0, vs1
145         MULT_APLHA_PART1        vs33, vs41, vs2, vs3
146         MULT_APLHA_PART1        vs36, vs44, vs8, vs9
147         MULT_APLHA_PART1        vs37, vs45, vs10, vs11
148         MULT_APLHA_PART2        vs32, vs40, vs0, vs1
149         MULT_APLHA_PART2        vs33, vs41, vs2, vs3
150         MULT_APLHA_PART2        vs36, vs44, vs8, vs9
151         MULT_APLHA_PART2        vs37, vs45, vs10, vs11
152 .endm
153 .macro  MULTIPLY_GROUP2
154         MULT_APLHA_PART1        vs34, vs42, vs4, vs5
155         MULT_APLHA_PART1        vs35, vs43, vs6, vs7
156         MULT_APLHA_PART1        vs38, vs46, vs12, vs13
157         MULT_APLHA_PART1        vs39, vs47, vs14, vs15
158         MULT_APLHA_PART2        vs34, vs42, vs4, vs5
159         MULT_APLHA_PART2        vs35, vs43, vs6, vs7
160         MULT_APLHA_PART2        vs38, vs46, vs12, vs13
161         MULT_APLHA_PART2        vs39, vs47, vs14, vs15
162 .endm
163 /* reconstruct r, i pairs*/
164 .macro  RECONSTRUCT_PAIR1
165         xxperm  vs0, vs1, save_permute_1
166         xxperm  vs2, vs3, save_permute_1
167         xxperm  vs8, vs9, save_permute_1
168         xxperm  vs10, vs11, save_permute_1
169 .endm
170 .macro  RECONSTRUCT_PAIR2
171         xxperm  vs4, vs5, save_permute_1
172         xxperm  vs6, vs7, save_permute_1
173         xxperm  vs12, vs13, save_permute_1
174         xxperm  vs14, vs15, save_permute_1
175 .endm
176 .macro  SHUFFLE_ACC     ACC, R0, R1, R2, R3, O1, O2, O3, O4
177         xxmfacc \ACC
178         PERMUTE1        \O1, \R3, \R2, \R1, \R0
179         PERMUTE2        \O2, \R1, \R0, \R3, \R2
180         PERMUTE3        \O3, \R1, \R0, \R3, \R2
181         PERMUTE4        \O4, \R3, \R2, \R1, \R0
182 .endm
183 /*                                             macros for N=4 and M=8
184 **********************************************************************************************/
185 .macro  ZERO4x8
186         xxsetaccz       0
187         xxsetaccz       1
188         xxsetaccz       2
189         xxsetaccz       3
190         xxsetaccz       4
191         xxsetaccz       5
192         xxsetaccz       6
193         xxsetaccz       7
194 .endm
195
196 .macro  LOAD4x8
197         LOAD4x8O        0, 0
198 .endm
199
200 .macro  LOAD4x8O  OffsetA, OffsetB
201         lxvp    vs34, (\OffsetB+0)(BO)
202         lxvp    vs32, (\OffsetA+0)(AO)
203         lxvp    vs36, (\OffsetA+32)(AO)
204 .endm
205
206 .macro  END4x8_NORMAL
207         END4x8  AO, BO, 64, 32
208 .endm
209
210 .macro  END4x8_WITHOUT_ADD
211         END4x8  AO, BO, 0, 0
212 .endm
213
214 .macro  END4x8  AREG, BREG, OffsetA, OffsetB
215 .if \OffsetB != 0
216         addi    \BREG, \BREG, \OffsetB
217 .endif
218 .if \OffsetA != 0
219         addi    \AREG, \AREG, \OffsetA
220 .endif
221         xvf32gerpp      3, 36, 35
222         xvf32gerpp      2, 37, 35
223         xvf32gerpp      1, 32, 35
224         xvf32gerpp      0, 33, 35
225         xvf32gerpp      7, 36, 34
226         xvf32gerpp      6, 37, 34
227         xvf32gerpp      5, 32, 34
228         xvf32gerpp      4, 33, 34
229 .endm
230
231 .macro  LOAD4x8_2
232         LOAD4x8_2O      0, 0
233 .endm
234
235 .macro  LOAD4x8_2O  OffsetA, OffsetB
236         lxvp    vs34, (\OffsetB)(BO)
237         lxvp    vs38, (32+\OffsetB)(BO)
238         lxvp    vs32, (0+\OffsetA)(AO)
239         lxvp    vs36, (32+\OffsetA)(AO)
240         lxvp    vs40, (64+\OffsetA)(AO)
241         lxvp    vs42, (64+32+\OffsetA)(AO)
242 .endm
243
244 .macro  END4x8_2
245         /*for load2 offset will be 128 and 64*/
246         KERNEL4x8_2     AO, BO, 128, 64, 0, 1, 1
247 .endm
248
249 .macro  KERNEL4x8_E2    OffsetA, OffsetB, Index, IsLast
250         KERNEL4x8_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
251 .endm
252
253 .macro  KERNEL4x8_L2    OffsetA, OffsetB, Index, IsLast
254         KERNEL4x8_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
255 .endm
256
257 .macro  KERNEL4x8_2     AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
258         xvf32gerpp      3, 36, 35
259         xvf32gerpp      2, 37, 35
260         xvf32gerpp      1, 32, 35
261         xvf32gerpp      0, 33, 35
262         xvf32gerpp      7, 36, 34
263         xvf32gerpp      6, 37, 34
264         xvf32gerpp      5, 32, 34
265         xvf32gerpp      4, 33, 34
266 .if \Complete==0
267         lxvp    vs34, DISP8(\Index, \OffsetB)(\BREG)
268         lxvp    vs32, DISP16(\Index, 0+\OffsetA)(\AREG)
269         lxvp    vs36, DISP16(\Index, 32+\OffsetA)(\AREG)
270 .endif
271         xvf32gerpp      3, 42, 39
272         xvf32gerpp      2, 43, 39
273         xvf32gerpp      1, 40, 39
274         xvf32gerpp      0, 41, 39
275         xvf32gerpp      7, 42, 38
276         xvf32gerpp      6, 43, 38
277         xvf32gerpp      5, 40, 38
278         xvf32gerpp      4, 41, 38
279 .if \Complete==0
280         lxvp    vs40, DISP16(\Index, 64+\OffsetA)(\AREG)
281         lxvp    vs38, DISP8(\Index, 32+\OffsetB)(\BREG)
282         lxvp    vs42, DISP16(\Index, 64+32+\OffsetA)(\AREG)
283 .endif
284 .if \IsLast==1
285 .if \Complete==1
286         addi    \BREG, \BREG, DISP8(\Index, \OffsetB)
287         addi    \AREG, \AREG, DISP16(\Index, \OffsetA)
288 .else
289         addi    \BREG, \BREG, DISP8(\Index, 64)
290         addi    \AREG, \AREG, DISP16(\Index, 128)
291 .endif
292 .endif
293 .endm
294
295 .macro  KERNEL4x8
296         LOAD4x8
297         END4x8  AO, BO, 64, 32
298 .endm
299
300 .macro SAVE4x8
301         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
302         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
303         SHUFFLE_ACC     2, vs8, vs9, vs10, vs11, vs34, vs42, vs38, vs46
304         SHUFFLE_ACC     3, vs12, vs13, vs14, vs15, vs35, vs43, vs39, vs47
305         SHUFFLE_ACC     4, vs16, vs17, vs18, vs19, vs48, vs56, vs52, vs60
306         SHUFFLE_ACC     5, vs20, vs21, vs22, vs23, vs49, vs16, vs53, vs61
307         SHUFFLE_ACC     7, vs28, vs29, vs30, vs31, vs17, vs19, vs18, vs20
308         SHUFFLE_ACC     6, vs24, vs25, vs26, vs27, vs50, vs58, vs54, vs21
309         add     T4, LDC, LDC
310         add     T1, CO, LDC
311 #ifndef TRMMKERNEL
312         lxvp    vs24, 0(CO)
313 #endif
314 #ifndef TRMMKERNEL
315         lxvp    vs26, 32(CO)
316 #endif
317 #ifndef TRMMKERNEL
318         lxvp    vs28, 0(T1)
319 #endif
320         xxperm  vs2, vs34, permute_mask
321         xxperm  vs6, vs42, permute_mask
322 #ifndef TRMMKERNEL
323         lxvp    vs30, 32(T1)
324 #endif
325         xxperm  vs3, vs35, permute_mask
326         xxperm  vs7, vs43, permute_mask
327         add     T2, CO, T4
328         add     T3, T1, T4
329         GROUP1
330         AGG_GROUP1
331         AGGREGATE_REALS_IMAGES  vs34, vs2, vs42, vs6
332         xxperm  vs10, vs38, permute_mask
333         xxperm  vs14, vs46, permute_mask
334         AGGREGATE_REALS_IMAGES  vs35, vs3, vs43, vs7
335         xxperm  vs11, vs39, permute_mask
336         xxperm  vs15, vs47, permute_mask
337         xxperm  vs0, vs48, permute_mask
338         xxperm  vs4, vs56, permute_mask
339         xxperm  vs1, vs49, permute_mask
340         xxperm  vs5, vs16, permute_mask
341         AGGREGATE_REALS_IMAGES  vs38, vs10, vs46, vs14
342         xxperm  vs2, vs50, permute_mask
343         xxperm  vs6, vs58, permute_mask
344         AGGREGATE_REALS_IMAGES  vs39, vs11, vs47, vs15
345         xxperm  vs3, vs17, permute_mask
346         xxperm  vs7, vs19, permute_mask
347         AGGREGATE_REALS_IMAGES  vs48, vs0, vs56, vs4
348         xxperm  vs8, vs52, permute_mask
349         xxperm  vs12, vs60, permute_mask
350         AGGREGATE_REALS_IMAGES  vs49, vs1, vs16, vs5
351         xxperm  vs9, vs53, permute_mask
352         xxperm  vs13, vs61, permute_mask
353         AGGREGATE_REALS_IMAGES  vs50, vs2, vs58, vs6
354         xxperm  vs10, vs54, permute_mask
355         xxperm  vs14, vs21, permute_mask
356         AGGREGATE_REALS_IMAGES  vs17, vs3, vs19, vs7
357         xxperm  vs11, vs18, permute_mask
358         xxperm  vs15, vs20, permute_mask
359         AGGREGATE_REALS_IMAGES  vs52, vs8, vs60, vs12
360         AGGREGATE_REALS_IMAGES  vs53, vs9, vs61, vs13
361 /*VSINRR, VSINII, VSOUT1, VSOUT2*/
362         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
363         AGGREGATE_REALS_IMAGES  vs54, vs10, vs21, vs14
364         MULT_APLHA_PART1    vs33, vs41, vs2, vs3
365         AGGREGATE_REALS_IMAGES  vs18, vs11, vs20, vs15
366         MULT_APLHA_PART1    vs34, vs42, vs4, vs5
367         MULT_APLHA_PART1    vs35, vs43, vs6, vs7
368         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
369         MULT_APLHA_PART2    vs33, vs41, vs2, vs3
370         MULT_APLHA_PART2    vs34, vs42, vs4, vs5
371         MULT_APLHA_PART2    vs35, vs43, vs6, vs7
372 #ifndef TRMMKERNEL
373         lxvp    vs32, 0(T2)
374 #endif
375         MULT_APLHA_PART1    vs36, vs44, vs8, vs9
376         MULT_APLHA_PART1    vs37, vs45, vs10, vs11
377 #ifndef TRMMKERNEL
378         lxvp    vs40, 32(T2)
379 #endif
380         MULT_APLHA_PART1    vs38, vs46, vs12, vs13
381         MULT_APLHA_PART1    vs39, vs47, vs14, vs15
382 #ifndef TRMMKERNEL
383         lxvp    vs34, 0(T3)
384 #endif
385         MULT_APLHA_PART2    vs36, vs44, vs8, vs9
386         MULT_APLHA_PART2    vs37, vs45, vs10, vs11
387 #ifndef TRMMKERNEL
388         lxvp    vs42, 32(T3)
389 #endif
390         MULT_APLHA_PART2    vs38, vs46, vs12, vs13
391         MULT_APLHA_PART2    vs39, vs47, vs14, vs15
392         RECONSTRUCT_PAIR1
393         RECONSTRUCT_PAIR2
394 #ifndef TRMMKERNEL
395         /* add */
396         xxpermdi        vs1, vs8, vs0, 2
397         xxpermdi        vs3, vs10, vs2, 2
398         xxpermdi        vs5, vs12, vs4, 2
399         xxpermdi        vs7, vs14, vs6, 2
400         xxpermdi        vs9, vs0, vs8, 2
401         xxpermdi        vs11, vs2, vs10, 2
402         xvaddsp vs24, vs24, vs3
403         xvaddsp vs25, vs25, vs1
404         xxpermdi        vs13, vs4, vs12, 2
405         xxpermdi        vs15, vs6, vs14, 2
406         xvaddsp vs26, vs26, vs7
407         xvaddsp vs27, vs27, vs5
408         xvaddsp vs28, vs28, vs11
409         xvaddsp vs29, vs29, vs9
410         xvaddsp vs30, vs30, vs15
411         xvaddsp vs31, vs31, vs13
412 #else
413         xxpermdi        vs25, vs8, vs0, 2
414         xxpermdi        vs24, vs10, vs2, 2
415         xxpermdi        vs27, vs12, vs4, 2
416         xxpermdi        vs26, vs14, vs6, 2
417         xxpermdi        vs29, vs0, vs8, 2
418         xxpermdi        vs28, vs2, vs10, 2
419         xxpermdi        vs31, vs4, vs12, 2
420         xxpermdi        vs30, vs6, vs14, 2
421 #endif
422         stxvp   vs24, 0(CO)
423         MULT_APLHA_PART1    vs48, vs56, vs0, vs1
424         MULT_APLHA_PART1    vs49, vs16, vs2, vs3
425         stxvp   vs26, 32(CO)
426         MULT_APLHA_PART1    vs50, vs58, vs4, vs5
427         MULT_APLHA_PART1    vs17, vs19, vs6, vs7
428         stxvp   vs28, 0(T1)
429         MULT_APLHA_PART2    vs48, vs56, vs0, vs1
430         MULT_APLHA_PART2    vs49, vs16, vs2, vs3
431         stxvp   vs30, 32(T1)
432         MULT_APLHA_PART2    vs50, vs58, vs4, vs5
433         MULT_APLHA_PART2    vs17, vs19, vs6, vs7
434         MULT_APLHA_PART1    vs52, vs60, vs8, vs9
435         MULT_APLHA_PART1    vs53, vs61, vs10, vs11
436         MULT_APLHA_PART1    vs54, vs21, vs12, vs13
437         MULT_APLHA_PART1    vs18, vs20, vs14, vs15
438         MULT_APLHA_PART2    vs52, vs60, vs8, vs9
439         MULT_APLHA_PART2    vs53, vs61, vs10, vs11
440         MULT_APLHA_PART2    vs54, vs21, vs12, vs13
441         MULT_APLHA_PART2    vs18, vs20, vs14, vs15
442         RECONSTRUCT_PAIR1
443         RECONSTRUCT_PAIR2
444 #ifndef TRMMKERNEL
445   /* add */
446         xxpermdi        vs1, vs8, vs0, 2
447         xxpermdi        vs3, vs10, vs2, 2
448         xxpermdi        vs5, vs12, vs4, 2
449         xxpermdi        vs7, vs14, vs6, 2
450         xxpermdi        vs9, vs0, vs8, 2
451         xxpermdi        vs11, vs2, vs10, 2
452         xvaddsp vs32, vs32, vs3
453         xvaddsp vs33, vs33, vs1
454         xxpermdi        vs13, vs4, vs12, 2
455         xxpermdi        vs15, vs6, vs14, 2
456         xvaddsp vs40, vs40, vs7
457         xvaddsp vs41, vs41, vs5
458         xvaddsp vs34, vs34, vs11
459         xvaddsp vs35, vs35, vs9
460         xvaddsp vs42, vs42, vs15
461         xvaddsp vs43, vs43, vs13
462 #else
463         xxpermdi        vs33, vs8, vs0, 2
464         xxpermdi        vs32, vs10, vs2, 2
465         xxpermdi        vs41, vs12, vs4, 2
466         xxpermdi        vs40, vs14, vs6, 2
467         xxpermdi        vs35, vs0, vs8, 2
468         xxpermdi        vs34, vs2, vs10, 2
469         xxpermdi        vs43, vs4, vs12, 2
470         xxpermdi        vs42, vs6, vs14, 2
471 #endif
472         stxvp   vs32, 0(T2)
473         stxvp   vs40, 32(T2)
474         stxvp   vs34, 0(T3)
475         stxvp   vs42, 32(T3)
476         addi    CO, CO, 64
477 .endm
478
479 /*                                             macros for N=4 and M=4
480 **********************************************************************************************/
481
482 .macro  ZERO4x4
483         xxsetaccz       0
484         xxsetaccz       1
485         xxsetaccz       2
486         xxsetaccz       3
487 .endm
488
489 .macro  LOAD4x4
490         LOAD4x4O 0, 0
491 .endm
492
493 .macro  LOAD4x4O  OffsetA, OffsetB
494         lxvp    vs34, (\OffsetB+0)(BO)
495         lxvp    vs32, (\OffsetA+0)(AO)
496 .endm
497
498 .macro  END4x4_NORMAL
499         END4x4 AO, BO, 32, 32
500 .endm
501
502 .macro  END4x4_WITHOUT_ADD
503         END4x4 AO, BO, 0, 0
504 .endm
505
506 .macro  END4x4  AREG, BREG, OffsetA, OffsetB
507 .if \OffsetB != 0
508         addi    \BREG, \BREG, \OffsetB
509 .endif
510 .if \OffsetA != 0
511         addi    \AREG, \AREG, \OffsetA
512 .endif
513         xvf32gerpp      3, 32, 34
514         xvf32gerpp      2, 33, 34
515         xvf32gerpp      1, 32, 35
516         xvf32gerpp      0, 33, 35
517 .endm
518
519 .macro  LOAD4x4_2
520         LOAD4x4_2O 0, 0
521 .endm
522
523 .macro  LOAD4x4_2O  OffsetA, OffsetB
524         lxvp    vs34, (\OffsetB)(BO)
525         lxvp    vs38, (32+\OffsetB)(BO)
526         lxvp    vs32, (0+\OffsetA)(AO)
527         lxvp    vs36, (32+\OffsetA)(AO)
528 .endm
529
530 .macro  END4x4_2
531   /*for load2 offset will be 64 and 64*/
532         KERNEL4x4_2     AO, BO, 64, 64, 0, 1, 1
533 .endm
534
535 .macro  KERNEL4x4_E2    OffsetA, OffsetB, Index, IsLast
536         KERNEL4x4_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
537 .endm
538
539 .macro  KERNEL4x4_L2    OffsetA, OffsetB, Index, IsLast
540         KERNEL4x4_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
541 .endm
542
543 .macro  KERNEL4x4_2     AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
544         xvf32gerpp      3, 32, 34
545         xvf32gerpp      2, 33, 34
546         xvf32gerpp      1, 32, 35
547         xvf32gerpp      0, 33, 35
548 .if \Complete==0
549         lxvp    vs34, DISP8(\Index, \OffsetB)(\BREG)
550         lxvp    vs32, DISP8(\Index, 0+\OffsetA)(\AREG)
551 .endif
552         xvf32gerpp      3, 36, 38
553         xvf32gerpp      2, 37, 38
554         xvf32gerpp      1, 36, 39
555         xvf32gerpp      0, 37, 39
556 .if \Complete==0
557         lxvp    vs38, DISP8(\Index, 32+\OffsetB)(\BREG)
558         lxvp    vs36, DISP8(\Index, 32+\OffsetA)(\AREG)
559 .endif
560 .if \IsLast==1
561 .if \Complete==1
562         addi            \BREG, \BREG, DISP8(\Index, \OffsetB)
563         addi    \AREG, \AREG, DISP8(\Index, \OffsetA)
564 .else
565         addi            \BREG, \BREG, DISP8(\Index, 64)
566         addi    \AREG, \AREG, DISP8(\Index, 64)
567 .endif
568 .endif
569 .endm
570
571 .macro  KERNEL4x4
572         LOAD4x4
573         END4x4  AO, BO, 32, 32
574 .endm
575
576 .macro SAVE4x4
577         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
578         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
579         SHUFFLE_ACC     2, vs8, vs9, vs10, vs11, vs34, vs42, vs38, vs46
580         SHUFFLE_ACC     3, vs12, vs13, vs14, vs15, vs35, vs43, vs39, vs47
581         add     T4, LDC, LDC
582         add     T1, CO, LDC
583 #ifndef TRMMKERNEL
584         lxvp    vs24, 0(CO)
585 #endif
586         add     T2, CO, T4
587         add     T3, T1, T4
588 #ifndef TRMMKERNEL
589         lxvp    vs26, 0(T1)
590 #endif
591  #ifndef TRMMKERNEL
592         lxvp    vs28, 0(T2)
593 #endif
594 #ifndef TRMMKERNEL
595         lxvp    vs30, 0(T3)
596 #endif
597         GROUP1
598         AGG_GROUP1
599         GROUP2
600         AGG_GROUP2
601   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
602         MULTIPLY_GROUP1
603         MULTIPLY_GROUP2
604 /* reconstruct r, i pairs*/
605         RECONSTRUCT_PAIR1
606         RECONSTRUCT_PAIR2
607 #ifndef TRMMKERNEL
608   /* add */
609         xxpermdi        vs1, vs8, vs0, 2
610         xxpermdi        vs3, vs10, vs2, 2
611         xxpermdi        vs9, vs0, vs8, 2
612         xxpermdi        vs11, vs2, vs10, 2
613         xxpermdi        vs5, vs12, vs4, 2
614         xxpermdi        vs7, vs14, vs6, 2
615         xxpermdi        vs13, vs4, vs12, 2
616         xxpermdi        vs15, vs6, vs14, 2
617         xvaddsp vs24, vs24, vs3
618         xvaddsp vs25, vs25, vs1
619         xvaddsp vs26, vs26, vs11
620         xvaddsp vs27, vs27, vs9
621         xvaddsp vs28, vs28, vs7
622         xvaddsp vs29, vs29, vs5
623         xvaddsp vs30, vs30, vs15
624         xvaddsp vs31, vs31, vs13
625 #else
626         xxpermdi        vs25, vs8, vs0, 2
627         xxpermdi        vs24, vs10, vs2, 2
628         xxpermdi        vs27, vs0, vs8, 2
629         xxpermdi        vs26, vs2, vs10, 2
630         xxpermdi        vs29, vs12, vs4, 2
631         xxpermdi        vs28, vs14, vs6, 2
632         xxpermdi        vs31, vs4, vs12, 2
633         xxpermdi        vs30, vs6, vs14, 2
634 #endif
635         stxvp   vs24, 0(CO)
636         stxvp   vs26, 0(T1)
637         stxvp   vs28, 0(T2)
638         stxvp   vs30, 0(T3)
639         addi  CO, CO, 32
640 .endm
641
642 /*                                             macros for N=4 and M=2
643 **********************************************************************************************/
644
645 .macro  ZERO4x2
646         xxsetaccz       0
647         xxsetaccz       1
648 .endm
649
650 .macro  LOAD4x2
651         LOAD4x2O 0, 0
652 .endm
653
654 .macro  LOAD4x2O  OffsetA, OffsetB
655         lxv     vs32, (\OffsetA+0)(AO)
656         lxvp    vs34, (\OffsetB+0)(BO)
657 .endm
658
659 .macro  END4x2_NORMAL
660         END4x2 AO, BO, 16, 32
661 .endm
662
663 .macro  END4x2_WITHOUT_ADD
664         END4x2 AO, BO, 0, 0
665 .endm
666
667 .macro  END4x2  AREG, BREG, OffsetA, OffsetB
668 .if \OffsetB != 0
669         addi    \BREG, \BREG, \OffsetB
670 .endif
671
672 .if \OffsetA != 0
673         addi    \AREG, \AREG, \OffsetA
674 .endif
675         xvf32gerpp      1, 34, 32
676         xvf32gerpp      0, 35, 32
677 .endm
678
679 .macro  LOAD4x2_2
680         LOAD4x2_2O 0, 0
681 .endm
682
683 .macro  LOAD4x2_2O  OffsetA, OffsetB
684         lxvp    vs32, (\OffsetA)(AO)
685         lxvp    vs34, (0+\OffsetB)(BO)
686         lxvp    vs36, (32+\OffsetB)(BO)
687 .endm
688
689 .macro  END4x2_2
690   /*for load2 offset will be 32 and 64*/
691         KERNEL4x2_2     AO, BO, 32, 64, 0, 1, 1
692 .endm
693
694 .macro  KERNEL4x2_E2    OffsetA, OffsetB, Index, IsLast
695         KERNEL4x2_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
696 .endm
697
698 .macro  KERNEL4x2_L2    OffsetA, OffsetB, Index, IsLast
699         KERNEL4x2_2     AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
700 .endm
701
702 .macro  KERNEL4x2_2     AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
703         xvf32gerpp      1, 34, 33
704         xvf32gerpp      0, 35, 33
705 .if \Complete==0
706         lxvp    vs34, DISP8(\Index, 0+\OffsetB)(\BREG)
707 .endif
708         xvf32gerpp      1, 36, 32
709         xvf32gerpp      0, 37, 32
710 .if \Complete==0
711         lxvp    vs32, DISP4(\Index, \OffsetA)(\AREG)
712         lxvp    vs36, DISP8(\Index, 32+\OffsetB)(\BREG)
713 .endif
714 .if \IsLast==1
715 .if \Complete==1
716         addi    \AREG, \AREG, DISP4(\Index, \OffsetA)
717         addi            \BREG, \BREG, DISP8(\Index, \OffsetB)
718 .else
719         addi    \AREG, \AREG, DISP4(\Index, 32)
720         addi            \BREG, \BREG, DISP8(\Index, 64)
721 .endif
722 .endif
723 .endm
724
725 .macro  KERNEL4x2
726         LOAD4x2
727         END4x2  AO, BO, 16, 32
728 .endm
729
730 .macro SAVE4x2
731         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
732         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
733         add     T4, LDC, LDC
734         add     T1, CO, LDC
735         add     T2, CO, T4
736         add     T3, T1, T4
737 #ifndef TRMMKERNEL
738         lxv     vs24, 0(CO)
739 #endif
740 #ifndef TRMMKERNEL
741         lxv     vs25, 0(T1)
742 #endif
743 #ifndef TRMMKERNEL
744         lxv     vs26, 0(T2)
745 #endif
746 #ifndef TRMMKERNEL
747         lxv     vs27, 0(T3)
748 #endif
749         GROUP1
750         AGGREGATE_REALS_IMAGES_A_PERMUTE vs32, vs0, vs40, vs4
751         AGGREGATE_REALS_IMAGES_A_PERMUTE vs33, vs1, vs41, vs5
752         AGGREGATE_REALS_IMAGES_A_PERMUTE vs36, vs8, vs44, vs12
753         AGGREGATE_REALS_IMAGES_A_PERMUTE vs37, vs9, vs45, vs13
754   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
755         MULTIPLY_GROUP1
756 /* reconstruct r, i pairs*/
757         RECONSTRUCT_PAIR1
758 #ifndef TRMMKERNEL
759   /* add */
760         xxpermdi        vs1, vs8, vs0, 0
761         xxpermdi        vs9, vs10, vs2, 0
762         xxpermdi        vs3, vs0, vs8, 3
763         xxpermdi        vs11, vs2, vs10, 3
764         xvaddsp vs24, vs24, vs1
765         xvaddsp vs26, vs26, vs9
766         xvaddsp vs25, vs25, vs3
767         xvaddsp vs27, vs27, vs11
768 #else
769         xxpermdi        vs24, vs8, vs0, 0
770         xxpermdi        vs26, vs10, vs2, 0
771         xxpermdi        vs25, vs0, vs8, 3
772         xxpermdi        vs27, vs2, vs10, 3
773 #endif
774         stxv    vs24, 0(CO)
775         stxv    vs25, 0(T1)
776         stxv    vs26, 0(T2)
777         stxv    vs27, 0(T3)
778         addi  CO, CO, 16
779 .endm
780
781 /*                                             macros for N=4 and M=2
782 **********************************************************************************************/
783
784 .macro  ZERO4x1
785         xxsetaccz       0
786         xxsetaccz       1
787 .endm
788
789 .macro  LOAD4x1
790         LOAD4x1O 0, 0
791 .endm
792
793 .macro  LOAD4x1O  OffsetA, OffsetB
794         lxsd    v0, (\OffsetA+0)(AO)
795         lxvp    vs34, (\OffsetB+0)(BO)
796 .endm
797
798 .macro  END4x1_NORMAL
799         END4x1 AO, BO,8, 32
800 .endm
801
802 .macro  END4x1_WITHOUT_ADD
803         END4x1 AO, BO, 0, 0
804 .endm
805
806 .macro  END4x1 AREG, BREG, OffsetA, OffsetB
807 .if \OffsetB != 0
808         addi  \BREG, \BREG, \OffsetB
809 .endif
810
811 .if \OffsetA != 0
812         addi  \AREG, \AREG, \OffsetA
813 .endif
814         xvf32gerpp          0, 35, 32
815         xvf32gerpp          1, 34, 32
816 .endm
817
818 .macro  LOAD4x1_2
819         LOAD4x1_2O 0, 0
820 .endm
821
822 .macro  LOAD4x1_2O  OffsetA, OffsetB
823         lxv     vs32, (\OffsetA)(AO)
824         vspltisb        v6, 0
825         xxpermdi        vs33, vs32, vs38, 0
826         xxpermdi        vs32, vs32, vs38, 2
827         lxvp    vs34, (0+\OffsetB)(BO)
828         lxvp    vs36, (32+\OffsetB)(BO)
829 .endm
830
831 .macro  END4x1_2
832   /*for load2 offset will be 16 and 64*/
833         KERNEL4x1_2  AO, BO, 16, 64, 0, 1, 1
834 .endm
835
836 .macro  KERNEL4x1_E2 OffsetA, OffsetB, Index, IsLast
837         KERNEL4x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
838 .endm
839
840 .macro  KERNEL4x1_L2 OffsetA, OffsetB, Index, IsLast
841         KERNEL4x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
842 .endm
843
844 .macro  KERNEL4x1_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
845         xvf32gerpp          0, 35, 32
846         xvf32gerpp          1, 34, 32
847 .if \Complete==0
848         lxvp    vs34, DISP8(\Index, 0+\OffsetB)(\BREG)
849 .endif
850         xvf32gerpp          0, 37, 33
851         xvf32gerpp          1, 36, 33
852 .if \Complete==0
853         lxv     vs32, DISP2(\Index, \OffsetA)(\AREG)
854         lxvp    vs36, DISP8(\Index, 32+\OffsetB)(\BREG)
855         xxpermdi        vs33, vs32, vs38, 0
856         xxpermdi        vs32, vs32, vs38, 2
857 .endif
858 .if \IsLast==1
859 .if \Complete==1
860         addi    \AREG, \AREG, DISP2(\Index, \OffsetA)
861         addi    \BREG, \BREG, DISP8(\Index, \OffsetB)
862 .else
863         addi    \AREG, \AREG, DISP2(\Index, 16)
864         addi    \BREG, \BREG, DISP8(\Index, 64)
865 .endif
866 .endif
867 .endm
868
869 .macro  KERNEL4x1
870         LOAD4x1
871         END4x1  AO, BO, 8, 32
872 .endm
873
874 .macro SAVE4x1
875         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
876         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
877         xxpermdi        vs32, vs32, vs36, 1
878         xxpermdi        vs40, vs40, vs44, 1
879         xxpermdi        vs33, vs33, vs37, 1
880         xxpermdi        vs41, vs41, vs45, 1
881         add     T4, LDC, LDC
882         add     T1, CO, LDC
883         add     T2, CO, T4
884         add     T3, T1, T4
885 #ifndef TRMMKERNEL
886         lxsd    v4, 0(CO)
887 #endif
888 #ifndef TRMMKERNEL
889         lxsd    v5, 0(T1)
890 #endif
891 #ifndef TRMMKERNEL
892         lxsd    v6, 0(T2)
893 #endif
894 #ifndef TRMMKERNEL
895         lxsd    v7, 0(T3)
896 #endif
897         xxperm  vs0, vs32, permute_mask
898         xxperm  vs4, vs40, permute_mask
899         xxperm  vs1, vs33, permute_mask
900         xxperm  vs5, vs41, permute_mask
901         AGGREGATE_REALS_IMAGES_A_PERMUTE vs32, vs0, vs40, vs4
902         AGGREGATE_REALS_IMAGES_A_PERMUTE vs33, vs1, vs41, vs5
903   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
904         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
905         MULT_APLHA_PART1    vs33, vs41, vs2, vs3
906         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
907         MULT_APLHA_PART2    vs33, vs41, vs2, vs3
908 /* reconstruct r, i pairs*/
909         xxperm  vs0, vs1, save_permute_1
910         xxperm  vs2, vs3, save_permute_1
911 #ifndef TRMMKERNEL
912   /* add */
913         xxspltd vs1, vs0, 0
914         xxspltd vs3, vs0, 1
915         xxspltd vs9, vs2, 0
916         xxspltd vs11, vs2, 1
917  /*--v4==vs36 v5==vs37 v6==vs38 v7==vs39---*/
918         xvaddsp vs36, vs36, vs1
919         xvaddsp vs37, vs37, vs3
920         xvaddsp vs38, vs38, vs9
921         xvaddsp vs39, vs39, vs11
922 #else
923  /*--v4==vs36 v5==vs37 v6==vs38 v7==vs39---*/
924         xxspltd vs36, vs0, 0
925         xxspltd vs37, vs0, 1
926         xxspltd vs38, vs2, 0
927         xxspltd vs39, vs2, 1
928 #endif
929         stxsd   v4, 0(CO)
930         stxsd   v5, 0(T1)
931         stxsd   v6, 0(T2)
932         stxsd   v7, 0(T3)
933         addi  CO, CO, 8
934 .endm
935
936 /*                                             macros for N=2 and M=8
937 **********************************************************************************************/
938
939 .macro  ZERO2x8
940         xxsetaccz       0
941         xxsetaccz       1
942         xxsetaccz       2
943         xxsetaccz       3
944 .endm
945
946 .macro  LOAD2x8
947         LOAD2x8O 0, 0
948 .endm
949
950 .macro  LOAD2x8O  OffsetA, OffsetB
951         lxv     vs34, (\OffsetB+0)(BO)
952         lxvp    vs32, (\OffsetA+0)(AO)
953         lxvp    vs36, (\OffsetA+32)(AO)
954 .endm
955
956 .macro  END2x8_NORMAL
957         END2x8 AO, BO, 64, 16
958 .endm
959
960 .macro  END2x8_WITHOUT_ADD
961         END2x8 AO, BO, 0, 0
962 .endm
963
964 .macro  END2x8 AREG, BREG, OffsetA, OffsetB
965 .if \OffsetB != 0
966         addi  \BREG, \BREG, \OffsetB
967 .endif
968
969 .if \OffsetA != 0
970         addi  \AREG, \AREG, \OffsetA
971 .endif
972         xvf32gerpp      2, 37, 34
973         xvf32gerpp      3, 36, 34
974         xvf32gerpp      0, 33, 34
975         xvf32gerpp      1, 32, 34
976 .endm
977
978 .macro  LOAD2x8_2
979         LOAD2x8_2O 0, 0
980 .endm
981
982 .macro  LOAD2x8_2O  OffsetA, OffsetB
983         lxvp    vs34, (\OffsetB)(BO)
984         lxvp    vs32, (0+\OffsetA)(AO)
985         lxvp    vs36, (32+\OffsetA)(AO)
986         lxvp    vs38, (64+\OffsetA)(AO)
987         lxvp    vs40, (64+32+\OffsetA)(AO)
988 .endm
989
990 .macro  END2x8_2
991   /*for load2 offset will be 128 and 32*/
992         KERNEL2x8_2  AO, BO, 128, 32, 0, 1, 1
993 .endm
994
995 .macro  KERNEL2x8_E2 OffsetA, OffsetB, Index, IsLast
996         KERNEL2x8_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
997 .endm
998
999 .macro  KERNEL2x8_L2 OffsetA, OffsetB, Index, IsLast
1000         KERNEL2x8_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1001 .endm
1002
1003 .macro  KERNEL2x8_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1004         xvf32gerpp      2, 37, 35
1005         xvf32gerpp      3, 36, 35
1006         xvf32gerpp      0, 33, 35
1007         xvf32gerpp      1, 32, 35
1008
1009 .if \Complete==0
1010         lxvp    vs32, DISP16(\Index, 0+\OffsetA)(\AREG)
1011         lxvp    vs36, DISP16(\Index, 32+\OffsetA)(\AREG)
1012 .endif
1013         xvf32gerpp      2, 41, 34
1014         xvf32gerpp      3, 40, 34
1015         xvf32gerpp      0, 39, 34
1016         xvf32gerpp      1, 38, 34
1017
1018 .if \Complete==0
1019         lxvp    vs34, DISP4(\Index, \OffsetB)(\BREG)
1020         lxvp    vs38, DISP16(\Index, 64+\OffsetA)(\AREG)
1021         lxvp    vs40, DISP16(\Index, 64+32+\OffsetA)(\AREG)
1022 .endif
1023 .if \IsLast==1
1024 .if \Complete==1
1025         addi    \BREG, \BREG, DISP4(\Index, \OffsetB)
1026         addi    \AREG, \AREG, DISP16(\Index, \OffsetA)
1027 .else
1028         addi    \BREG, \BREG, DISP4(\Index, 32)
1029         addi    \AREG, \AREG, DISP16(\Index, 128)
1030 .endif
1031 .endif
1032 .endm
1033
1034 .macro  KERNEL2x8
1035         LOAD2x8
1036         END2x8  AO, BO, 64, 16
1037 .endm
1038
1039 .macro SAVE2x8
1040         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
1041         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
1042         SHUFFLE_ACC     2, vs8, vs9, vs10, vs11, vs34, vs42, vs38, vs46
1043         SHUFFLE_ACC     3, vs12, vs13, vs14, vs15, vs35, vs43, vs39, vs47
1044         add     T1, CO, LDC
1045 #ifndef TRMMKERNEL
1046         lxvp    vs24, 0(CO)
1047 #endif
1048 #ifndef TRMMKERNEL
1049         lxvp    vs26, 32(CO)
1050 #endif
1051 #ifndef TRMMKERNEL
1052         lxvp    vs28, 0(T1)
1053 #endif
1054 #ifndef TRMMKERNEL
1055         lxvp    vs30, 32(T1)
1056 #endif
1057         add     T2, CO, T4
1058         add     T3, T1, T4
1059         GROUP1
1060         AGG_GROUP1
1061         GROUP2
1062         AGG_GROUP2
1063   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1064         MULTIPLY_GROUP1
1065         MULTIPLY_GROUP2
1066 /* reconstruct r, i pairs*/
1067         RECONSTRUCT_PAIR1
1068         RECONSTRUCT_PAIR2
1069 #ifndef TRMMKERNEL
1070   /* add */
1071         xxpermdi        vs1, vs8, vs0, 2
1072         xxpermdi        vs3, vs10, vs2, 2
1073         xxpermdi        vs5, vs12, vs4, 2
1074         xxpermdi        vs7, vs14, vs6, 2
1075         xxpermdi        vs9, vs0, vs8, 2
1076         xxpermdi        vs11, vs2, vs10, 2
1077         xvaddsp vs24, vs24, vs3
1078         xvaddsp vs25, vs25, vs1
1079         xxpermdi        vs13, vs4, vs12, 2
1080         xxpermdi        vs15, vs6, vs14, 2
1081         xvaddsp vs26, vs26, vs7
1082         xvaddsp vs27, vs27, vs5
1083         xvaddsp vs28, vs28, vs11
1084         xvaddsp vs29, vs29, vs9
1085         xvaddsp vs30, vs30, vs15
1086         xvaddsp vs31, vs31, vs13
1087 #else
1088         xxpermdi        vs25, vs8, vs0, 2
1089         xxpermdi        vs24, vs10, vs2, 2
1090         xxpermdi        vs27, vs12, vs4, 2
1091         xxpermdi        vs26, vs14, vs6, 2
1092         xxpermdi        vs29, vs0, vs8, 2
1093         xxpermdi        vs28, vs2, vs10, 2
1094         xxpermdi        vs31, vs4, vs12, 2
1095         xxpermdi        vs30, vs6, vs14, 2
1096 #endif
1097         stxvp   vs24, 0(CO)
1098         stxvp   vs26, 32(CO)
1099         stxvp   vs28, 0(T1)
1100         stxvp   vs30, 32(T1)
1101         addi  CO, CO, 64
1102 .endm
1103
1104 /*                                             macros for N=2 and M=4
1105 **********************************************************************************************/
1106
1107 .macro  ZERO2x4
1108         xxsetaccz       0
1109         xxsetaccz       1
1110 .endm
1111
1112 .macro  LOAD2x4
1113         LOAD2x4O 0, 0
1114 .endm
1115
1116 .macro  LOAD2x4O  OffsetA, OffsetB
1117         lxv     vs34, (\OffsetB+0)(BO)
1118         lxvp    vs32, (\OffsetA+0)(AO)
1119 .endm
1120
1121 .macro  END2x4_NORMAL
1122         END2x4 AO, BO, 32, 16
1123 .endm
1124
1125 .macro  END2x4_WITHOUT_ADD
1126         END2x4 AO, BO, 0, 0
1127 .endm
1128
1129 .macro  END2x4 AREG, BREG, OffsetA, OffsetB
1130 .if \OffsetB != 0
1131         addi  \BREG, \BREG, \OffsetB
1132 .endif
1133 .if \OffsetA != 0
1134         addi  \AREG, \AREG, \OffsetA
1135 .endif
1136         xvf32gerpp      0, 33, 34
1137         xvf32gerpp      1, 32, 34
1138 .endm
1139
1140 .macro  LOAD2x4_2
1141         LOAD2x4_2O 0, 0
1142 .endm
1143
1144 .macro  LOAD2x4_2O  OffsetA, OffsetB
1145         lxvp    vs34, (\OffsetB)(BO)
1146         lxvp    vs32, (0+\OffsetA)(AO)
1147         lxvp    vs36, (32+\OffsetA)(AO)
1148 .endm
1149
1150 .macro  END2x4_2
1151   /*for load2 offset will be 64 and 32*/
1152         KERNEL2x4_2  AO, BO, 64, 32, 0, 1, 1
1153 .endm
1154
1155 .macro  KERNEL2x4_E2 OffsetA, OffsetB, Index, IsLast
1156         KERNEL2x4_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1157 .endm
1158
1159 .macro  KERNEL2x4_L2 OffsetA, OffsetB, Index, IsLast
1160         KERNEL2x4_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1161 .endm
1162
1163 .macro  KERNEL2x4_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1164         xvf32gerpp      0, 33, 35
1165         xvf32gerpp      1, 32, 35
1166 .if \Complete==0
1167         lxvp    vs32, DISP8(\Index, 0+\OffsetA)(\AREG)
1168 .endif
1169         xvf32gerpp      0, 37, 34
1170         xvf32gerpp      1, 36, 34
1171 .if \Complete==0
1172         lxvp    vs34, DISP4(\Index, \OffsetB)(\BREG)
1173         lxvp    vs36, DISP8(\Index, 32+\OffsetA)(\AREG)
1174 .endif
1175 .if \IsLast==1
1176 .if \Complete==1
1177         addi    \BREG, \BREG, DISP4(\Index, \OffsetB)
1178         addi    \AREG, \AREG, DISP8(\Index, \OffsetA)
1179 .else
1180         addi    \BREG, \BREG, DISP4(\Index, 32)
1181         addi    \AREG, \AREG, DISP8(\Index, 64)
1182 .endif
1183 .endif
1184 .endm
1185
1186 .macro  KERNEL2x4
1187         LOAD2x4
1188         END2x4  AO, BO, 32, 16
1189 .endm
1190
1191 .macro SAVE2x4
1192         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
1193         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
1194         add     T1, CO, LDC
1195 #ifndef TRMMKERNEL
1196         lxvp    vs24, 0(CO)
1197 #endif
1198 #ifndef TRMMKERNEL
1199         lxvp    vs26, 0(T1)
1200 #endif
1201         GROUP1
1202         AGG_GROUP1
1203   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1204         MULTIPLY_GROUP1
1205 /* reconstruct r, i pairs*/
1206         RECONSTRUCT_PAIR1
1207 #ifndef TRMMKERNEL
1208   /* add */
1209         xxpermdi        vs1, vs8, vs0, 2
1210         xxpermdi        vs3, vs10, vs2, 2
1211         xxpermdi        vs9, vs0, vs8, 2
1212         xxpermdi        vs11, vs2, vs10, 2
1213         xvaddsp vs24, vs24, vs3
1214         xvaddsp vs25, vs25, vs1
1215         xvaddsp vs26, vs26, vs11
1216         xvaddsp vs27, vs27, vs9
1217 #else
1218         xxpermdi        vs25, vs8, vs0, 2
1219         xxpermdi        vs24, vs10, vs2, 2
1220         xxpermdi        vs27, vs0, vs8, 2
1221         xxpermdi        vs26, vs2, vs10, 2
1222 #endif
1223         stxvp   vs24, 0(CO)
1224         stxvp   vs26, 0(T1)
1225         addi  CO, CO, 32
1226 .endm
1227
1228 /*                                             macros for N=2 and M=2
1229 **********************************************************************************************/
1230
1231 .macro  ZERO2x2
1232         xxsetaccz       0
1233 .endm
1234
1235 .macro  LOAD2x2
1236         LOAD2x2O 0, 0
1237 .endm
1238
1239 .macro  LOAD2x2O  OffsetA, OffsetB
1240         lxv     vs32, (\OffsetA+0)(AO)
1241         lxv     vs34, (\OffsetB+0)(BO)
1242 .endm
1243
1244 .macro  END2x2_NORMAL
1245         END2x2 AO, BO, 16, 16
1246 .endm
1247
1248 .macro  END2x2_WITHOUT_ADD
1249         END2x2 AO, BO, 0, 0
1250 .endm
1251
1252 .macro  END2x2 AREG, BREG, OffsetA, OffsetB
1253 .if \OffsetB != 0
1254         addi  \BREG, \BREG, \OffsetB
1255 .endif
1256
1257 .if \OffsetA != 0
1258         addi  \AREG, \AREG, \OffsetA
1259 .endif
1260         xvf32gerpp      0, 34, 32
1261 .endm
1262
1263 .macro  LOAD2x2_2
1264         LOAD2x2_2O 0, 0
1265 .endm
1266
1267 .macro  LOAD2x2_2O  OffsetA, OffsetB
1268         lxvp    vs32, (\OffsetA)(AO)
1269         lxvp    vs34, (0+\OffsetB)(BO)
1270 .endm
1271
1272 .macro  END2x2_2
1273   /*for load2 offset will be 32 and 32*/
1274         KERNEL2x2_2  AO, BO, 32, 32, 0, 1, 1
1275 .endm
1276
1277 .macro  KERNEL2x2_E2 OffsetA, OffsetB, Index, IsLast
1278         KERNEL2x2_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1279 .endm
1280
1281 .macro  KERNEL2x2_L2 OffsetA, OffsetB, Index, IsLast
1282         KERNEL2x2_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1283 .endm
1284
1285 .macro  KERNEL2x2_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1286         xvf32gerpp      0, 34, 32
1287         xvf32gerpp      0, 35, 33
1288 .if \Complete==0
1289         lxvp    vs32, DISP4(\Index, \OffsetA)(\AREG)
1290         lxvp    vs34, DISP4(\Index, \OffsetA)(\BREG)
1291 .endif
1292 .if \IsLast==1
1293 .if \Complete==1
1294         addi    \AREG, \AREG, DISP4(\Index, \OffsetA)
1295         addi    \BREG, \BREG, DISP4(\Index, \OffsetB)
1296 .else
1297         addi    \AREG, \AREG, DISP4(\Index, 32)
1298         addi    \BREG, \BREG, DISP4(\Index, 32)
1299 .endif
1300 .endif
1301 .endm
1302
1303 .macro  KERNEL2x2
1304         LOAD2x2
1305         END2x2  AO, BO, 16, 16
1306 .endm
1307
1308 .macro SAVE2x2
1309         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
1310         add     T1, CO, LDC
1311 #ifndef TRMMKERNEL
1312         lxv     vs24, 0(CO)
1313 #endif
1314 #ifndef TRMMKERNEL
1315         lxv     vs26, 0(T1)
1316 #endif
1317         xxperm  vs0, vs32, permute_mask
1318         xxperm  vs4, vs40, permute_mask
1319         xxperm  vs8, vs36, permute_mask
1320         xxperm  vs12, vs44, permute_mask
1321         AGGREGATE_REALS_IMAGES_A_PERMUTE vs32, vs0, vs40, vs4
1322         AGGREGATE_REALS_IMAGES_A_PERMUTE vs36, vs8, vs44, vs12
1323   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1324         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
1325         MULT_APLHA_PART1    vs36, vs44, vs8, vs9
1326         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
1327         MULT_APLHA_PART2    vs36, vs44, vs8, vs9
1328 /* reconstruct r, i pairs*/
1329         xxperm  vs0, vs1, save_permute_1
1330         xxperm  vs8, vs9, save_permute_1
1331 #ifndef TRMMKERNEL
1332   /* add */
1333         xxpermdi        vs1, vs8, vs0, 0
1334         xxpermdi        vs9, vs0, vs8, 3
1335         xvaddsp vs24, vs24, vs1
1336         xvaddsp vs26, vs26, vs9
1337 #else
1338         xxpermdi        vs24, vs8, vs0, 0
1339         xxpermdi        vs26, vs0, vs8, 3
1340 #endif
1341         stxv    vs24, 0(CO)
1342         stxv    vs26, 0(T1)
1343         addi  CO, CO, 16
1344 .endm
1345
1346 /*                                             macros for N=2 and M=1
1347 **********************************************************************************************/
1348
1349 .macro  ZERO2x1
1350         xxlxor  vs32, vs32, vs32
1351         xxlxor  vs40, vs40, vs40
1352 .endm
1353
1354 .macro  LOAD2x1
1355         LOAD2x1O 0, 0
1356 .endm
1357
1358 .macro  LOAD2x1O  OffsetA, OffsetB
1359         lxsd    v4, (\OffsetA+0)(AO)
1360         lxv     vs0, (\OffsetB+0)(BO)
1361         xxspltd  vs24, vs36, 0
1362         xxperm    vs26, vs24, permute_mask
1363 .endm
1364
1365 .macro  END2x1_NORMAL
1366         END2x1 AO, BO,8, 16
1367 .endm
1368
1369 .macro  END2x1_WITHOUT_ADD
1370         END2x1 AO, BO, 0, 0
1371 .endm
1372
1373 .macro  END2x1 AREG, BREG, OffsetA, OffsetB
1374 .if \OffsetB != 0
1375         addi  \BREG, \BREG, \OffsetB
1376 .endif
1377
1378 .if \OffsetA != 0
1379         addi  \AREG, \AREG, \OffsetA
1380 .endif
1381         xvmaddasp       vs32, vs0, vs24
1382         xvmaddasp       vs40, vs0, vs26
1383 .endm
1384
1385 .macro  LOAD2x1_2
1386         LOAD2x1_2O 0, 0
1387 .endm
1388
1389 .macro  LOAD2x1_2O  OffsetA, OffsetB
1390         lxv     vs27, (\OffsetA)(AO)
1391         lxvp    vs4, (0+\OffsetB)(BO)
1392         xxspltd  vs8, vs27, 1
1393         xxspltd  vs24, vs27, 0
1394         xxperm    vs10, vs8, permute_mask
1395         xxperm    vs26, vs24, permute_mask
1396 .endm
1397
1398 .macro  END2x1_2
1399   /*for load2 offset will be 16 and 32*/
1400         KERNEL2x1_2  AO, BO, 16, 32, 0, 1, 1
1401 .endm
1402
1403 .macro  KERNEL2x1_E2 OffsetA, OffsetB, Index, IsLast
1404         KERNEL2x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1405 .endm
1406
1407 .macro  KERNEL2x1_L2 OffsetA, OffsetB, Index, IsLast
1408         KERNEL2x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1409 .endm
1410
1411 .macro  KERNEL2x1_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1412         xvmaddasp       vs32, vs5, vs8
1413         xvmaddasp       vs40, vs5, vs10
1414 .if \Complete==0
1415         lxv     vs27, DISP2(\Index, \OffsetA)(\AREG)
1416         xxspltd  vs8, vs27, 1
1417 .endif
1418 .if \Complete==0
1419         xxperm    vs10, vs8, permute_mask
1420 .endif
1421         xvmaddasp       vs32, vs4, vs24
1422         xvmaddasp       vs40, vs4, vs26
1423 .if \Complete==0
1424         xxspltd  vs24, vs27, 0
1425         xxperm   vs26, vs24, permute_mask
1426 .endif
1427 .if \Complete==0
1428         lxvp    vs4, DISP4(\Index, 0+\OffsetB)(\BREG)
1429 .endif
1430 .if \IsLast==1
1431 .if \Complete==1
1432         addi    \AREG, \AREG, DISP2(\Index, \OffsetA)
1433         addi    \BREG, \BREG, DISP4(\Index, \OffsetB)
1434 .else
1435         addi    \AREG, \AREG, DISP2(\Index, 16)
1436         addi    \BREG, \BREG, DISP4(\Index, 32)
1437 .endif
1438 .endif
1439 .endm
1440
1441 .macro  KERNEL2x1
1442         LOAD2x1
1443         END2x1  AO, BO, 8, 16
1444 .endm
1445
1446 .macro SAVE2x1
1447         add     T1, CO, LDC
1448 #ifndef TRMMKERNEL
1449         lxsd    v4, 0(CO)
1450 #endif
1451 #ifndef TRMMKERNEL
1452         lxsd    v5, 0(T1)
1453 #endif
1454         xxperm  vs0, vs32, permute_mask
1455         xxperm  vs4, vs40, permute_mask
1456         AGGREGATE_REALS_IMAGES_A_PERMUTE vs32, vs0, vs40, vs4
1457         AGGREGATE_REALS_IMAGES_A_PERMUTE vs33, vs1, vs41, vs5
1458   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1459         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
1460         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
1461 /* reconstruct r, i pairs*/
1462         xxperm  vs0, vs1, save_permute_1
1463 #ifndef TRMMKERNEL
1464   /* add */
1465         xxspltd vs1, vs0, 0
1466         xxspltd vs3, vs0, 1
1467  /*--v4==vs36 v5==vs37---*/
1468         xvaddsp vs36, vs36, vs1
1469         xvaddsp vs37, vs37, vs3
1470 #else
1471  /*--v4==vs36 v5==vs37---*/
1472         xxspltd vs36, vs0, 0
1473         xxspltd vs37, vs0, 1
1474 #endif
1475         stxsd   v4, 0(CO)
1476         stxsd   v5, 0(T1)
1477         addi  CO, CO, 8
1478 .endm
1479
1480 /*                                             macros for N=1 and M=8
1481 **********************************************************************************************/
1482
1483 .macro  ZERO1x8
1484         xxsetaccz       0
1485         xxsetaccz       1
1486         xxsetaccz       2
1487         xxsetaccz       3
1488 .endm
1489
1490 .macro  LOAD1x8
1491         LOAD1x8O 0, 0
1492 .endm
1493
1494 .macro  LOAD1x8O  OffsetA, OffsetB
1495         lxsd    v2, (\OffsetB+0)(BO)
1496         lxvp    vs32, (\OffsetA+0)(AO)
1497         lxvp    vs36, (\OffsetA+32)(AO)
1498 .endm
1499
1500 .macro  END1x8_NORMAL
1501         END1x8 AO, BO, 64,8
1502 .endm
1503
1504 .macro  END1x8_WITHOUT_ADD
1505         END1x8 AO, BO, 0, 0
1506 .endm
1507
1508 .macro  END1x8 AREG, BREG, OffsetA, OffsetB
1509 .if \OffsetB != 0
1510         addi  \BREG, \BREG, \OffsetB
1511 .endif
1512
1513 .if \OffsetA != 0
1514         addi  \AREG, \AREG, \OffsetA
1515 .endif
1516         xvf32gerpp          0, 34, 33
1517         xvf32gerpp          1, 34, 32
1518         xvf32gerpp          2, 34, 37
1519         xvf32gerpp          3, 34, 36
1520 .endm
1521
1522 .macro  LOAD1x8_2
1523         LOAD1x8_2O 0, 0
1524 .endm
1525
1526 .macro  LOAD1x8_2O  OffsetA, OffsetB
1527         lxv     vs34, (\OffsetB)(BO)
1528         lxvp    vs32, (0+\OffsetA)(AO)
1529         lxvp    vs36, (32+\OffsetA)(AO)
1530         vspltisb        v10, 0
1531         xxpermdi        vs35, vs34, vs42, 0
1532         xxpermdi        vs34, vs34, vs42, 2
1533         lxvp    vs38, (64+\OffsetA)(AO)
1534         lxvp    vs40, (64+32+\OffsetA)(AO)
1535 .endm
1536
1537 .macro  END1x8_2
1538   /*for load2 offset will be 128 and 16*/
1539         KERNEL1x8_2  AO, BO, 128, 16, 0, 1, 1
1540 .endm
1541
1542 .macro  KERNEL1x8_E2 OffsetA, OffsetB, Index, IsLast
1543         KERNEL1x8_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1544 .endm
1545
1546 .macro  KERNEL1x8_L2 OffsetA, OffsetB, Index, IsLast
1547         KERNEL1x8_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1548 .endm
1549
1550 .macro  KERNEL1x8_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1551         xvf32gerpp          0, 34, 33
1552         xvf32gerpp          1, 34, 32
1553 .if \Complete==0
1554         lxvp    vs32, DISP16(\Index, 0+\OffsetA)(\AREG)
1555 .endif
1556         xvf32gerpp          2, 34, 37
1557         xvf32gerpp          3, 34, 36
1558 .if \Complete==0
1559         lxvp    vs36, DISP16(\Index, 32+\OffsetA)(\AREG)
1560 .endif
1561         xvf32gerpp          0, 35, 39
1562         xvf32gerpp          1, 35, 38
1563 .if \Complete==0
1564         lxvp    vs38, DISP16(\Index, 64+\OffsetA)(\AREG)
1565 .endif
1566         xvf32gerpp          2, 35, 41
1567         xvf32gerpp          3, 35, 40
1568 .if \Complete==0
1569         lxv     vs34, DISP2(\Index, \OffsetB)(\BREG)
1570         xxpermdi        vs35, vs34, vs42, 0
1571         xxpermdi        vs34, vs34, vs42, 2
1572         lxvp    vs40, DISP16(\Index, 64+32+\OffsetA)(\AREG)
1573 .endif
1574 .if \IsLast==1
1575 .if \Complete==1
1576         addi    \BREG, \BREG, DISP2(\Index, \OffsetB)
1577         addi    \AREG, \AREG, DISP16(\Index, \OffsetA)
1578 .else
1579         addi    \BREG, \BREG, DISP2(\Index, 16)
1580         addi    \AREG, \AREG, DISP16(\Index, 128)
1581 .endif
1582 .endif
1583 .endm
1584
1585 .macro  KERNEL1x8
1586         LOAD1x8
1587         END1x8  AO, BO, 64,8
1588 .endm
1589
1590 .macro SAVE1x8
1591         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
1592         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
1593         SHUFFLE_ACC     2, vs8, vs9, vs10, vs11, vs34, vs42, vs38, vs46
1594         SHUFFLE_ACC     3, vs12, vs13, vs14, vs15, vs35, vs43, vs39, vs47
1595         xxpermdi        vs32, vs32, vs36, 0
1596         xxpermdi        vs33, vs33, vs37, 0
1597         xxpermdi        vs34, vs34, vs38, 0
1598         xxpermdi        vs35, vs35, vs39, 0
1599         xxpermdi        vs40, vs40, vs44, 0
1600         xxperm vs40, vs40, permute_mask
1601         xxpermdi        vs41, vs41, vs45, 0
1602         xxperm vs41, vs41, permute_mask
1603         xxpermdi        vs42, vs42, vs46, 0
1604         xxperm vs42, vs42, permute_mask
1605         xxpermdi        vs43, vs43, vs47, 0
1606         xxperm vs43, vs43, permute_mask
1607 #ifndef TRMMKERNEL
1608         lxvp    vs24, 0(CO)
1609 #endif
1610         xxperm  vs0, vs32, permute_mask
1611         xxperm  vs4, vs40, permute_mask
1612 #ifndef TRMMKERNEL
1613         lxvp    vs26, 32(CO)
1614 #endif
1615         xxperm  vs1, vs33, permute_mask
1616         xxperm  vs5, vs41, permute_mask
1617         xxperm  vs2, vs34, permute_mask
1618         xxperm  vs6, vs42, permute_mask
1619         xxperm  vs3, vs35, permute_mask
1620         xxperm  vs7, vs43, permute_mask
1621         AGGREGATE_REALS_IMAGES  vs32, vs0, vs40, vs4
1622         AGGREGATE_REALS_IMAGES  vs33, vs1, vs41, vs5
1623         AGGREGATE_REALS_IMAGES  vs34, vs2, vs42, vs6
1624         AGGREGATE_REALS_IMAGES  vs35, vs3, vs43, vs7
1625   /*inner reverse save_permute and store vs28 */
1626         xxpermdi        vs28,save_permute_1,save_permute_1, 2
1627   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1628         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
1629         MULT_APLHA_PART1    vs33, vs41, vs2, vs3
1630         MULT_APLHA_PART1    vs34, vs42, vs4, vs5
1631         MULT_APLHA_PART1    vs35, vs43, vs6, vs7
1632         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
1633         MULT_APLHA_PART2    vs33, vs41, vs2, vs3
1634         MULT_APLHA_PART2    vs34, vs42, vs4, vs5
1635         MULT_APLHA_PART2    vs35, vs43, vs6, vs7
1636 /* reconstruct r, i pairs*/
1637         xxperm  vs0, vs1, vs28
1638         xxperm  vs2, vs3, vs28
1639         xxperm  vs4, vs5, vs28
1640         xxperm  vs6, vs7, vs28
1641 #ifndef TRMMKERNEL
1642   /* add */
1643         xvaddsp vs24, vs24, vs2
1644         xvaddsp vs25, vs25, vs0
1645         xvaddsp vs26, vs26, vs6
1646         xvaddsp vs27, vs27, vs4
1647         stxvp   vs24, 0(CO)
1648         stxvp   vs26, 32(CO)
1649 #else
1650 /* reconstruct r, i pairs*/
1651         stxv    vs0, 0(CO)
1652         stxv    vs2, 16(CO)
1653         stxv    vs4, 32(CO)
1654         stxv    vs6, 48(CO)
1655 #endif
1656         addi  CO, CO, 64
1657 .endm
1658
1659 /*                                             macros for N=1 and M=4
1660 **********************************************************************************************/
1661
1662 .macro  ZERO1x4
1663         xxsetaccz       0
1664         xxsetaccz       1
1665 .endm
1666
1667 .macro  LOAD1x4
1668         LOAD1x4O 0, 0
1669 .endm
1670
1671 .macro  LOAD1x4O  OffsetA, OffsetB
1672         lxsd    v2, (\OffsetB+0)(BO)
1673         lxvp    vs32, (\OffsetA+0)(AO)
1674 .endm
1675
1676 .macro  END1x4_NORMAL
1677         END1x4 AO, BO, 32,8
1678 .endm
1679
1680 .macro  END1x4_WITHOUT_ADD
1681         END1x4 AO, BO, 0, 0
1682 .endm
1683
1684 .macro  END1x4 AREG, BREG, OffsetA, OffsetB
1685 .if \OffsetB != 0
1686         addi  \BREG, \BREG, \OffsetB
1687 .endif
1688
1689 .if \OffsetA != 0
1690         addi  \AREG, \AREG, \OffsetA
1691 .endif
1692         xvf32gerpp          0, 34, 33
1693         xvf32gerpp          1, 34, 32
1694 .endm
1695
1696 .macro  LOAD1x4_2
1697         LOAD1x4_2O 0, 0
1698 .endm
1699
1700 .macro  LOAD1x4_2O  OffsetA, OffsetB
1701         lxv     vs34, (\OffsetB)(BO)
1702         lxvp    vs32, (0+\OffsetA)(AO)
1703         vspltisb        v6, 0
1704         xxpermdi        vs35, vs34, vs38, 0
1705         xxpermdi        vs34, vs34, vs38, 2
1706         lxvp    vs36, (32+\OffsetA)(AO)
1707 .endm
1708
1709 .macro  END1x4_2
1710   /*for load2 offset will be 64 and 16*/
1711         KERNEL1x4_2  AO, BO, 64, 16, 0, 1, 1
1712 .endm
1713
1714 .macro  KERNEL1x4_E2 OffsetA, OffsetB, Index, IsLast
1715         KERNEL1x4_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1716 .endm
1717
1718 .macro  KERNEL1x4_L2 OffsetA, OffsetB, Index, IsLast
1719         KERNEL1x4_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1720 .endm
1721
1722 .macro  KERNEL1x4_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1723         xvf32gerpp          0, 34, 33
1724         xvf32gerpp          1, 34, 32
1725 .if \Complete==0
1726         lxvp    vs32, DISP8(\Index, 0+\OffsetA)(\AREG)
1727 .endif
1728         xvf32gerpp          0, 35, 37
1729         xvf32gerpp          1, 35, 36
1730 .if \Complete==0
1731         lxv     vs34, DISP2(\Index, \OffsetB)(\BREG)
1732         xxpermdi        vs35, vs34, vs38, 0
1733         xxpermdi        vs34, vs34, vs38, 2
1734         lxvp    vs36, DISP8(\Index, 32+\OffsetA)(\AREG)
1735 .endif
1736 .if \IsLast==1
1737 .if \Complete==1
1738         addi    \BREG, \BREG, DISP2(\Index, \OffsetB)
1739         addi    \AREG, \AREG, DISP8(\Index, \OffsetA)
1740 .else
1741         addi    \BREG, \BREG, DISP2(\Index, 16)
1742         addi    \AREG, \AREG, DISP8(\Index, 64)
1743 .endif
1744 .endif
1745 .endm
1746
1747 .macro  KERNEL1x4
1748         LOAD1x4
1749         END1x4  AO, BO, 32,8
1750 .endm
1751
1752 .macro SAVE1x4
1753         SHUFFLE_ACC     0, vs0, vs1, vs2, vs3, vs32, vs40, vs36, vs44
1754         SHUFFLE_ACC     1, vs4, vs5, vs6, vs7, vs33, vs41, vs37, vs45
1755         xxpermdi        vs32, vs32, vs36, 0
1756         xxpermdi        vs40, vs40, vs44, 0
1757         xxpermdi        vs33, vs33, vs37, 0
1758         xxpermdi        vs41, vs41, vs45, 0
1759         xxperm vs40, vs40, permute_mask
1760         xxperm vs41, vs41, permute_mask
1761 #ifndef TRMMKERNEL
1762         lxvp    vs24, 0(CO)
1763 #endif
1764         xxperm  vs0, vs32, permute_mask
1765         xxperm  vs4, vs40, permute_mask
1766         xxperm  vs1, vs33, permute_mask
1767         xxperm  vs5, vs41, permute_mask
1768         AGGREGATE_REALS_IMAGES  vs32, vs0, vs40, vs4
1769         AGGREGATE_REALS_IMAGES  vs33, vs1, vs41, vs5
1770   /*inner reverse save_permute and store vs28 */
1771         xxpermdi        vs28,save_permute_1,save_permute_1, 2
1772   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1773         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
1774         MULT_APLHA_PART1    vs33, vs41, vs2, vs3
1775         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
1776         MULT_APLHA_PART2    vs33, vs41, vs2, vs3
1777 /* reconstruct r, i pairs*/
1778         xxperm  vs0, vs1, vs28
1779         xxperm  vs2, vs3, vs28
1780 #ifndef TRMMKERNEL
1781   /* add */
1782         xvaddsp vs24, vs24, vs2
1783         xvaddsp vs25, vs25, vs0
1784         stxvp   vs24, 0(CO)
1785 #else
1786 /* reconstruct r, i pairs*/
1787         stxv    vs0, 0(CO)
1788         stxv    vs2, 16(CO)
1789 #endif
1790         addi  CO, CO, 32
1791 .endm
1792
1793 /*                                             macros for N=1 and M=2
1794 **********************************************************************************************/
1795
1796 .macro  ZERO1x2
1797         xxlxor  vs32, vs32, vs32
1798         xxlxor  vs40, vs40, vs40
1799 .endm
1800
1801 .macro  LOAD1x2
1802         LOAD1x2O 0, 0
1803 .endm
1804
1805 .macro  LOAD1x2O  OffsetA, OffsetB
1806         lxsd    vs4, (\OffsetB+0)(BO)
1807         lxv     vs0, (\OffsetA+0)(AO)
1808         xxspltd   vs24, vs36, 0
1809         xxperm    vs26, vs24, permute_mask
1810 .endm
1811
1812 .macro  END1x2_NORMAL
1813         END1x2 AO, BO, 16,8
1814 .endm
1815
1816 .macro  END1x2_WITHOUT_ADD
1817         END1x2 AO, BO, 0, 0
1818 .endm
1819
1820 .macro  END1x2 AREG, BREG, OffsetA, OffsetB
1821 .if \OffsetB != 0
1822         addi  \BREG, \BREG, \OffsetB
1823 .endif
1824 .if \OffsetA != 0
1825         addi  \AREG, \AREG, \OffsetA
1826 .endif
1827         xvmaddasp       vs32, vs0, vs24
1828         xvmaddasp       vs40, vs0, vs26
1829 .endm
1830
1831 .macro  LOAD1x2_2
1832         LOAD1x2_2O 0, 0
1833 .endm
1834
1835 .macro  LOAD1x2_2O  OffsetA, OffsetB
1836         lxv     vs27, (\OffsetB)(BO)
1837         lxvp    vs4, (0+\OffsetA)(AO)
1838         xxspltd  vs8, vs27, 1
1839         xxspltd  vs24, vs27, 0
1840         xxperm    vs10, vs8, permute_mask
1841         xxperm    vs26, vs24, permute_mask
1842 .endm
1843
1844 .macro  END1x2_2
1845   /*for load2 offset will be 32 and 16*/
1846         KERNEL1x2_2  AO, BO, 32, 16, 0, 1, 1
1847 .endm
1848
1849 .macro  KERNEL1x2_E2 OffsetA, OffsetB, Index, IsLast
1850         KERNEL1x2_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1851 .endm
1852
1853 .macro  KERNEL1x2_L2 OffsetA, OffsetB, Index, IsLast
1854         KERNEL1x2_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1855 .endm
1856
1857 .macro  KERNEL1x2_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1858 .if \Complete==0
1859         lxv     vs27, DISP2(\Index, \OffsetB)(\BREG)
1860 .endif
1861         xvmaddasp       vs32, vs5, vs8
1862         xvmaddasp       vs40, vs5, vs10
1863
1864 .if \Complete==0
1865         xxspltd  vs8, vs27, 1
1866         xxperm    vs10, vs8, permute_mask
1867 .endif
1868         xvmaddasp       vs32, vs4, vs24
1869         xvmaddasp       vs40, vs4, vs26
1870 .if \Complete==0
1871         lxvp    vs4, DISP4(\Index, 0+\OffsetA)(\AREG)
1872 .endif
1873
1874 .if \Complete==0
1875         xxspltd  vs24, vs27, 0
1876         xxperm    vs26, vs24, permute_mask
1877 .endif
1878 .if \IsLast==1
1879 .if \Complete==1
1880         addi    \BREG, \BREG, DISP2(\Index, \OffsetB)
1881         addi    \AREG, \AREG, DISP4(\Index, \OffsetA)
1882 .else
1883         addi    \BREG, \BREG, DISP2(\Index, 16)
1884         addi    \AREG, \AREG, DISP4(\Index, 32)
1885 .endif
1886 .endif
1887 .endm
1888
1889 .macro  KERNEL1x2
1890         LOAD1x2
1891         END1x2  AO, BO, 16,8
1892 .endm
1893
1894 .macro SAVE1x2
1895 #ifndef TRMMKERNEL
1896         lxv     vs24, 0(CO)
1897 #endif
1898         xxperm  vs0, vs32, permute_mask
1899         xxperm  vs4, vs40, permute_mask
1900         AGGREGATE_REALS_IMAGES  vs32, vs0, vs40, vs4
1901   /*inner reverse save_permute and store vs28 */
1902         xxpermdi        vs28,save_permute_1,save_permute_1, 2
1903   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
1904         MULT_APLHA_PART1    vs32, vs40, vs0, vs1
1905         MULT_APLHA_PART2    vs32, vs40, vs0, vs1
1906 /* reconstruct r, i pairs*/
1907         xxperm  vs0, vs1, vs28
1908 #ifndef TRMMKERNEL
1909   /* add */
1910         xvaddsp vs24, vs24, vs0
1911         stxv    vs24, 0(CO)
1912 #else
1913 /* reconstruct r, i pairs*/
1914         stxv    vs0, 0(CO)
1915 #endif
1916         addi  CO, CO, 16
1917 .endm
1918
1919 /*                                             macros for N=1 and M=1
1920 **********************************************************************************************/
1921 .macro  ZERO1x1
1922         xxlxor  vs32, vs32, vs32
1923         xxlxor  vs40, vs40, vs40
1924 .endm
1925
1926 .macro  LOAD1x1
1927         LOAD1x1O 0, 0
1928 .endm
1929
1930 .macro  LOAD1x1O  OffsetA, OffsetB
1931         lxsd    v4, (\OffsetB+0)(BO)
1932         lxsd    v5, (\OffsetA+0)(AO)
1933         xxperm    vs38, vs36, permute_mask
1934 .endm
1935
1936 .macro  END1x1_NORMAL
1937         END1x1 AO, BO,8,8
1938 .endm
1939
1940 .macro  END1x1_WITHOUT_ADD
1941         END1x1 AO, BO, 0, 0
1942 .endm
1943
1944 .macro  END1x1 AREG, BREG, OffsetA, OffsetB
1945 .if \OffsetB != 0
1946         addi  \BREG, \BREG, \OffsetB
1947 .endif
1948 .if \OffsetA != 0
1949         addi  \AREG, \AREG, \OffsetA
1950 .endif
1951         xvmaddasp       vs32, vs37, vs36
1952         xvmaddasp       vs40, vs37, vs38
1953 .endm
1954
1955 .macro  LOAD1x1_2
1956         LOAD1x1_2O 0, 0
1957 .endm
1958
1959 .macro  LOAD1x1_2O  OffsetA, OffsetB
1960         lxv     vs8, (\OffsetB)(BO)
1961         lxv     vs4, (0+\OffsetA)(AO)
1962         xxperm    vs10, vs8, permute_mask
1963 .endm
1964
1965 .macro  END1x1_2
1966   /*for load2 offset will be 16 and 16*/
1967         KERNEL1x1_2  AO, BO, 16, 16, 0, 1, 1
1968 .endm
1969
1970 .macro  KERNEL1x1_E2 OffsetA, OffsetB, Index, IsLast
1971         KERNEL1x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 1
1972 .endm
1973
1974 .macro  KERNEL1x1_L2 OffsetA, OffsetB, Index, IsLast
1975         KERNEL1x1_2 AO, BO, \OffsetA, \OffsetB, \Index, \IsLast, 0
1976 .endm
1977
1978 .macro  KERNEL1x1_2  AREG, BREG, OffsetA, OffsetB, Index, IsLast, Complete
1979         xvmaddasp       vs32, vs4, vs8
1980         xvmaddasp       vs40, vs4, vs10
1981 .if \Complete==0
1982         lxv     vs8, DISP2(\Index, \OffsetB)(\BREG)
1983         lxv     vs4, DISP2(\Index, \OffsetB)(\AREG)
1984         xxperm    vs10, vs8, permute_mask
1985 .endif
1986 .if \IsLast==1
1987 .if \Complete==1
1988         addi    \BREG, \BREG, DISP2(\Index, \OffsetB)
1989         addi    \AREG, \AREG, DISP2(\Index, \OffsetA)
1990 .else
1991         addi    \BREG, \BREG, DISP2(\Index, 16)
1992         addi    \AREG, \AREG, DISP2(\Index, 16)
1993 .endif
1994 .endif
1995 .endm
1996
1997 .macro  KERNEL1x1
1998         LOAD1x1
1999         END1x1  AO, BO, 8,8
2000 .endm
2001
2002 .macro SAVE1x1
2003 #ifndef TRMMKERNEL
2004         lxsd    v4, 0(CO)
2005 #endif
2006   /*aggregate x2*/
2007         xxpermdi        vs33, vs32, vs32, 2
2008         xxpermdi        vs41, vs40, vs40, 2
2009         xvaddsp vs32, vs32, vs33
2010         xvaddsp vs40, vs40, vs41
2011
2012         xxperm  vs0, vs32, permute_mask
2013         xxperm  vs4, vs40, permute_mask
2014         AGGREGATE_REALS_IMAGES  vs32, vs0, vs40, vs4
2015   /*inner reverse save_permute and store vs28 */
2016         xxpermdi        vs28,save_permute_1,save_permute_1, 2
2017   /*VSINRR, VSINII, VSOUT1, VSOUT2*/
2018         MULT_APLHA_PART1    vs32, vs40, vs37, vs1
2019         MULT_APLHA_PART2    vs32, vs40, vs37, vs1
2020 /* reconstruct r, i pairs*/
2021         xxperm  vs37, vs1, vs28
2022 #ifndef TRMMKERNEL
2023   /* add */
2024         xvaddsp vs36, vs36, vs37
2025         stxsd   v4, 0(CO)
2026 #else
2027 /* vs37 is v5 */
2028         stxsd   v5, 0(CO)
2029 #endif
2030         addi  CO, CO, 8
2031 .endm
2032
2033 /****************************TRMM POINTER REFRESH MACROSES*************************/
2034 .macro SHIFT_REG        REG1,REG2,SHIFT_VAL
2035 .if \SHIFT_VAL==16
2036         slwi            \REG1, \REG2, 7
2037 .elseif \SHIFT_VAL==8
2038         slwi            \REG1, \REG2, 6
2039 .elseif \SHIFT_VAL==4
2040         slwi            \REG1, \REG2, 5
2041 .elseif \SHIFT_VAL==2
2042         slwi            \REG1, \REG2, 4
2043 .elseif \SHIFT_VAL==1
2044         slwi            \REG1, \REG2, 3
2045 .endif
2046 .endm
2047
2048 /*
2049 //#if (defined(LEFT) &&  defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
2050 //              ptrbb = bb;
2051 // #else
2052 //              ptrba += off*8;
2053 //              ptrbb = bb + off*4;
2054 // #endif
2055 */
2056 .macro REFRESH_POINTERS  PTR_A,PTR_B, OFF_VAL, B_VAL, C_A, C_B
2057 #if (defined(LEFT) &&  defined(TRANSA)) ||  (!defined(LEFT) && !defined(TRANSA))
2058 /* ptrbb = bb;*/
2059         mr \PTR_B, \B_VAL     /* refresh BPOINT */
2060 #else
2061 /*
2062 // ptrba  =ptrba+ off*C_A;
2063 // ptrbb = bb + off*C_B;
2064 */
2065         SHIFT_REG T4, \OFF_VAL, \C_B    /* Number of values in B shifted  */
2066         SHIFT_REG T2, \OFF_VAL, \C_A    /* Number of values in A shifted  */
2067         add     \PTR_B, \B_VAL, T4      /* Add values to BO */
2068         add     \PTR_A, \PTR_A, T2      /* Add values to AO  */
2069 #endif
2070 .endm
2071
2072 /*
2073 // #if (defined(LEFT) && !defined(TRANSA)) || (!defined(LEFT) && defined(TRANSA))
2074 //              temp = bk-off;
2075 // #elif defined(LEFT)
2076 //              temp = off+8;   // number of values in A
2077 // #else
2078 //              temp = off+4;   // number of values in B
2079 // #endif
2080 */
2081 .macro REFRESH_TEMP_BK TEMP_BK, BK_VAL, OFF_VAL, INCR_A, INCR_B
2082     #if (defined(LEFT) && !defined(TRANSA)) ||  (!defined(LEFT) && defined(TRANSA))
2083         /* temp = bk-off;*/
2084         sub \TEMP_BK, \BK_VAL, \OFF_VAL
2085     #elif defined(LEFT)
2086         /* temp = off+INCR_A;   // number of values in A */
2087         addi \TEMP_BK, \OFF_VAL, \INCR_A
2088     #else
2089         /* temp = off+INCR_B    // number of values in B*/
2090         addi \TEMP_BK, \OFF_VAL, \INCR_B
2091     #endif
2092 .endm
2093 /*
2094 // #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
2095 //              temp = bk - off;
2096 // #ifdef LEFT
2097 //              temp -= 8; // number of values in A
2098 // #else
2099 //              temp -= 4; // number of values in B
2100 // #endif
2101 //              ptrba += temp*8;
2102 //              ptrbb += temp*4;
2103 // #endif
2104
2105 // #ifdef LEFT
2106 //              off += 8; // number of values in A
2107 // #endif
2108 */
2109 .macro REFRESH_AFTER_SAVE TEMP_BK, BK_VAL, OFF_VAL,PTR_B,PTR_A, C_A, C_B
2110     #if ( defined(LEFT) && defined(TRANSA)) || (!defined(LEFT) && !defined(TRANSA))
2111         /*temp = bk - off;*/
2112         sub \TEMP_BK, \BK_VAL, \OFF_VAL
2113     #ifdef LEFT
2114         /*temp -= 8; // number of values in A*/
2115         addi \TEMP_BK, \TEMP_BK,-\C_A
2116     #else
2117         /*temp -= 4; // number of values in B*/
2118         addi \TEMP_BK, \TEMP_BK,-\C_B
2119     #endif
2120         /*ptrba += temp*C_A;
2121         ptrbb += temp*C_B;*/
2122         SHIFT_REG T4, \TEMP_BK, \C_A
2123         SHIFT_REG T2, \TEMP_BK, \C_B
2124         add \PTR_A, \PTR_A, T4/*ptrba+temp*C_A*/
2125         add \PTR_B, \PTR_B, T2
2126     #endif
2127     #ifdef LEFT
2128         /*off += 8; // number of values in A*/
2129         addi \OFF_VAL, \OFF_VAL, \C_A
2130     #endif
2131 .endm