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 RET	r3
26#define X	r4
27#define INCX	r5
28
29#define N	r6
30#define NN	r7
31#define XX	r8
32#define PRE	r9
33#define	INC1	r10
34
35#define FZERO	f1
36
37#define STACKSIZE 160
38
39	PROLOGUE
40	PROFCODE
41
42	addi	SP, SP, -STACKSIZE
43	li	r0,   0
44
45	stfd	f14,    0(SP)
46	stfd	f15,    8(SP)
47	stfd	f16,   16(SP)
48	stfd	f17,   24(SP)
49
50	stfd	f18,   32(SP)
51	stfd	f19,   40(SP)
52	stfd	f20,   48(SP)
53	stfd	f21,   56(SP)
54
55	stfd	f22,   64(SP)
56	stfd	f23,   72(SP)
57	stfd	f24,   80(SP)
58	stfd	f25,   88(SP)
59
60	stfd	f26,   96(SP)
61	stfd	f27,  104(SP)
62	stfd	f28,  112(SP)
63	stfd	f29,  120(SP)
64
65	stfd	f30,  128(SP)
66	stfd	f31,  136(SP)
67
68	stw	r0,   144(SP)
69	lfs	FZERO,144(SP)
70
71#ifdef F_INTERFACE
72	LDINT	N,    0(r3)
73	LDINT	INCX, 0(INCX)
74#else
75	mr	N, r3
76#endif
77
78	li	RET, 0
79
80	slwi	INCX, INCX, ZBASE_SHIFT
81	sub	X, X, INCX
82	li	INC1, SIZE
83	li	PRE, 3 * 16 * SIZE
84
85	mr	NN, N
86	mr	XX, X
87
88	cmpwi	cr0, N, 0
89	ble-	LL(9999)
90	cmpwi	cr0, INCX, 0
91	ble-	LL(9999)
92
93	LFDUX	f1, X, INCX
94	LFDX	f2, X, INC1
95
96	fabs	f1, f1
97	fabs	f2, f2
98	fadd	f1, f1, f2
99
100	subi	N, N, 1
101	fmr	f0, f1
102	srawi.	r0, N, 3
103	fmr	f2, f1
104	mtspr	CTR,  r0
105	fmr	f3, f1
106	beq-	LL(150)
107
108	LFDUX	f24,   X, INCX
109	LFDX	f25,   X, INC1
110	LFDUX	f26,   X, INCX
111	LFDX	f27,   X, INC1
112	LFDUX	f28,   X, INCX
113	LFDX	f29,   X, INC1
114	LFDUX	f30,   X, INCX
115	LFDX	f31,   X, INC1
116
117	fabs	f8,  f24
118	fabs	f9,  f25
119	fabs	f10, f26
120	fabs	f11, f27
121	fabs	f12, f28
122	fabs	f13, f29
123	fabs	f14, f30
124	fabs	f15, f31
125
126	LFDUX	f24,   X, INCX
127	LFDX	f25,   X, INC1
128	LFDUX	f26,   X, INCX
129	LFDX	f27,   X, INC1
130	LFDUX	f28,   X, INCX
131	LFDX	f29,   X, INC1
132	LFDUX	f30,   X, INCX
133	LFDX	f31,   X, INC1
134
135	bdz	LL(120)
136	.align 4
137
138LL(110):
139	fadd	f4,  f8,  f9
140#ifdef PPCG4
141	dcbt	X, PRE
142#endif
143	fadd	f5,  f10, f11
144	fadd	f6,  f12, f13
145	fadd	f7,  f14, f15
146
147	fabs	f8,  f24
148	LFDUX	f24,   X, INCX
149	fabs	f9,  f25
150	LFDX	f25,   X, INC1
151	fabs	f10, f26
152	LFDUX	f26,   X, INCX
153	fabs	f11, f27
154	LFDX	f27,   X, INC1
155
156	fabs	f12, f28
157#if defined(PPCG4) && defined(DOUBLE)
158	dcbt	X, PRE
159#endif
160	fabs	f13, f29
161	LFDUX	f28,   X, INCX
162	fabs	f14, f30
163	LFDX	f29,   X, INC1
164	fabs	f15, f31
165	LFDUX	f30,   X, INCX
166
167	fsub	f16, f0,  f4
168	LFDX	f31,   X, INC1
169	fsub	f17, f1,  f5
170	fsub	f18, f2,  f6
171	fsub	f19, f3,  f7
172
173	fadd	f20, f8,  f9
174#ifdef PPCG4
175	dcbt	X, PRE
176#endif
177	fadd	f21, f10, f11
178	fadd	f22, f12, f13
179	fadd	f23, f14, f15
180
181	fabs	f8,  f24
182	LFDUX	f24,   X, INCX
183	fabs	f9,  f25
184	LFDX	f25,   X, INC1
185	fabs	f10, f26
186	LFDUX	f26,   X, INCX
187	fabs	f11, f27
188	LFDX	f27,   X, INC1
189
190	fsel	f0,  f16, f4, f0
191#if defined(PPCG4) && defined(DOUBLE)
192	dcbt	X, PRE
193#endif
194	fsel	f1,  f17, f5, f1
195	fsel	f2,  f18, f6, f2
196	fsel	f3,  f19, f7, f3
197
198	fabs	f12, f28
199	LFDUX	f28,   X, INCX
200	fabs	f13, f29
201	LFDX	f29,   X, INC1
202	fabs	f14, f30
203	LFDUX	f30,   X, INCX
204	fabs	f15, f31
205	LFDX	f31,   X, INC1
206
207	fsub	f16, f0,  f20
208	fsub	f17, f1,  f21
209	fsub	f18, f2,  f22
210	fsub	f19, f3,  f23
211
212	fsel	f0,  f16, f20, f0
213	fsel	f1,  f17, f21, f1
214	fsel	f2,  f18, f22, f2
215	fsel	f3,  f19, f23, f3
216	bdnz	LL(110)
217	.align 4
218
219LL(120):
220	fadd	f4,  f8,  f9
221	fadd	f5,  f10, f11
222	fadd	f6,  f12, f13
223	fadd	f7,  f14, f15
224
225	fabs	f8,  f24
226	fabs	f9,  f25
227	fabs	f10, f26
228	fabs	f11, f27
229
230	fabs	f12, f28
231	fabs	f13, f29
232	fabs	f14, f30
233	fabs	f15, f31
234
235	fsub	f16, f0,  f4
236	fsub	f17, f1,  f5
237	fsub	f18, f2,  f6
238	fsub	f19, f3,  f7
239
240	fadd	f20, f8,  f9
241	fadd	f21, f10, f11
242	fadd	f22, f12, f13
243	fadd	f23, f14, f15
244
245	fsel	f0,  f16, f4, f0
246	fsel	f1,  f17, f5, f1
247	fsel	f2,  f18, f6, f2
248	fsel	f3,  f19, f7, f3
249
250	fsub	f16, f0,  f20
251	fsub	f17, f1,  f21
252	fsub	f18, f2,  f22
253	fsub	f19, f3,  f23
254
255	fsel	f0,  f16, f20, f0
256	fsel	f1,  f17, f21, f1
257	fsel	f2,  f18, f22, f2
258	fsel	f3,  f19, f23, f3
259	.align 4
260
261LL(150):
262	andi.	r0,  N, 7
263	mtspr	CTR, r0
264	beq	LL(999)
265	.align 4
266
267LL(160):
268	LFDUX	f8,    X, INCX
269	LFDX	f9,    X, INC1
270
271	fabs	f8, f8
272	fabs	f9, f9
273	fadd	f8, f8, f9
274	fsub	f16, f1, f8
275	fsel	f1, f16, f8, f1
276	bdnz	LL(160)
277	.align 4
278
279LL(999):
280	fsub	f8,  f0,  f1
281	fsub	f9,  f2,  f3
282
283	fsel	f0,  f8,  f1, f0
284	fsel	f2,  f9,  f3, f2
285	fsub	f8,  f0,  f2
286	fsel	f1,  f8,  f2, f0
287	.align 4
288
289LL(1000):
290	srawi.	r0, NN, 3
291	mtspr	CTR,  r0
292	beq-	LL(1150)
293
294	LFDUX	f24,   XX, INCX
295	LFDX	f25,   XX, INC1
296	LFDUX	f26,   XX, INCX
297	LFDX	f27,   XX, INC1
298	LFDUX	f28,   XX, INCX
299	LFDX	f29,   XX, INC1
300	LFDUX	f30,   XX, INCX
301	LFDX	f31,   XX, INC1
302	bdz	LL(1120)
303	.align 4
304
305LL(1110):
306	fabs	f8,  f24
307	LFDUX	f24,   XX, INCX
308	fabs	f9,  f25
309	LFDX	f25,   XX, INC1
310	fabs	f10, f26
311	LFDUX	f26,   XX, INCX
312	fabs	f11, f27
313	LFDX	f27,   XX, INC1
314
315#ifdef PPCG4
316	dcbt	XX, PRE
317#endif
318
319	fabs	f12, f28
320	LFDUX	f28,   XX, INCX
321	fabs	f13, f29
322	LFDX	f29,   XX, INC1
323	fabs	f14, f30
324	LFDUX	f30,   XX, INCX
325	fabs	f15, f31
326	LFDX	f31,   XX, INC1
327
328	fadd	f4, f8,  f9
329#if defined(PPCG4) && defined(DOUBLE)
330	dcbt	X, PRE
331#endif
332	fadd	f5, f10, f11
333	fadd	f6, f12, f13
334	fadd	f7, f14, f15
335
336	addi	RET, RET, 1
337	fcmpu	cr0, f1, f4
338	beq	cr0, LL(9999)
339
340	addi	RET, RET, 1
341	fcmpu	cr0, f1, f5
342	beq	cr0, LL(9999)
343
344	addi	RET, RET, 1
345	fcmpu	cr0, f1, f6
346	beq	cr0, LL(9999)
347
348	addi	RET, RET, 1
349	fcmpu	cr0, f1, f7
350	beq	cr0, LL(9999)
351
352
353	fabs	f8,  f24
354	LFDUX	f24,   XX, INCX
355	fabs	f9,  f25
356	LFDX	f25,   XX, INC1
357	fabs	f10, f26
358	LFDUX	f26,   XX, INCX
359	fabs	f11, f27
360	LFDX	f27,   XX, INC1
361
362#ifdef PPCG4
363	dcbt	XX, PRE
364#endif
365
366	fabs	f12, f28
367	LFDUX	f28,   XX, INCX
368	fabs	f13, f29
369	LFDX	f29,   XX, INC1
370	fabs	f14, f30
371	LFDUX	f30,   XX, INCX
372	fabs	f15, f31
373	LFDX	f31,   XX, INC1
374
375	fadd	f4, f8,  f9
376#if defined(PPCG4) && defined(DOUBLE)
377	dcbt	X, PRE
378#endif
379	fadd	f5, f10, f11
380	fadd	f6, f12, f13
381	fadd	f7, f14, f15
382
383	addi	RET, RET, 1
384	fcmpu	cr0, f1, f4
385	beq	cr0, LL(9999)
386
387	addi	RET, RET, 1
388	fcmpu	cr0, f1, f5
389	beq	cr0, LL(9999)
390
391	addi	RET, RET, 1
392	fcmpu	cr0, f1, f6
393	beq	cr0, LL(9999)
394
395	addi	RET, RET, 1
396	fcmpu	cr0, f1, f7
397	beq	cr0, LL(9999)
398
399	bdnz	LL(1110)
400	.align 4
401
402LL(1120):
403	fabs	f8,  f24
404	LFDUX	f24,   XX, INCX
405	fabs	f9,  f25
406	LFDX	f25,   XX, INC1
407	fabs	f10, f26
408	LFDUX	f26,   XX, INCX
409	fabs	f11, f27
410	LFDX	f27,   XX, INC1
411
412	fabs	f12, f28
413	LFDUX	f28,   XX, INCX
414	fabs	f13, f29
415	LFDX	f29,   XX, INC1
416	fabs	f14, f30
417	LFDUX	f30,   XX, INCX
418	fabs	f15, f31
419	LFDX	f31,   XX, INC1
420
421	fadd	f4, f8,  f9
422	fadd	f5, f10, f11
423	fadd	f6, f12, f13
424	fadd	f7, f14, f15
425
426	addi	RET, RET, 1
427	fcmpu	cr0, f1, f4
428	beq	cr0, LL(9999)
429
430	addi	RET, RET, 1
431	fcmpu	cr0, f1, f5
432	beq	cr0, LL(9999)
433
434	addi	RET, RET, 1
435	fcmpu	cr0, f1, f6
436	beq	cr0, LL(9999)
437
438	addi	RET, RET, 1
439	fcmpu	cr0, f1, f7
440	beq	cr0, LL(9999)
441
442	fabs	f8,  f24
443	fabs	f9,  f25
444	fabs	f10, f26
445	fabs	f11, f27
446
447	fabs	f12, f28
448	fabs	f13, f29
449	fabs	f14, f30
450	fabs	f15, f31
451
452	fadd	f4, f8,  f9
453	fadd	f5, f10, f11
454	fadd	f6, f12, f13
455	fadd	f7, f14, f15
456
457	addi	RET, RET, 1
458	fcmpu	cr0, f1, f4
459	beq	cr0, LL(9999)
460
461	addi	RET, RET, 1
462	fcmpu	cr0, f1, f5
463	beq	cr0, LL(9999)
464
465	addi	RET, RET, 1
466	fcmpu	cr0, f1, f6
467	beq	cr0, LL(9999)
468
469	addi	RET, RET, 1
470	fcmpu	cr0, f1, f7
471	beq	cr0, LL(9999)
472	.align 4
473
474LL(1150):
475	andi.	r0,  NN, 7
476	mtspr	CTR, r0
477	beq	LL(9999)
478	.align 4
479
480LL(1160):
481	LFDUX	f8,    XX, INCX
482	LFDX	f9,    XX, INC1
483
484	fabs	f8, f8
485	fabs	f9, f9
486	fadd	f8, f8, f9
487
488	addi	RET, RET, 1
489	fcmpu	cr0, f1, f8
490	beq	cr0, LL(9999)
491	bdnz	LL(1160)
492	.align 4
493
494LL(9999):
495	lfd	f14,    0(SP)
496	lfd	f15,    8(SP)
497	lfd	f16,   16(SP)
498	lfd	f17,   24(SP)
499
500	lfd	f18,   32(SP)
501	lfd	f19,   40(SP)
502	lfd	f20,   48(SP)
503	lfd	f21,   56(SP)
504
505	lfd	f22,   64(SP)
506	lfd	f23,   72(SP)
507	lfd	f24,   80(SP)
508	lfd	f25,   88(SP)
509
510	lfd	f26,   96(SP)
511	lfd	f27,  104(SP)
512	lfd	f28,  112(SP)
513	lfd	f29,  120(SP)
514
515	lfd	f30,  128(SP)
516	lfd	f31,  136(SP)
517
518	addi	SP, SP, STACKSIZE
519	blr
520
521	EPILOGUE
522