1/*********************************************************************/
2/*                                                                   */
3/*             Optimized BLAS libraries                              */
4/*                     By Kazushige Goto <kgoto@tacc.utexas.edu>     */
5/*                                                                   */
6/* Copyright (c) The University of Texas, 2009. All rights reserved. */
7/* UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING  */
8/* THIS SOFTWARE AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF      */
9/* MERCHANTABILITY, FITNESS FOR ANY PARTICULAR PURPOSE,              */
10/* NON-INFRINGEMENT AND WARRANTIES OF PERFORMANCE, AND ANY WARRANTY  */
11/* THAT MIGHT OTHERWISE ARISE FROM COURSE OF DEALING OR USAGE OF     */
12/* TRADE. NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH RESPECT TO   */
13/* THE USE OF THE SOFTWARE OR DOCUMENTATION.                         */
14/* Under no circumstances shall University be liable for incidental, */
15/* special, indirect, direct or consequential damages or loss of     */
16/* profits, interruption of business, or related expenses which may  */
17/* arise from use of Software or Documentation, including but not    */
18/* limited to those resulting from defects in Software and/or        */
19/* Documentation, or loss or inaccuracy of data of any kind.         */
20/*********************************************************************/
21
22#define ASSEMBLER
23#include "common.h"
24
25#define N	r3
26#define X	r4
27#define INCX	r5
28
29#define PREA	r8
30#define	INCXM1	r9
31
32#define FZERO	f1
33
34#define STACKSIZE 160
35
36	PROLOGUE
37	PROFCODE
38
39	addi	SP, SP, -STACKSIZE
40	li	r0,   0
41
42	stfd	f14,    0(SP)
43	stfd	f15,    8(SP)
44	stfd	f16,   16(SP)
45	stfd	f17,   24(SP)
46
47	stfd	f18,   32(SP)
48	stfd	f19,   40(SP)
49	stfd	f20,   48(SP)
50	stfd	f21,   56(SP)
51
52	stfd	f22,   64(SP)
53	stfd	f23,   72(SP)
54	stfd	f24,   80(SP)
55	stfd	f25,   88(SP)
56
57	stfd	f26,   96(SP)
58	stfd	f27,  104(SP)
59	stfd	f28,  112(SP)
60	stfd	f29,  120(SP)
61
62	stfd	f30,  128(SP)
63	stfd	f31,  136(SP)
64
65	stw	r0,   144(SP)
66	lfs	FZERO,144(SP)
67
68#ifdef F_INTERFACE
69	LDINT	N,    0(N)
70	LDINT	INCX, 0(INCX)
71#endif
72
73	slwi	INCX, INCX, ZBASE_SHIFT
74	subi	INCXM1, INCX, SIZE
75
76	li	PREA, 10 * 16 * SIZE
77
78	cmpwi	cr0, N, 0
79	ble-	LL(9999)
80	cmpwi	cr0, INCX, 0
81	ble-	LL(9999)
82
83	LFD	f1, 0 * SIZE(X)
84	LFD	f2, 1 * SIZE(X)
85	add	X, X, INCX
86
87	fabs	f1, f1
88	fabs	f2, f2
89	fadd	f1, f1, f2
90
91	fmr	f0, f1
92	fmr	f2, f1
93	fmr	f3, f1
94
95	subi	N, N, 1
96
97	cmpwi	cr0, INCX, 2 * SIZE
98	bne-	cr0, LL(100)
99
100	srawi.	r0, N, 3
101	mtspr	CTR, r0
102	beq-	cr0, LL(50)
103	.align 4
104
105	LFD	f24,   0 * SIZE(X)
106	LFD	f25,   1 * SIZE(X)
107
108	fabs	f8,  f24
109	LFD	f26,   2 * SIZE(X)
110	fabs	f9,  f25
111	LFD	f27,   3 * SIZE(X)
112	fabs	f10, f26
113	LFD	f28,   4 * SIZE(X)
114	fabs	f11, f27
115	LFD	f29,   5 * SIZE(X)
116	fabs	f12, f28
117	LFD	f30,   6 * SIZE(X)
118	fabs	f13, f29
119	LFD	f31,   7 * SIZE(X)
120	fabs	f14, f30
121	nop
122	fabs	f15, f31
123	bdz	LL(20)
124	.align 4
125
126LL(10):
127	fadd	f4,  f8,  f9
128	dcbt	X, PREA
129	fadd	f5,  f10, f11
130	nop
131	fadd	f6,  f12, f13
132	LFD	f24,   8 * SIZE(X)
133	fadd	f7,  f14, f15
134	LFD	f25,   9 * SIZE(X)
135
136	fabs	f8,  f24
137	LFD	f26,  10 * SIZE(X)
138	fabs	f9,  f25
139	LFD	f27,  11 * SIZE(X)
140	fabs	f10, f26
141	fabs	f11, f27
142
143	fsub	f16, f0,  f4
144	fsub	f17, f1,  f5
145	fsub	f18, f2,  f6
146	LFD	f28,  12 * SIZE(X)
147	fsub	f19, f3,  f7
148	LFD	f29,  13 * SIZE(X)
149
150	fabs	f12, f28
151	LFD	f30,  14 * SIZE(X)
152	fabs	f13, f29
153	LFD	f31,  15 * SIZE(X)
154	fabs	f14, f30
155	fabs	f15, f31
156
157	fsel	f0,  f16, f4, f0
158	fsel	f1,  f17, f5, f1
159	fsel	f2,  f18, f6, f2
160	fsel	f3,  f19, f7, f3
161
162	fadd	f20, f8,  f9
163	fadd	f21, f10, f11
164	fadd	f22, f12, f13
165	LFD	f24,  16 * SIZE(X)
166	fadd	f23, f14, f15
167	LFD	f25,  17 * SIZE(X)
168
169	fabs	f8,  f24
170	LFD	f26,  18 * SIZE(X)
171	fabs	f9,  f25
172	LFD	f27,  19 * SIZE(X)
173	fabs	f10, f26
174	fabs	f11, f27
175
176	fsub	f16, f0,  f20
177	fsub	f17, f1,  f21
178	fsub	f18, f2,  f22
179	LFD	f28,  20 * SIZE(X)
180	fsub	f19, f3,  f23
181	LFD	f29,  21 * SIZE(X)
182
183	fabs	f12, f28
184	LFD	f30,  22 * SIZE(X)
185	fabs	f13, f29
186	LFD	f31,  23 * SIZE(X)
187	fabs	f14, f30
188	addi	X, X, 16 * SIZE
189	fabs	f15, f31
190
191	fsel	f0,  f16, f20, f0
192	fsel	f1,  f17, f21, f1
193	fsel	f2,  f18, f22, f2
194	fsel	f3,  f19, f23, f3
195
196	bdnz	LL(10)
197	.align 4
198
199LL(20):
200	fadd	f4,  f8,  f9
201	fadd	f5,  f10, f11
202	fadd	f6,  f12, f13
203	LFD	f24,   8 * SIZE(X)
204	fadd	f7,  f14, f15
205	LFD	f25,   9 * SIZE(X)
206
207	fabs	f8,  f24
208	LFD	f26,  10 * SIZE(X)
209	fabs	f9,  f25
210	LFD	f27,  11 * SIZE(X)
211	fabs	f10, f26
212	fabs	f11, f27
213
214	fsub	f16, f0,  f4
215	fsub	f17, f1,  f5
216	fsub	f18, f2,  f6
217	LFD	f28,  12 * SIZE(X)
218	fsub	f19, f3,  f7
219	LFD	f29,  13 * SIZE(X)
220
221	fabs	f12, f28
222	LFD	f30,  14 * SIZE(X)
223	fabs	f13, f29
224	LFD	f31,  15 * SIZE(X)
225	fabs	f14, f30
226	fabs	f15, f31
227
228	fsel	f0,  f16, f4, f0
229	fsel	f1,  f17, f5, f1
230	fsel	f2,  f18, f6, f2
231	fsel	f3,  f19, f7, f3
232
233	fadd	f20, f8,  f9
234	fadd	f21, f10, f11
235	fadd	f22, f12, f13
236	fadd	f23, f14, f15
237
238	fsub	f16, f0,  f20
239	fsub	f17, f1,  f21
240	fsub	f18, f2,  f22
241	fsub	f19, f3,  f23
242
243	fsel	f0,  f16, f20, f0
244	fsel	f1,  f17, f21, f1
245	fsel	f2,  f18, f22, f2
246	fsel	f3,  f19, f23, f3
247	addi	X, X, 16 * SIZE
248
249	.align 4
250
251LL(50):
252	andi.	r0,  N, 7
253	mtspr	CTR, r0
254	beq	LL(999)
255	.align 4
256
257LL(60):
258	LFD	f8,  0 * SIZE(X)
259	LFD	f9,  1 * SIZE(X)
260	addi	X, X,  2 * SIZE
261
262	fabs	f8, f8
263	fabs	f9, f9
264	fadd	f8, f8, f9
265	fsub	f16, f1, f8
266	fsel	f1, f16, f8, f1
267	bdnz	LL(60)
268	b	LL(999)
269	.align 4
270
271LL(100):
272	sub	X, X, INCXM1
273
274	srawi.	r0, N, 3
275	mtspr	CTR,  r0
276	beq-	LL(150)
277
278	LFDX	f24,   X, INCXM1
279	LFDUX	f25,   X, INCX
280	LFDX	f26,   X, INCXM1
281	LFDUX	f27,   X, INCX
282	LFDX	f28,   X, INCXM1
283	LFDUX	f29,   X, INCX
284	LFDX	f30,   X, INCXM1
285	LFDUX	f31,   X, INCX
286
287	fabs	f8,  f24
288	fabs	f9,  f25
289	fabs	f10, f26
290	fabs	f11, f27
291	fabs	f12, f28
292	fabs	f13, f29
293	fabs	f14, f30
294	fabs	f15, f31
295
296	LFDX	f24,   X, INCXM1
297	LFDUX	f25,   X, INCX
298	LFDX	f26,   X, INCXM1
299	LFDUX	f27,   X, INCX
300	LFDX	f28,   X, INCXM1
301	LFDUX	f29,   X, INCX
302	LFDX	f30,   X, INCXM1
303	LFDUX	f31,   X, INCX
304
305	bdz	LL(120)
306	.align 4
307
308LL(110):
309	fadd	f4,  f8,  f9
310	fadd	f5,  f10, f11
311	fadd	f6,  f12, f13
312	fadd	f7,  f14, f15
313
314	fabs	f8,  f24
315	fabs	f9,  f25
316	fabs	f10, f26
317	fabs	f11, f27
318
319	LFDX	f24,   X, INCXM1
320	LFDUX	f25,   X, INCX
321	LFDX	f26,   X, INCXM1
322	LFDUX	f27,   X, INCX
323
324	fabs	f12, f28
325	fabs	f13, f29
326	fabs	f14, f30
327	fabs	f15, f31
328
329	LFDX	f28,   X, INCXM1
330	LFDUX	f29,   X, INCX
331	LFDX	f30,   X, INCXM1
332	LFDUX	f31,   X, INCX
333
334	fsub	f16, f0,  f4
335	fsub	f17, f1,  f5
336	fsub	f18, f2,  f6
337	fsub	f19, f3,  f7
338
339	fadd	f20, f8,  f9
340	fadd	f21, f10, f11
341	fadd	f22, f12, f13
342	fadd	f23, f14, f15
343
344	fabs	f8,  f24
345	fabs	f9,  f25
346	fabs	f10, f26
347	fabs	f11, f27
348
349	LFDX	f24,   X, INCXM1
350	LFDUX	f25,   X, INCX
351	LFDX	f26,   X, INCXM1
352	LFDUX	f27,   X, INCX
353
354	fsel	f0,  f16, f4, f0
355	fsel	f1,  f17, f5, f1
356	fsel	f2,  f18, f6, f2
357	fsel	f3,  f19, f7, f3
358
359	fabs	f12, f28
360	fabs	f13, f29
361	fabs	f14, f30
362	fabs	f15, f31
363
364	LFDX	f28,   X, INCXM1
365	LFDUX	f29,   X, INCX
366	LFDX	f30,   X, INCXM1
367	LFDUX	f31,   X, INCX
368
369	fsub	f16, f0,  f20
370	fsub	f17, f1,  f21
371	fsub	f18, f2,  f22
372	fsub	f19, f3,  f23
373
374	fsel	f0,  f16, f20, f0
375	fsel	f1,  f17, f21, f1
376	fsel	f2,  f18, f22, f2
377	fsel	f3,  f19, f23, f3
378	bdnz	LL(110)
379	.align 4
380
381LL(120):
382	fadd	f4,  f8,  f9
383	fadd	f5,  f10, f11
384	fadd	f6,  f12, f13
385	fadd	f7,  f14, f15
386
387	fabs	f8,  f24
388	fabs	f9,  f25
389	fabs	f10, f26
390	fabs	f11, f27
391
392	fabs	f12, f28
393	fabs	f13, f29
394	fabs	f14, f30
395	fabs	f15, f31
396
397	fsub	f16, f0,  f4
398	fsub	f17, f1,  f5
399	fsub	f18, f2,  f6
400	fsub	f19, f3,  f7
401
402	fadd	f20, f8,  f9
403	fadd	f21, f10, f11
404	fadd	f22, f12, f13
405	fadd	f23, f14, f15
406
407	fsel	f0,  f16, f4, f0
408	fsel	f1,  f17, f5, f1
409	fsel	f2,  f18, f6, f2
410	fsel	f3,  f19, f7, f3
411
412	fsub	f16, f0,  f20
413	fsub	f17, f1,  f21
414	fsub	f18, f2,  f22
415	fsub	f19, f3,  f23
416
417	fsel	f0,  f16, f20, f0
418	fsel	f1,  f17, f21, f1
419	fsel	f2,  f18, f22, f2
420	fsel	f3,  f19, f23, f3
421	.align 4
422
423LL(150):
424	andi.	r0,  N, 7
425	mtspr	CTR, r0
426	beq	LL(999)
427	.align 4
428
429LL(160):
430	LFDX	f8,    X, INCXM1
431	LFDUX	f9,    X, INCX
432
433	fabs	f8, f8
434	fabs	f9, f9
435	fadd	f8, f8, f9
436	fsub	f16, f1, f8
437	fsel	f1, f16, f8, f1
438	bdnz	LL(160)
439	.align 4
440
441LL(999):
442	fsub	f8,  f0,  f1
443	fsub	f9,  f2,  f3
444
445	fsel	f0,  f8,  f1, f0
446	fsel	f2,  f9,  f3, f2
447	fsub	f8,  f0,  f2
448	fsel	f1,  f8,  f2, f0
449	.align 4
450
451LL(9999):
452	lfd	f14,    0(SP)
453	lfd	f15,    8(SP)
454	lfd	f16,   16(SP)
455	lfd	f17,   24(SP)
456
457	lfd	f18,   32(SP)
458	lfd	f19,   40(SP)
459	lfd	f20,   48(SP)
460	lfd	f21,   56(SP)
461
462	lfd	f22,   64(SP)
463	lfd	f23,   72(SP)
464	lfd	f24,   80(SP)
465	lfd	f25,   88(SP)
466
467	lfd	f26,   96(SP)
468	lfd	f27,  104(SP)
469	lfd	f28,  112(SP)
470	lfd	f29,  120(SP)
471
472	lfd	f30,  128(SP)
473	lfd	f31,  136(SP)
474
475	addi	SP, SP, STACKSIZE
476	blr
477
478	EPILOGUE
479