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 OLD_M	%rdi
26#define OLD_N	%rsi
27#define OLD_K	%rdx
28
29#define M	%r13
30#define N	%r14
31#define K	%r15
32
33#define A	%rcx
34#define B	%r8
35#define C	%r9
36#define LDC	%r10
37
38#define I	%r11
39#define AO	%rdi
40#define BO	%rsi
41#define	CO1	%rbx
42#define CO2	%rbp
43#define KK	%rdx
44#define BB	%r12
45
46#ifndef WINDOWS_ABI
47
48#define STACKSIZE 128
49
50#define OLD_LDC		 8 + STACKSIZE(%rsp)
51#define OLD_OFFSET	16 + STACKSIZE(%rsp)
52
53#define OFFSET	   48(%rsp)
54#define J	   56(%rsp)
55#define KKK	   64(%rsp)
56#define AORIG	   72(%rsp)
57
58#else
59
60#define STACKSIZE 256
61
62#define OLD_ALPHA_I	40 + STACKSIZE(%rsp)
63#define OLD_A		48 + STACKSIZE(%rsp)
64#define OLD_B		56 + STACKSIZE(%rsp)
65#define OLD_C		64 + STACKSIZE(%rsp)
66#define OLD_LDC		72 + STACKSIZE(%rsp)
67#define OLD_OFFSET	80 + STACKSIZE(%rsp)
68
69#define OFFSET	  224(%rsp)
70#define J	  232(%rsp)
71#define KKK	  240(%rsp)
72#define AORIG	  248(%rsp)
73
74#endif
75
76#define PREFETCHSIZE  (16 * 1 + 4)
77#define PREFETCH     prefetcht0
78
79#define ADD1	  addps
80#define ADD2	  addps
81
82	PROLOGUE
83	PROFCODE
84
85	subq	$STACKSIZE, %rsp
86
87	movq	%rbx,  0(%rsp)
88	movq	%rbp,  8(%rsp)
89	movq	%r12, 16(%rsp)
90	movq	%r13, 24(%rsp)
91	movq	%r14, 32(%rsp)
92	movq	%r15, 40(%rsp)
93
94#ifdef WINDOWS_ABI
95	movq	%rdi,    48(%rsp)
96	movq	%rsi,    56(%rsp)
97	movups	%xmm6,   64(%rsp)
98	movups	%xmm7,   80(%rsp)
99	movups	%xmm8,   96(%rsp)
100	movups	%xmm9,  112(%rsp)
101	movups	%xmm10, 128(%rsp)
102	movups	%xmm11, 144(%rsp)
103	movups	%xmm12, 160(%rsp)
104	movups	%xmm13, 176(%rsp)
105	movups	%xmm14, 192(%rsp)
106	movups	%xmm15, 208(%rsp)
107
108	movq	ARG1,      OLD_M
109	movq	ARG2,      OLD_N
110	movq	ARG3,      OLD_K
111	movq	OLD_A,     A
112	movq	OLD_B,     B
113	movq	OLD_C,     C
114#endif
115
116	subq	$-32 * SIZE, A
117	subq	$-32 * SIZE, B
118
119	movq	OLD_M, M
120	movq	OLD_N, N
121	movq	OLD_K, K
122	movq	OLD_LDC,   LDC
123	movq	OLD_OFFSET, KK
124
125	salq	$ZBASE_SHIFT, LDC
126
127	movq	KK, OFFSET
128	negq	KK
129
130#ifdef LN
131       movq	M, %rax
132       salq	$ZBASE_SHIFT, %rax
133       addq	%rax, C
134       imulq	K, %rax
135       addq	%rax, A
136#endif
137
138#ifdef RT
139       movq	N, %rax
140       salq	$ZBASE_SHIFT, %rax
141       imulq	K, %rax
142       addq	%rax, B
143
144       movq	N, %rax
145       imulq	LDC, %rax
146       addq	%rax, C
147#endif
148
149#ifdef RT
150       movq	N, KK
151       subq	OFFSET, KK
152#endif
153
154	movq	N,  J
155	sarq	$2, J
156	NOBRANCH
157	jle	.L30
158	ALIGN_4
159
160.L01:
161#if defined(LT) || defined(RN)
162	movq	A, AO
163#else
164	movq	A, AORIG
165#endif
166
167#ifdef RT
168       movq	K, %rax
169       salq	$2 + ZBASE_SHIFT, %rax
170       subq	%rax, B
171
172       leaq	(, LDC, 4), %rax
173       subq	%rax, C
174#endif
175
176	movq	C, CO1
177	leaq	(C, LDC, 2), CO2
178#ifndef RT
179	leaq	(C, LDC, 4), C
180#endif
181
182#ifdef LN
183	movq	OFFSET, KK
184	addq	M, KK
185#endif
186
187	movq	K, %rax
188	salq	$ZBASE_SHIFT + 2, %rax
189	leaq	(B, %rax), BB
190
191#ifdef LT
192	movq	OFFSET, KK
193#endif
194
195	movq	M,  I
196	sarq	$1, I
197	NOBRANCH
198	jle	.L20
199	ALIGN_4
200
201.L11:
202#ifdef LN
203       movq	K, %rax
204       salq	$1 + ZBASE_SHIFT, %rax
205       subq	%rax, AORIG
206#endif
207
208#if defined(LN) || defined(RT)
209	movq	AORIG, AO
210
211	movq	KK, %rax
212	salq	$ZBASE_SHIFT, %rax
213
214	leaq	(AO, %rax, 2), AO
215	leaq	(B,  %rax, 4), BO
216#else
217	movq	B, BO
218#endif
219
220	prefetchnta	 -32 * SIZE(BB)
221	subq		 $-16 * SIZE, BB
222
223	xorps	%xmm1, %xmm1
224	movaps	-32 * SIZE(AO), %xmm0
225	xorps	%xmm2, %xmm2
226	xorps	%xmm3, %xmm3
227	xorps	%xmm4, %xmm4
228
229	xorps	%xmm8,  %xmm8
230	prefetcht2     4 * SIZE(CO1)
231	xorps	%xmm9,  %xmm9
232	prefetcht2     4 * SIZE(CO1, LDC,  1)
233	xorps	%xmm10, %xmm10
234	xorps	%xmm11, %xmm11
235
236	xorps	%xmm12, %xmm12
237	prefetcht2     4 * SIZE(CO2)
238	xorps	%xmm13, %xmm13
239	prefetcht2     4 * SIZE(CO2, LDC,  1)
240	xorps	%xmm14, %xmm14
241	xorps	%xmm15, %xmm15
242
243#if defined(LT) || defined(RN)
244	movq	KK, %rax
245#else
246	movq	K, %rax
247	subq	KK, %rax
248#endif
249	sarq	$2, %rax
250	NOBRANCH
251	jle	.L15
252	ALIGN_3
253
254.L12:
255	PREFETCH	(PREFETCHSIZE +  0) * SIZE(AO)
256
257	ADD1	%xmm1, %xmm12
258	movaps	-32 * SIZE(BO), %xmm1
259	ADD2	%xmm2, %xmm13
260	pshufd	$0xb1, %xmm1, %xmm2
261	mulps	%xmm0, %xmm1
262	pshufd	$0x1b, %xmm2, %xmm5
263	mulps	%xmm0, %xmm2
264
265	ADD1	%xmm3, %xmm14
266	ADD2	%xmm4, %xmm15
267	pshufd	$0xb1, %xmm5, %xmm6
268	mulps	%xmm0, %xmm5
269	mulps	%xmm0, %xmm6
270
271	ADD1	%xmm1, %xmm8
272	movaps	-28 * SIZE(BO), %xmm1
273	ADD2	%xmm2, %xmm9
274	pshufd	$0xb1, %xmm1, %xmm2
275	mulps	%xmm0, %xmm1
276	pshufd	$0x1b, %xmm2, %xmm3
277	mulps	%xmm0, %xmm2
278
279	ADD1	%xmm5, %xmm10
280	ADD2	%xmm6, %xmm11
281	pshufd	$0xb1, %xmm3, %xmm4
282	mulps	%xmm0, %xmm3
283	mulps	%xmm0, %xmm4
284
285	movaps	-28 * SIZE(AO), %xmm0
286
287	ADD1	%xmm1, %xmm12
288	movaps	-24 * SIZE(BO), %xmm1
289	ADD2	%xmm2, %xmm13
290	pshufd	$0xb1, %xmm1, %xmm2
291	mulps	%xmm0, %xmm1
292	pshufd	$0x1b, %xmm2, %xmm5
293	mulps	%xmm0, %xmm2
294
295	ADD1	%xmm3, %xmm14
296	ADD2	%xmm4, %xmm15
297	pshufd	$0xb1, %xmm5, %xmm6
298	mulps	%xmm0, %xmm5
299	mulps	%xmm0, %xmm6
300
301	ADD1	%xmm1, %xmm8
302	movaps	-20 * SIZE(BO), %xmm1
303	ADD2	%xmm2, %xmm9
304	pshufd	$0xb1, %xmm1, %xmm2
305	mulps	%xmm0, %xmm1
306	pshufd	$0x1b, %xmm2, %xmm3
307	mulps	%xmm0, %xmm2
308
309	ADD1	%xmm5, %xmm10
310	ADD2	%xmm6, %xmm11
311	pshufd	$0xb1, %xmm3, %xmm4
312	mulps	%xmm0, %xmm3
313	mulps	%xmm0, %xmm4
314
315	movaps	-24 * SIZE(AO), %xmm0
316
317	ADD1	%xmm1, %xmm12
318	movaps	-16 * SIZE(BO), %xmm1
319	ADD2	%xmm2, %xmm13
320	pshufd	$0xb1, %xmm1, %xmm2
321	mulps	%xmm0, %xmm1
322	pshufd	$0x1b, %xmm2, %xmm5
323	mulps	%xmm0, %xmm2
324
325	ADD1	%xmm3, %xmm14
326	ADD2	%xmm4, %xmm15
327	pshufd	$0xb1, %xmm5, %xmm6
328	mulps	%xmm0, %xmm5
329	mulps	%xmm0, %xmm6
330
331	ADD1	%xmm1, %xmm8
332	movaps	-12 * SIZE(BO), %xmm1
333	ADD2	%xmm2, %xmm9
334	pshufd	$0xb1, %xmm1, %xmm2
335	mulps	%xmm0, %xmm1
336	pshufd	$0x1b, %xmm2, %xmm3
337	mulps	%xmm0, %xmm2
338
339	ADD1	%xmm5, %xmm10
340	ADD2	%xmm6, %xmm11
341	pshufd	$0xb1, %xmm3, %xmm4
342	mulps	%xmm0, %xmm3
343	mulps	%xmm0, %xmm4
344
345	movaps	-20 * SIZE(AO), %xmm0
346
347	ADD1	%xmm1, %xmm12
348	movaps	 -8 * SIZE(BO), %xmm1
349	ADD2	%xmm2, %xmm13
350	pshufd	$0xb1, %xmm1, %xmm2
351	mulps	%xmm0, %xmm1
352	pshufd	$0x1b, %xmm2, %xmm5
353	mulps	%xmm0, %xmm2
354
355	ADD1	%xmm3, %xmm14
356	ADD2	%xmm4, %xmm15
357	pshufd	$0xb1, %xmm5, %xmm6
358	mulps	%xmm0, %xmm5
359	mulps	%xmm0, %xmm6
360
361	ADD1	%xmm1, %xmm8
362	movaps	 -4 * SIZE(BO), %xmm1
363	ADD2	%xmm2, %xmm9
364	subq	$-32 * SIZE, BO
365	pshufd	$0xb1, %xmm1, %xmm2
366	mulps	%xmm0, %xmm1
367	pshufd	$0x1b, %xmm2, %xmm3
368	mulps	%xmm0, %xmm2
369
370	ADD1	%xmm5, %xmm10
371	ADD2	%xmm6, %xmm11
372	pshufd	$0xb1, %xmm3, %xmm4
373	mulps	%xmm0, %xmm3
374	mulps	%xmm0, %xmm4
375
376	movaps	-16 * SIZE(AO), %xmm0
377
378	subq	$-16 * SIZE, AO
379	subq	$1, %rax
380	BRANCH
381	jg	.L12
382	ALIGN_3
383
384.L15:
385#if defined(LT) || defined(RN)
386	movq	KK, %rax
387#else
388	movq	K, %rax
389	subq	KK, %rax
390#endif
391	andq	$3, %rax		# if (k & 1)
392	BRANCH
393	je	.L18
394	ALIGN_3
395
396.L16:
397	ADD1	%xmm1, %xmm12
398	movaps	-32 * SIZE(BO), %xmm1
399	ADD2	%xmm2, %xmm13
400	pshufd	$0xb1, %xmm1, %xmm2
401	mulps	%xmm0, %xmm1
402	pshufd	$0x1b, %xmm2, %xmm5
403	mulps	%xmm0, %xmm2
404
405	ADD1	%xmm3, %xmm14
406	ADD2	%xmm4, %xmm15
407	pshufd	$0xb1, %xmm5, %xmm6
408	mulps	%xmm0, %xmm5
409	mulps	%xmm0, %xmm6
410
411	ADD1	%xmm1, %xmm8
412	movaps	-28 * SIZE(BO), %xmm1
413	ADD2	%xmm2, %xmm9
414	pshufd	$0xb1, %xmm1, %xmm2
415	mulps	%xmm0, %xmm1
416	pshufd	$0x1b, %xmm2, %xmm3
417	mulps	%xmm0, %xmm2
418
419	ADD1	%xmm5, %xmm10
420	ADD2	%xmm6, %xmm11
421	pshufd	$0xb1, %xmm3, %xmm4
422	mulps	%xmm0, %xmm3
423	mulps	%xmm0, %xmm4
424
425	movaps	-28 * SIZE(AO), %xmm0
426
427	addq	$4 * SIZE, AO
428	addq	$8 * SIZE, BO
429
430	subq	$1, %rax
431	BRANCH
432	jg	.L16
433	ALIGN_3
434
435.L18:
436#if defined(LN) || defined(RT)
437	movq	KK, %rax
438#ifdef LN
439	subq	$2, %rax
440#else
441	subq	$4, %rax
442#endif
443
444	salq	$ZBASE_SHIFT, %rax
445
446	movq	AORIG, AO
447	leaq	(AO, %rax, 2), AO
448	leaq	(B,  %rax, 4), BO
449#endif
450
451	ADD1	%xmm1, %xmm12
452	ADD2	%xmm2, %xmm13
453	ADD1	%xmm3, %xmm14
454	ADD2	%xmm4, %xmm15
455
456	pcmpeqb	%xmm0, %xmm0
457	psllq	$63,   %xmm0
458
459#if defined(LN) || defined(LT)
460
461#ifndef CONJ
462	xorps	%xmm0, %xmm8
463	xorps	%xmm0, %xmm10
464	xorps	%xmm0, %xmm12
465	xorps	%xmm0, %xmm14
466#else
467	xorps	%xmm0, %xmm9
468	xorps	%xmm0, %xmm11
469	xorps	%xmm0, %xmm13
470	xorps	%xmm0, %xmm15
471#endif
472
473#else
474
475#ifndef CONJ
476	xorps	%xmm0, %xmm8
477	xorps	%xmm0, %xmm10
478	xorps	%xmm0, %xmm12
479	xorps	%xmm0, %xmm14
480#else
481	shufps	$0xb1, %xmm0,  %xmm0
482
483	xorps	%xmm0, %xmm9
484	xorps	%xmm0, %xmm11
485	xorps	%xmm0, %xmm13
486	xorps	%xmm0, %xmm15
487#endif
488
489#endif
490
491	haddps	%xmm9,  %xmm8
492	haddps	%xmm11, %xmm10
493	haddps	%xmm13, %xmm12
494	haddps	%xmm15, %xmm14
495
496	shufps	$0xd8, %xmm8,  %xmm8
497	shufps	$0xd8, %xmm10, %xmm10
498	shufps	$0xd8, %xmm12, %xmm12
499	shufps	$0xd8, %xmm14, %xmm14
500
501	movaps	%xmm8, %xmm9
502	shufps	$0xe4, %xmm10, %xmm8
503	shufps	$0xe4, %xmm9, %xmm10
504
505	movaps	%xmm12, %xmm13
506	shufps	$0xe4, %xmm14, %xmm12
507	shufps	$0xe4, %xmm13, %xmm14
508
509#if defined(LN) || defined(LT)
510	movaps	%xmm8,  %xmm9
511	movlhps	%xmm10, %xmm8
512	movhlps %xmm9,  %xmm10
513
514	movaps	%xmm12, %xmm11
515	movlhps	%xmm14, %xmm12
516	movhlps %xmm11, %xmm14
517
518	movaps	-32 * SIZE(BO), %xmm9
519	movaps	-28 * SIZE(BO), %xmm13
520	movaps	-24 * SIZE(BO), %xmm11
521	movaps	-20 * SIZE(BO), %xmm15
522
523	subps	%xmm8,   %xmm9
524	subps	%xmm10,  %xmm11
525	subps	%xmm12,  %xmm13
526	subps	%xmm14,  %xmm15
527#else
528	movaps	-32 * SIZE(AO), %xmm9
529	movaps	-28 * SIZE(AO), %xmm11
530	movaps	-24 * SIZE(AO), %xmm13
531	movaps	-20 * SIZE(AO), %xmm15
532
533	subps	%xmm8,   %xmm9
534	subps	%xmm10,  %xmm11
535	subps	%xmm12,  %xmm13
536	subps	%xmm14,  %xmm15
537#endif
538
539	pcmpeqb	%xmm7, %xmm7
540	psllq	$63,   %xmm7
541
542#ifndef CONJ
543	shufps	$0xb1, %xmm7,  %xmm7
544#endif
545
546#ifdef LN
547	movaps	-28 * SIZE(AO), %xmm5
548
549	pshufd	$0xaa, %xmm5, %xmm0
550	pshufd	$0xff, %xmm5, %xmm1
551
552	pshufd	$0xb1, %xmm11, %xmm10
553	pshufd	$0xb1, %xmm15, %xmm14
554
555	xorps	 %xmm7, %xmm10
556	xorps	 %xmm7, %xmm14
557
558	mulps	 %xmm0, %xmm11
559	mulps	 %xmm1, %xmm10
560	mulps	 %xmm0, %xmm15
561	mulps	 %xmm1, %xmm14
562
563	addps	 %xmm10, %xmm11
564	addps	 %xmm14, %xmm15
565
566	pshufd	$0x00, %xmm5, %xmm0
567	pshufd	$0x55, %xmm5, %xmm1
568
569	movaps	%xmm11, %xmm3
570	pshufd	$0xb1, %xmm11, %xmm2
571	movaps	%xmm15, %xmm5
572	pshufd	$0xb1, %xmm15, %xmm4
573
574	xorps	 %xmm7, %xmm2
575	xorps	 %xmm7, %xmm4
576
577	mulps	 %xmm0, %xmm3
578	mulps	 %xmm1, %xmm2
579	mulps	 %xmm0, %xmm5
580	mulps	 %xmm1, %xmm4
581
582	subps	 %xmm3, %xmm9
583	subps	 %xmm2, %xmm9
584	subps	 %xmm5, %xmm13
585	subps	 %xmm4, %xmm13
586
587	movaps	-32 * SIZE(AO), %xmm5
588
589	pshufd	$0x00, %xmm5, %xmm0
590	pshufd	$0x55, %xmm5, %xmm1
591
592	pshufd	$0xb1, %xmm9, %xmm10
593	pshufd	$0xb1, %xmm13, %xmm14
594
595	xorps	 %xmm7, %xmm10
596	xorps	 %xmm7, %xmm14
597
598	mulps	 %xmm0, %xmm9
599	mulps	 %xmm1, %xmm10
600	mulps	 %xmm0, %xmm13
601	mulps	 %xmm1, %xmm14
602
603	addps	 %xmm10, %xmm9
604	addps	 %xmm14, %xmm13
605#endif
606
607#ifdef LT
608	movaps	-32 * SIZE(AO), %xmm5
609
610	pshufd	$0x00, %xmm5, %xmm0
611	pshufd	$0x55, %xmm5, %xmm1
612
613	pshufd	$0xb1, %xmm9, %xmm10
614	pshufd	$0xb1, %xmm13, %xmm14
615
616	xorps	 %xmm7, %xmm10
617	xorps	 %xmm7, %xmm14
618
619	mulps	 %xmm0, %xmm9
620	mulps	 %xmm1, %xmm10
621	mulps	 %xmm0, %xmm13
622	mulps	 %xmm1, %xmm14
623
624	addps	 %xmm10, %xmm9
625	addps	 %xmm14, %xmm13
626
627	pshufd	$0xaa, %xmm5, %xmm0
628	pshufd	$0xff, %xmm5, %xmm1
629
630	movaps	%xmm9, %xmm3
631	pshufd	$0xb1, %xmm9, %xmm2
632	movaps	%xmm13, %xmm5
633	pshufd	$0xb1, %xmm13, %xmm4
634
635	xorps	 %xmm7, %xmm2
636	xorps	 %xmm7, %xmm4
637
638	mulps	 %xmm0, %xmm3
639	mulps	 %xmm1, %xmm2
640	mulps	 %xmm0, %xmm5
641	mulps	 %xmm1, %xmm4
642
643	subps	 %xmm3, %xmm11
644	subps	 %xmm2, %xmm11
645	subps	 %xmm5, %xmm15
646	subps	 %xmm4, %xmm15
647
648	movaps	-28 * SIZE(AO), %xmm5
649
650	pshufd	$0xaa, %xmm5, %xmm0
651	pshufd	$0xff, %xmm5, %xmm1
652
653	pshufd	$0xb1, %xmm11, %xmm10
654	pshufd	$0xb1, %xmm15, %xmm14
655
656	xorps	 %xmm7, %xmm10
657	xorps	 %xmm7, %xmm14
658
659	mulps	 %xmm0, %xmm11
660	mulps	 %xmm1, %xmm10
661	mulps	 %xmm0, %xmm15
662	mulps	 %xmm1, %xmm14
663
664	addps	 %xmm10, %xmm11
665	addps	 %xmm14, %xmm15
666#endif
667
668#ifdef RN
669	movaps	-32 * SIZE(BO), %xmm5
670
671	pshufd	$0x00, %xmm5, %xmm0
672	pshufd	$0x55, %xmm5, %xmm1
673
674	pshufd	$0xb1, %xmm9, %xmm8
675
676	xorps	 %xmm7, %xmm8
677
678	mulps	 %xmm0, %xmm9
679	mulps	 %xmm1, %xmm8
680
681	addps	 %xmm8, %xmm9
682
683	movaps	%xmm9,  %xmm3
684	pshufd	$0xb1, %xmm9, %xmm2
685
686	xorps	 %xmm7, %xmm2
687
688	pshufd	$0xaa, %xmm5, %xmm0
689	pshufd	$0xff, %xmm5, %xmm1
690
691	mulps	 %xmm3, %xmm0
692	mulps	 %xmm2, %xmm1
693
694	subps	 %xmm0, %xmm11
695	subps	 %xmm1, %xmm11
696
697	movaps	-28 * SIZE(BO), %xmm5
698
699	pshufd	$0x00, %xmm5, %xmm0
700	pshufd	$0x55, %xmm5, %xmm1
701
702	mulps	 %xmm3, %xmm0
703	mulps	 %xmm2, %xmm1
704
705	subps	 %xmm0, %xmm13
706	subps	 %xmm1, %xmm13
707
708	pshufd	$0xaa, %xmm5, %xmm0
709	pshufd	$0xff, %xmm5, %xmm1
710
711	mulps	 %xmm3, %xmm0
712	mulps	 %xmm2, %xmm1
713
714	subps	 %xmm0, %xmm15
715	subps	 %xmm1, %xmm15
716
717	movaps	-24 * SIZE(BO), %xmm5
718
719	pshufd	$0xaa, %xmm5, %xmm0
720	pshufd	$0xff, %xmm5, %xmm1
721
722	pshufd	$0xb1, %xmm11, %xmm10
723
724	xorps	 %xmm7, %xmm10
725
726	mulps	 %xmm0, %xmm11
727	mulps	 %xmm1, %xmm10
728
729	addps	 %xmm10, %xmm11
730
731	movaps	%xmm11,  %xmm3
732	pshufd	$0xb1, %xmm11, %xmm2
733
734	xorps	 %xmm7, %xmm2
735
736	movaps	-20 * SIZE(BO), %xmm5
737
738	pshufd	$0x00, %xmm5, %xmm0
739	pshufd	$0x55, %xmm5, %xmm1
740
741	mulps	 %xmm3, %xmm0
742	mulps	 %xmm2, %xmm1
743
744	subps	 %xmm0, %xmm13
745	subps	 %xmm1, %xmm13
746
747	pshufd	$0xaa, %xmm5, %xmm0
748	pshufd	$0xff, %xmm5, %xmm1
749
750	mulps	 %xmm3, %xmm0
751	mulps	 %xmm2, %xmm1
752
753	subps	 %xmm0, %xmm15
754	subps	 %xmm1, %xmm15
755
756	movaps	-12 * SIZE(BO), %xmm5
757
758	pshufd	$0x00, %xmm5, %xmm0
759	pshufd	$0x55, %xmm5, %xmm1
760
761	pshufd	$0xb1, %xmm13, %xmm12
762
763	xorps	 %xmm7, %xmm12
764
765	mulps	 %xmm0, %xmm13
766	mulps	 %xmm1, %xmm12
767
768	addps	 %xmm12, %xmm13
769
770	movaps	%xmm13,  %xmm3
771	pshufd	$0xb1, %xmm13, %xmm2
772
773	xorps	 %xmm7, %xmm2
774
775	pshufd	$0xaa, %xmm5, %xmm0
776	pshufd	$0xff, %xmm5, %xmm1
777
778	mulps	 %xmm3, %xmm0
779	mulps	 %xmm2, %xmm1
780
781	subps	 %xmm0, %xmm15
782	subps	 %xmm1, %xmm15
783
784	movaps	 -4 * SIZE(BO), %xmm5
785
786	pshufd	$0xaa, %xmm5, %xmm0
787	pshufd	$0xff, %xmm5, %xmm1
788
789	pshufd	$0xb1, %xmm15, %xmm14
790
791	xorps	 %xmm7, %xmm14
792
793	mulps	 %xmm0, %xmm15
794	mulps	 %xmm1, %xmm14
795
796	addps	 %xmm14, %xmm15
797#endif
798
799#ifdef RT
800	movaps	 -4 * SIZE(BO), %xmm5
801
802	pshufd	$0xaa, %xmm5, %xmm0
803	pshufd	$0xff, %xmm5, %xmm1
804
805	pshufd	$0xb1, %xmm15, %xmm14
806
807	xorps	 %xmm7, %xmm14
808
809	mulps	 %xmm0, %xmm15
810	mulps	 %xmm1, %xmm14
811
812	addps	 %xmm14, %xmm15
813
814	movaps	%xmm15,  %xmm3
815	pshufd	$0xb1, %xmm15, %xmm2
816
817	xorps	 %xmm7, %xmm2
818
819	pshufd	$0x00, %xmm5, %xmm0
820	pshufd	$0x55, %xmm5, %xmm1
821
822	mulps	 %xmm3, %xmm0
823	mulps	 %xmm2, %xmm1
824
825	subps	 %xmm0, %xmm13
826	subps	 %xmm1, %xmm13
827
828	movaps	 -8 * SIZE(BO), %xmm5
829
830	pshufd	$0xaa, %xmm5, %xmm0
831	pshufd	$0xff, %xmm5, %xmm1
832
833	mulps	 %xmm3, %xmm0
834	mulps	 %xmm2, %xmm1
835
836	subps	 %xmm0, %xmm11
837	subps	 %xmm1, %xmm11
838
839	pshufd	$0x00, %xmm5, %xmm0
840	pshufd	$0x55, %xmm5, %xmm1
841
842	mulps	 %xmm3, %xmm0
843	mulps	 %xmm2, %xmm1
844
845	subps	 %xmm0, %xmm9
846	subps	 %xmm1, %xmm9
847
848	movaps	-12 * SIZE(BO), %xmm5
849
850	pshufd	$0x00, %xmm5, %xmm0
851	pshufd	$0x55, %xmm5, %xmm1
852
853	pshufd	$0xb1, %xmm13, %xmm12
854
855	xorps	 %xmm7, %xmm12
856
857	mulps	 %xmm0, %xmm13
858	mulps	 %xmm1, %xmm12
859
860	addps	 %xmm12, %xmm13
861
862	movaps	%xmm13,  %xmm3
863	pshufd	$0xb1, %xmm13, %xmm2
864
865	xorps	 %xmm7, %xmm2
866
867	movaps	-16 * SIZE(BO), %xmm5
868
869	pshufd	$0xaa, %xmm5, %xmm0
870	pshufd	$0xff, %xmm5, %xmm1
871
872	mulps	 %xmm3, %xmm0
873	mulps	 %xmm2, %xmm1
874
875	subps	 %xmm0, %xmm11
876	subps	 %xmm1, %xmm11
877
878	pshufd	$0x00, %xmm5, %xmm0
879	pshufd	$0x55, %xmm5, %xmm1
880
881	mulps	 %xmm3, %xmm0
882	mulps	 %xmm2, %xmm1
883
884	subps	 %xmm0, %xmm9
885	subps	 %xmm1, %xmm9
886
887
888	movaps	-24 * SIZE(BO), %xmm5
889
890	pshufd	$0xaa, %xmm5, %xmm0
891	pshufd	$0xff, %xmm5, %xmm1
892
893	pshufd	$0xb1, %xmm11, %xmm10
894
895	xorps	 %xmm7, %xmm10
896
897	mulps	 %xmm0, %xmm11
898	mulps	 %xmm1, %xmm10
899
900	addps	 %xmm10, %xmm11
901
902	movaps	%xmm11,  %xmm3
903	pshufd	$0xb1, %xmm11, %xmm2
904
905	xorps	 %xmm7, %xmm2
906
907	pshufd	$0x00, %xmm5, %xmm0
908	pshufd	$0x55, %xmm5, %xmm1
909
910	mulps	 %xmm3, %xmm0
911	mulps	 %xmm2, %xmm1
912
913	subps	 %xmm0, %xmm9
914	subps	 %xmm1, %xmm9
915
916	movaps	-32 * SIZE(BO), %xmm5
917
918	pshufd	$0x00, %xmm5, %xmm0
919	pshufd	$0x55, %xmm5, %xmm1
920
921	pshufd	$0xb1, %xmm9, %xmm8
922
923	xorps	 %xmm7, %xmm8
924
925	mulps	 %xmm0, %xmm9
926	mulps	 %xmm1, %xmm8
927
928	addps	 %xmm8, %xmm9
929#endif
930
931#ifdef LN
932	subq	$4 * SIZE, CO1
933	subq	$4 * SIZE, CO2
934#endif
935
936#if defined(LN) || defined(LT)
937	movaps	%xmm9,  -32 * SIZE(BO)
938	movaps	%xmm13, -28 * SIZE(BO)
939	movaps	%xmm11, -24 * SIZE(BO)
940	movaps	%xmm15, -20 * SIZE(BO)
941
942	movsd	%xmm9,  0 * SIZE(CO1)
943	movsd	%xmm11, 2 * SIZE(CO1)
944	movhps	%xmm9,  0 * SIZE(CO1, LDC)
945	movhps	%xmm11, 2 * SIZE(CO1, LDC)
946
947	movsd	%xmm13, 0 * SIZE(CO2)
948	movsd	%xmm15, 2 * SIZE(CO2)
949	movhps	%xmm13, 0 * SIZE(CO2, LDC)
950	movhps	%xmm15, 2 * SIZE(CO2, LDC)
951#else
952	movaps	%xmm9,  -32 * SIZE(AO)
953	movaps	%xmm11, -28 * SIZE(AO)
954	movaps	%xmm13, -24 * SIZE(AO)
955	movaps	%xmm15, -20 * SIZE(AO)
956
957	movsd	%xmm9,  0 * SIZE(CO1)
958	movhps	%xmm9,  2 * SIZE(CO1)
959	movsd	%xmm11, 0 * SIZE(CO1, LDC)
960	movhps	%xmm11, 2 * SIZE(CO1, LDC)
961	movsd	%xmm13, 0 * SIZE(CO2)
962	movhps	%xmm13, 2 * SIZE(CO2)
963	movsd	%xmm15, 0 * SIZE(CO2, LDC)
964	movhps	%xmm15, 2 * SIZE(CO2, LDC)
965#endif
966
967#ifndef LN
968	addq	$4 * SIZE, CO1
969	addq	$4 * SIZE, CO2
970#endif
971
972#if defined(LT) || defined(RN)
973	movq	K,  %rax
974	subq	KK, %rax
975	salq	$ZBASE_SHIFT, %rax
976	leaq	(AO, %rax, 2), AO
977	leaq	(BO, %rax, 4), BO
978#endif
979
980#ifdef LN
981	subq	$2, KK
982#endif
983
984#ifdef LT
985	addq	$2, KK
986#endif
987
988#ifdef RT
989       movq	K, %rax
990       salq	$1 + ZBASE_SHIFT, %rax
991       addq	%rax, AORIG
992#endif
993
994	decq	I			# i --
995	BRANCH
996	jg	.L11
997	ALIGN_4
998
999.L20:
1000	testq	$1, M
1001	BRANCH
1002	jle	.L29
1003
1004#ifdef LN
1005       movq	K, %rax
1006       salq	$ZBASE_SHIFT, %rax
1007       subq	%rax, AORIG
1008#endif
1009
1010#if defined(LN) || defined(RT)
1011	movq	AORIG, AO
1012
1013	movq	KK, %rax
1014	salq	$ZBASE_SHIFT, %rax
1015
1016	leaq	(AO, %rax, 1), AO
1017	leaq	(B,  %rax, 4), BO
1018#else
1019	movq	B, BO
1020#endif
1021
1022	xorps	%xmm1, %xmm1
1023	movddup  -32 * SIZE(AO), %xmm0
1024	xorps	%xmm2, %xmm2
1025	movaps   -32 * SIZE(BO), %xmm5
1026	xorps	%xmm3, %xmm3
1027	xorps	%xmm4, %xmm4
1028
1029	xorps	%xmm8,  %xmm8
1030	xorps	%xmm9,  %xmm9
1031	xorps	%xmm10, %xmm10
1032	xorps	%xmm11, %xmm11
1033
1034#if defined(LT) || defined(RN)
1035	movq	KK, %rax
1036#else
1037	movq	K, %rax
1038	subq	KK, %rax
1039#endif
1040	sarq	$2, %rax
1041	NOBRANCH
1042	jle	.L25
1043	ALIGN_3
1044
1045.L22:
1046	ADD1	%xmm1, %xmm8
1047	pshufd	$0xa0, %xmm5, %xmm1
1048	mulps	%xmm0, %xmm1
1049	ADD2	%xmm2, %xmm9
1050	pshufd	$0xf5, %xmm5, %xmm2
1051	movaps   -28 * SIZE(BO), %xmm5
1052	mulps	%xmm0, %xmm2
1053	ADD1	%xmm3, %xmm10
1054	pshufd	$0xa0, %xmm5, %xmm3
1055	mulps	%xmm0, %xmm3
1056	ADD2	%xmm4, %xmm11
1057	pshufd	$0xf5, %xmm5, %xmm4
1058	movaps   -24 * SIZE(BO), %xmm5
1059	mulps	%xmm0, %xmm4
1060	movddup  -30 * SIZE(AO), %xmm0
1061
1062	ADD1	%xmm1, %xmm8
1063	pshufd	$0xa0, %xmm5, %xmm1
1064	mulps	%xmm0, %xmm1
1065	ADD2	%xmm2, %xmm9
1066	pshufd	$0xf5, %xmm5, %xmm2
1067	movaps   -20 * SIZE(BO), %xmm5
1068	mulps	%xmm0, %xmm2
1069	ADD1	%xmm3, %xmm10
1070	pshufd	$0xa0, %xmm5, %xmm3
1071	mulps	%xmm0, %xmm3
1072	ADD2	%xmm4, %xmm11
1073	pshufd	$0xf5, %xmm5, %xmm4
1074	movaps   -16 * SIZE(BO), %xmm5
1075	mulps	%xmm0, %xmm4
1076	movddup  -28 * SIZE(AO), %xmm0
1077
1078	ADD1	%xmm1, %xmm8
1079	pshufd	$0xa0, %xmm5, %xmm1
1080	mulps	%xmm0, %xmm1
1081	ADD2	%xmm2, %xmm9
1082	pshufd	$0xf5, %xmm5, %xmm2
1083	movaps   -12 * SIZE(BO), %xmm5
1084	mulps	%xmm0, %xmm2
1085	ADD1	%xmm3, %xmm10
1086	pshufd	$0xa0, %xmm5, %xmm3
1087	mulps	%xmm0, %xmm3
1088	ADD2	%xmm4, %xmm11
1089	pshufd	$0xf5, %xmm5, %xmm4
1090	movaps    -8 * SIZE(BO), %xmm5
1091	mulps	%xmm0, %xmm4
1092	movddup  -26 * SIZE(AO), %xmm0
1093
1094	ADD1	%xmm1, %xmm8
1095	pshufd	$0xa0, %xmm5, %xmm1
1096	mulps	%xmm0, %xmm1
1097	ADD2	%xmm2, %xmm9
1098	pshufd	$0xf5, %xmm5, %xmm2
1099	movaps    -4 * SIZE(BO), %xmm5
1100	mulps	%xmm0, %xmm2
1101	ADD1	%xmm3, %xmm10
1102	pshufd	$0xa0, %xmm5, %xmm3
1103	mulps	%xmm0, %xmm3
1104	ADD2	%xmm4, %xmm11
1105	pshufd	$0xf5, %xmm5, %xmm4
1106	movaps     0 * SIZE(BO), %xmm5
1107	mulps	%xmm0, %xmm4
1108	movddup  -24 * SIZE(AO), %xmm0
1109
1110	subq	$-32 * SIZE, BO
1111	subq	$ -8 * SIZE, AO
1112
1113	subq	$1, %rax
1114	BRANCH
1115	jg	.L22
1116	ALIGN_3
1117
1118.L25:
1119#if defined(LT) || defined(RN)
1120	movq	KK, %rax
1121#else
1122	movq	K, %rax
1123	subq	KK, %rax
1124#endif
1125	andq	$3, %rax		# if (k & 1)
1126	BRANCH
1127	je	.L28
1128	ALIGN_3
1129
1130.L26:
1131	ADD1	%xmm1, %xmm8
1132	pshufd	$0xa0, %xmm5, %xmm1
1133	mulps	%xmm0, %xmm1
1134	ADD2	%xmm2, %xmm9
1135	pshufd	$0xf5, %xmm5, %xmm2
1136	movaps   -28 * SIZE(BO), %xmm5
1137	mulps	%xmm0, %xmm2
1138	ADD1	%xmm3, %xmm10
1139	pshufd	$0xa0, %xmm5, %xmm3
1140	mulps	%xmm0, %xmm3
1141	ADD2	%xmm4, %xmm11
1142	pshufd	$0xf5, %xmm5, %xmm4
1143	movaps   -24 * SIZE(BO), %xmm5
1144	mulps	%xmm0, %xmm4
1145	movddup  -30 * SIZE(AO), %xmm0
1146
1147	addq	$2 * SIZE, AO
1148	addq	$8 * SIZE, BO
1149
1150	subq	$1, %rax
1151	BRANCH
1152	jg	.L26
1153	ALIGN_3
1154
1155.L28:
1156#if defined(LN) || defined(RT)
1157	movq	KK, %rax
1158#ifdef LN
1159	subq	$1, %rax
1160#else
1161	subq	$4, %rax
1162#endif
1163
1164	salq	$ZBASE_SHIFT, %rax
1165
1166	movq	AORIG, AO
1167	leaq	(AO, %rax, 1), AO
1168	leaq	(B,  %rax, 4), BO
1169#endif
1170
1171	ADD1	%xmm1, %xmm8
1172	ADD2	%xmm2, %xmm9
1173	ADD1	%xmm3, %xmm10
1174	ADD2	%xmm4, %xmm11
1175
1176	pcmpeqb	%xmm0, %xmm0
1177	psllq	$63,   %xmm0
1178
1179#if defined(LN) || defined(LT)
1180
1181#ifndef CONJ
1182	xorps	%xmm0, %xmm9
1183	xorps	%xmm0, %xmm11
1184	shufps	$0xb1, %xmm9,  %xmm9
1185	shufps	$0xb1, %xmm11, %xmm11
1186#else
1187	xorps	%xmm0, %xmm8
1188	xorps	%xmm0, %xmm10
1189	shufps	$0xb1, %xmm9,  %xmm9
1190	shufps	$0xb1, %xmm11, %xmm11
1191#endif
1192
1193#else
1194
1195#ifndef CONJ
1196	xorps	%xmm0, %xmm9
1197	xorps	%xmm0, %xmm11
1198	shufps	$0xb1, %xmm9,  %xmm9
1199	shufps	$0xb1, %xmm11, %xmm11
1200#else
1201	shufps	$0xb1, %xmm9,  %xmm9
1202	shufps	$0xb1, %xmm11, %xmm11
1203	xorps	%xmm0, %xmm9
1204	xorps	%xmm0, %xmm11
1205#endif
1206
1207#endif
1208
1209	addps	%xmm9,  %xmm8
1210	addps	%xmm11, %xmm10
1211
1212#if defined(LN) || defined(LT)
1213	movaps	-32 * SIZE(BO), %xmm9
1214	movaps	-28 * SIZE(BO), %xmm11
1215
1216	subps	%xmm8,   %xmm9
1217	subps	%xmm10,  %xmm11
1218#else
1219	movaps	-32 * SIZE(AO), %xmm9
1220	movaps	-28 * SIZE(AO), %xmm13
1221
1222	subps	%xmm8,   %xmm9
1223	subps	%xmm10,  %xmm13
1224
1225	movhlps	%xmm9,  %xmm11
1226	movhlps	%xmm13, %xmm15
1227#endif
1228
1229	pcmpeqb	%xmm7, %xmm7
1230	psllq	$63,   %xmm7
1231
1232#ifndef CONJ
1233	shufps	$0xb1, %xmm7,  %xmm7
1234#endif
1235
1236#if defined(LN) || defined(LT)
1237	movsd	-32 * SIZE(AO), %xmm5
1238
1239	pshufd	$0x00, %xmm5, %xmm0
1240	pshufd	$0x55, %xmm5, %xmm1
1241
1242	pshufd	$0xb1, %xmm9,  %xmm10
1243	pshufd	$0xb1, %xmm11, %xmm12
1244
1245	xorps	 %xmm7, %xmm10
1246	xorps	 %xmm7, %xmm12
1247
1248	mulps	 %xmm0, %xmm9
1249	mulps	 %xmm1, %xmm10
1250	mulps	 %xmm0, %xmm11
1251	mulps	 %xmm1, %xmm12
1252
1253	addps	 %xmm10, %xmm9
1254	addps	 %xmm12, %xmm11
1255#endif
1256
1257#ifdef RN
1258	movaps	-32 * SIZE(BO), %xmm5
1259
1260	pshufd	$0x00, %xmm5, %xmm0
1261	pshufd	$0x55, %xmm5, %xmm1
1262
1263	pshufd	$0xb1, %xmm9, %xmm8
1264
1265	xorps	 %xmm7, %xmm8
1266
1267	mulps	 %xmm0, %xmm9
1268	mulps	 %xmm1, %xmm8
1269
1270	addps	 %xmm8, %xmm9
1271
1272	movaps	%xmm9,  %xmm3
1273	pshufd	$0xb1, %xmm9, %xmm2
1274
1275	xorps	 %xmm7, %xmm2
1276
1277	pshufd	$0xaa, %xmm5, %xmm0
1278	pshufd	$0xff, %xmm5, %xmm1
1279
1280	mulps	 %xmm3, %xmm0
1281	mulps	 %xmm2, %xmm1
1282
1283	subps	 %xmm0, %xmm11
1284	subps	 %xmm1, %xmm11
1285
1286	movaps	-28 * SIZE(BO), %xmm5
1287
1288	pshufd	$0x00, %xmm5, %xmm0
1289	pshufd	$0x55, %xmm5, %xmm1
1290
1291	mulps	 %xmm3, %xmm0
1292	mulps	 %xmm2, %xmm1
1293
1294	subps	 %xmm0, %xmm13
1295	subps	 %xmm1, %xmm13
1296
1297	pshufd	$0xaa, %xmm5, %xmm0
1298	pshufd	$0xff, %xmm5, %xmm1
1299
1300	mulps	 %xmm3, %xmm0
1301	mulps	 %xmm2, %xmm1
1302
1303	subps	 %xmm0, %xmm15
1304	subps	 %xmm1, %xmm15
1305
1306	movaps	-24 * SIZE(BO), %xmm5
1307
1308	pshufd	$0xaa, %xmm5, %xmm0
1309	pshufd	$0xff, %xmm5, %xmm1
1310
1311	pshufd	$0xb1, %xmm11, %xmm10
1312
1313	xorps	 %xmm7, %xmm10
1314
1315	mulps	 %xmm0, %xmm11
1316	mulps	 %xmm1, %xmm10
1317
1318	addps	 %xmm10, %xmm11
1319
1320	movaps	%xmm11,  %xmm3
1321	pshufd	$0xb1, %xmm11, %xmm2
1322
1323	xorps	 %xmm7, %xmm2
1324
1325	movaps	-20 * SIZE(BO), %xmm5
1326
1327	pshufd	$0x00, %xmm5, %xmm0
1328	pshufd	$0x55, %xmm5, %xmm1
1329
1330	mulps	 %xmm3, %xmm0
1331	mulps	 %xmm2, %xmm1
1332
1333	subps	 %xmm0, %xmm13
1334	subps	 %xmm1, %xmm13
1335
1336	pshufd	$0xaa, %xmm5, %xmm0
1337	pshufd	$0xff, %xmm5, %xmm1
1338
1339	mulps	 %xmm3, %xmm0
1340	mulps	 %xmm2, %xmm1
1341
1342	subps	 %xmm0, %xmm15
1343	subps	 %xmm1, %xmm15
1344
1345	movaps	-12 * SIZE(BO), %xmm5
1346
1347	pshufd	$0x00, %xmm5, %xmm0
1348	pshufd	$0x55, %xmm5, %xmm1
1349
1350	pshufd	$0xb1, %xmm13, %xmm12
1351
1352	xorps	 %xmm7, %xmm12
1353
1354	mulps	 %xmm0, %xmm13
1355	mulps	 %xmm1, %xmm12
1356
1357	addps	 %xmm12, %xmm13
1358
1359	movaps	%xmm13,  %xmm3
1360	pshufd	$0xb1, %xmm13, %xmm2
1361
1362	xorps	 %xmm7, %xmm2
1363
1364	pshufd	$0xaa, %xmm5, %xmm0
1365	pshufd	$0xff, %xmm5, %xmm1
1366
1367	mulps	 %xmm3, %xmm0
1368	mulps	 %xmm2, %xmm1
1369
1370	subps	 %xmm0, %xmm15
1371	subps	 %xmm1, %xmm15
1372
1373	movaps	 -4 * SIZE(BO), %xmm5
1374
1375	pshufd	$0xaa, %xmm5, %xmm0
1376	pshufd	$0xff, %xmm5, %xmm1
1377
1378	pshufd	$0xb1, %xmm15, %xmm14
1379
1380	xorps	 %xmm7, %xmm14
1381
1382	mulps	 %xmm0, %xmm15
1383	mulps	 %xmm1, %xmm14
1384
1385	addps	 %xmm14, %xmm15
1386#endif
1387
1388#ifdef RT
1389	movaps	 -4 * SIZE(BO), %xmm5
1390
1391	pshufd	$0xaa, %xmm5, %xmm0
1392	pshufd	$0xff, %xmm5, %xmm1
1393
1394	pshufd	$0xb1, %xmm15, %xmm14
1395
1396	xorps	 %xmm7, %xmm14
1397
1398	mulps	 %xmm0, %xmm15
1399	mulps	 %xmm1, %xmm14
1400
1401	addps	 %xmm14, %xmm15
1402
1403	movaps	%xmm15,  %xmm3
1404	pshufd	$0xb1, %xmm15, %xmm2
1405
1406	xorps	 %xmm7, %xmm2
1407
1408	pshufd	$0x00, %xmm5, %xmm0
1409	pshufd	$0x55, %xmm5, %xmm1
1410
1411	mulps	 %xmm3, %xmm0
1412	mulps	 %xmm2, %xmm1
1413
1414	subps	 %xmm0, %xmm13
1415	subps	 %xmm1, %xmm13
1416
1417	movaps	 -8 * SIZE(BO), %xmm5
1418
1419	pshufd	$0xaa, %xmm5, %xmm0
1420	pshufd	$0xff, %xmm5, %xmm1
1421
1422	mulps	 %xmm3, %xmm0
1423	mulps	 %xmm2, %xmm1
1424
1425	subps	 %xmm0, %xmm11
1426	subps	 %xmm1, %xmm11
1427
1428	pshufd	$0x00, %xmm5, %xmm0
1429	pshufd	$0x55, %xmm5, %xmm1
1430
1431	mulps	 %xmm3, %xmm0
1432	mulps	 %xmm2, %xmm1
1433
1434	subps	 %xmm0, %xmm9
1435	subps	 %xmm1, %xmm9
1436
1437	movaps	-12 * SIZE(BO), %xmm5
1438
1439	pshufd	$0x00, %xmm5, %xmm0
1440	pshufd	$0x55, %xmm5, %xmm1
1441
1442	pshufd	$0xb1, %xmm13, %xmm12
1443
1444	xorps	 %xmm7, %xmm12
1445
1446	mulps	 %xmm0, %xmm13
1447	mulps	 %xmm1, %xmm12
1448
1449	addps	 %xmm12, %xmm13
1450
1451	movaps	%xmm13,  %xmm3
1452	pshufd	$0xb1, %xmm13, %xmm2
1453
1454	xorps	 %xmm7, %xmm2
1455
1456	movaps	-16 * SIZE(BO), %xmm5
1457
1458	pshufd	$0xaa, %xmm5, %xmm0
1459	pshufd	$0xff, %xmm5, %xmm1
1460
1461	mulps	 %xmm3, %xmm0
1462	mulps	 %xmm2, %xmm1
1463
1464	subps	 %xmm0, %xmm11
1465	subps	 %xmm1, %xmm11
1466
1467	pshufd	$0x00, %xmm5, %xmm0
1468	pshufd	$0x55, %xmm5, %xmm1
1469
1470	mulps	 %xmm3, %xmm0
1471	mulps	 %xmm2, %xmm1
1472
1473	subps	 %xmm0, %xmm9
1474	subps	 %xmm1, %xmm9
1475
1476	movaps	-24 * SIZE(BO), %xmm5
1477
1478	pshufd	$0xaa, %xmm5, %xmm0
1479	pshufd	$0xff, %xmm5, %xmm1
1480
1481	pshufd	$0xb1, %xmm11, %xmm10
1482
1483	xorps	 %xmm7, %xmm10
1484
1485	mulps	 %xmm0, %xmm11
1486	mulps	 %xmm1, %xmm10
1487
1488	addps	 %xmm10, %xmm11
1489
1490	movaps	%xmm11,  %xmm3
1491	pshufd	$0xb1, %xmm11, %xmm2
1492
1493	xorps	 %xmm7, %xmm2
1494
1495	pshufd	$0x00, %xmm5, %xmm0
1496	pshufd	$0x55, %xmm5, %xmm1
1497
1498	mulps	 %xmm3, %xmm0
1499	mulps	 %xmm2, %xmm1
1500
1501	subps	 %xmm0, %xmm9
1502	subps	 %xmm1, %xmm9
1503
1504	movaps	-32 * SIZE(BO), %xmm5
1505
1506	pshufd	$0x00, %xmm5, %xmm0
1507	pshufd	$0x55, %xmm5, %xmm1
1508
1509	pshufd	$0xb1, %xmm9, %xmm8
1510
1511	xorps	 %xmm7, %xmm8
1512
1513	mulps	 %xmm0, %xmm9
1514	mulps	 %xmm1, %xmm8
1515
1516	addps	 %xmm8, %xmm9
1517#endif
1518
1519#ifdef LN
1520	subq	$2 * SIZE, CO1
1521	subq	$2 * SIZE, CO2
1522#endif
1523
1524#if defined(LN) || defined(LT)
1525	movaps	%xmm9,  -32 * SIZE(BO)
1526	movaps	%xmm11, -28 * SIZE(BO)
1527
1528	movsd	%xmm9,  (CO1)
1529	movhps	%xmm9,  (CO1, LDC)
1530	movsd	%xmm11, (CO2)
1531	movhps	%xmm11, (CO2, LDC)
1532#else
1533	movlhps %xmm11, %xmm9
1534	movlhps %xmm15, %xmm13
1535
1536	movaps	%xmm9,  -32 * SIZE(AO)
1537	movaps	%xmm13, -28 * SIZE(AO)
1538
1539	movlps	%xmm9,  (CO1)
1540	movlps	%xmm11, (CO1, LDC)
1541	movlps	%xmm13, (CO2)
1542	movlps	%xmm15, (CO2, LDC)
1543#endif
1544
1545#ifndef LN
1546	addq	$2 * SIZE, CO1
1547	addq	$2 * SIZE, CO2
1548#endif
1549
1550#if defined(LT) || defined(RN)
1551	movq	K,  %rax
1552	subq	KK, %rax
1553	salq	$ZBASE_SHIFT, %rax
1554	leaq	(AO, %rax, 1), AO
1555	leaq	(BO, %rax, 4), BO
1556#endif
1557
1558#ifdef LN
1559	subq	$1, KK
1560#endif
1561
1562#ifdef LT
1563	addq	$1, KK
1564#endif
1565
1566#ifdef RT
1567       movq	K, %rax
1568       salq	$ZBASE_SHIFT, %rax
1569       addq	%rax, AORIG
1570#endif
1571	ALIGN_4
1572
1573.L29:
1574#ifdef LN
1575       movq	K, %rax
1576       salq	$ZBASE_SHIFT, %rax
1577       leaq	(B, %rax, 4), B
1578#endif
1579
1580#if defined(LT) || defined(RN)
1581	movq	BO, B
1582#endif
1583
1584#ifdef RN
1585	addq	$4, KK
1586#endif
1587
1588#ifdef RT
1589	subq	$4, KK
1590#endif
1591
1592	subq	$1, J
1593	BRANCH
1594	jg	.L01
1595	ALIGN_4
1596
1597.L30:
1598	testq	$2, N
1599	BRANCH
1600	jle	.L50
1601
1602#if defined(LT) || defined(RN)
1603	movq	A, AO
1604#else
1605	movq	A, AORIG
1606#endif
1607
1608#ifdef RT
1609       movq	K, %rax
1610       salq	$1 + ZBASE_SHIFT, %rax
1611       subq	%rax, B
1612
1613       leaq	(, LDC, 2), %rax
1614       subq	%rax, C
1615#endif
1616
1617	movq	C, CO1
1618	leaq	(C, LDC, 1), CO2
1619#ifndef RT
1620	leaq	(C, LDC, 2), C
1621#endif
1622
1623#ifdef LN
1624	movq	OFFSET, KK
1625	addq	M, KK
1626#endif
1627
1628#ifdef LT
1629	movq	OFFSET, KK
1630#endif
1631
1632	movq	M,  I
1633	sarq	$1, I
1634	NOBRANCH
1635	jle	.L40
1636	ALIGN_4
1637
1638.L31:
1639#ifdef LN
1640       movq	K, %rax
1641       salq	$1 + ZBASE_SHIFT, %rax
1642       subq	%rax, AORIG
1643#endif
1644
1645#if defined(LN) || defined(RT)
1646	movq	AORIG, AO
1647
1648	movq	KK, %rax
1649	salq	$ZBASE_SHIFT, %rax
1650
1651	leaq	(AO, %rax, 2), AO
1652	leaq	(B,  %rax, 2), BO
1653#else
1654	movq	B, BO
1655#endif
1656
1657	xorps	%xmm1, %xmm1
1658	movaps	-32 * SIZE(AO), %xmm0
1659	xorps	%xmm2, %xmm2
1660	xorps	%xmm3, %xmm3
1661	xorps	%xmm4, %xmm4
1662
1663	xorps	%xmm8,  %xmm8
1664	prefetcht2     4 * SIZE(CO1)
1665	xorps	%xmm9,  %xmm9
1666	prefetcht2     4 * SIZE(CO2)
1667	xorps	%xmm10, %xmm10
1668	xorps	%xmm11, %xmm11
1669
1670#if defined(LT) || defined(RN)
1671	movq	KK, %rax
1672#else
1673	movq	K, %rax
1674	subq	KK, %rax
1675#endif
1676	sarq	$2, %rax
1677	NOBRANCH
1678	jle	.L35
1679	ALIGN_3
1680
1681.L32:
1682	PREFETCH	(PREFETCHSIZE +  0) * SIZE(AO)
1683
1684	ADD1	%xmm1, %xmm8
1685	movaps	-32 * SIZE(BO), %xmm1
1686	ADD2	%xmm2, %xmm9
1687	pshufd	$0xb1, %xmm1, %xmm2
1688	mulps	%xmm0, %xmm1
1689	ADD1	%xmm3, %xmm10
1690	pshufd	$0x1b, %xmm2, %xmm3
1691	mulps	%xmm0, %xmm2
1692	ADD2	%xmm4, %xmm11
1693	pshufd	$0xb1, %xmm3, %xmm4
1694	mulps	%xmm0, %xmm3
1695	mulps	%xmm0, %xmm4
1696	movaps	-28 * SIZE(AO), %xmm0
1697
1698	ADD1	%xmm1, %xmm8
1699	movaps	-28 * SIZE(BO), %xmm1
1700	ADD2	%xmm2, %xmm9
1701	pshufd	$0xb1, %xmm1, %xmm2
1702	mulps	%xmm0, %xmm1
1703	ADD1	%xmm3, %xmm10
1704	pshufd	$0x1b, %xmm2, %xmm3
1705	mulps	%xmm0, %xmm2
1706	ADD2	%xmm4, %xmm11
1707	pshufd	$0xb1, %xmm3, %xmm4
1708	mulps	%xmm0, %xmm3
1709	mulps	%xmm0, %xmm4
1710	movaps	-24 * SIZE(AO), %xmm0
1711
1712	ADD1	%xmm1, %xmm8
1713	movaps	-24 * SIZE(BO), %xmm1
1714	ADD2	%xmm2, %xmm9
1715	pshufd	$0xb1, %xmm1, %xmm2
1716	mulps	%xmm0, %xmm1
1717	ADD1	%xmm3, %xmm10
1718	pshufd	$0x1b, %xmm2, %xmm3
1719	mulps	%xmm0, %xmm2
1720	ADD2	%xmm4, %xmm11
1721	pshufd	$0xb1, %xmm3, %xmm4
1722	mulps	%xmm0, %xmm3
1723	mulps	%xmm0, %xmm4
1724	movaps	-20 * SIZE(AO), %xmm0
1725
1726	ADD1	%xmm1, %xmm8
1727	movaps	-20 * SIZE(BO), %xmm1
1728	ADD2	%xmm2, %xmm9
1729	pshufd	$0xb1, %xmm1, %xmm2
1730	mulps	%xmm0, %xmm1
1731	ADD1	%xmm3, %xmm10
1732	pshufd	$0x1b, %xmm2, %xmm3
1733	mulps	%xmm0, %xmm2
1734	ADD2	%xmm4, %xmm11
1735	pshufd	$0xb1, %xmm3, %xmm4
1736	mulps	%xmm0, %xmm3
1737	mulps	%xmm0, %xmm4
1738	movaps	-16 * SIZE(AO), %xmm0
1739
1740	subq	$-16 * SIZE, BO
1741	subq	$-16 * SIZE, AO
1742
1743	subq	$1, %rax
1744	BRANCH
1745	jg	.L32
1746	ALIGN_3
1747
1748.L35:
1749#if defined(LT) || defined(RN)
1750	movq	KK, %rax
1751#else
1752	movq	K, %rax
1753	subq	KK, %rax
1754#endif
1755	andq	$3, %rax		# if (k & 1)
1756	BRANCH
1757	je	.L38
1758	ALIGN_3
1759
1760.L36:
1761	ADD1	%xmm1, %xmm8
1762	movaps	-32 * SIZE(BO), %xmm1
1763	ADD2	%xmm2, %xmm9
1764	pshufd	$0xb1, %xmm1, %xmm2
1765	mulps	%xmm0, %xmm1
1766	ADD1	%xmm3, %xmm10
1767	pshufd	$0x1b, %xmm2, %xmm3
1768	mulps	%xmm0, %xmm2
1769	ADD2	%xmm4, %xmm11
1770	pshufd	$0xb1, %xmm3, %xmm4
1771	mulps	%xmm0, %xmm3
1772	mulps	%xmm0, %xmm4
1773	movaps	-28 * SIZE(AO), %xmm0
1774
1775	addq	$4 * SIZE, AO
1776	addq	$4 * SIZE, BO
1777
1778	subq	$1, %rax
1779	BRANCH
1780	jg	.L36
1781	ALIGN_3
1782
1783.L38:
1784#if defined(LN) || defined(RT)
1785	movq	KK, %rax
1786#ifdef LN
1787	subq	$2, %rax
1788#else
1789	subq	$2, %rax
1790#endif
1791
1792	salq	$ZBASE_SHIFT, %rax
1793
1794	movq	AORIG, AO
1795	leaq	(AO, %rax, 2), AO
1796	leaq	(B,  %rax, 2), BO
1797#endif
1798
1799	ADD1	%xmm1, %xmm8
1800	ADD2	%xmm2, %xmm9
1801	ADD1	%xmm3, %xmm10
1802	ADD2	%xmm4, %xmm11
1803
1804	pcmpeqb	%xmm0, %xmm0
1805	psllq	$63,   %xmm0
1806
1807#if defined(LN) || defined(LT)
1808
1809#ifndef CONJ
1810	xorps	%xmm0, %xmm8
1811	xorps	%xmm0, %xmm10
1812#else
1813	xorps	%xmm0, %xmm9
1814	xorps	%xmm0, %xmm11
1815#endif
1816
1817#else
1818
1819#ifndef CONJ
1820	xorps	%xmm0, %xmm8
1821	xorps	%xmm0, %xmm10
1822#else
1823	shufps	$0xb1, %xmm0,  %xmm0
1824
1825	xorps	%xmm0, %xmm9
1826	xorps	%xmm0, %xmm11
1827#endif
1828
1829#endif
1830
1831	haddps	%xmm9,  %xmm8
1832	haddps	%xmm11, %xmm10
1833
1834	shufps	$0xd8, %xmm8,  %xmm8
1835	shufps	$0xd8, %xmm10, %xmm10
1836
1837	movaps	%xmm8, %xmm9
1838	shufps	$0xe4, %xmm10, %xmm8
1839	shufps	$0xe4, %xmm9, %xmm10
1840
1841#if defined(LN) || defined(LT)
1842	movaps	%xmm8,  %xmm9
1843	movlhps	%xmm10, %xmm8
1844	movhlps %xmm9,  %xmm10
1845
1846	movaps	-32 * SIZE(BO), %xmm9
1847	movaps	-28 * SIZE(BO), %xmm11
1848
1849	subps	%xmm8,   %xmm9
1850	subps	%xmm10,  %xmm11
1851#else
1852	movaps	-32 * SIZE(AO), %xmm9
1853	movaps	-28 * SIZE(AO), %xmm11
1854
1855	subps	%xmm8,   %xmm9
1856	subps	%xmm10,  %xmm11
1857#endif
1858
1859	pcmpeqb	%xmm7, %xmm7
1860	psllq	$63,   %xmm7
1861
1862#ifndef CONJ
1863	shufps	$0xb1, %xmm7,  %xmm7
1864#endif
1865
1866#ifdef LN
1867	movaps	-28 * SIZE(AO), %xmm5
1868
1869	pshufd	$0xaa, %xmm5, %xmm0
1870	pshufd	$0xff, %xmm5, %xmm1
1871
1872	pshufd	$0xb1, %xmm11, %xmm10
1873
1874	xorps	 %xmm7, %xmm10
1875
1876	mulps	 %xmm0, %xmm11
1877	mulps	 %xmm1, %xmm10
1878
1879	addps	 %xmm10, %xmm11
1880
1881	pshufd	$0x00, %xmm5, %xmm0
1882	pshufd	$0x55, %xmm5, %xmm1
1883
1884	movaps	%xmm11, %xmm3
1885	pshufd	$0xb1, %xmm11, %xmm2
1886
1887	xorps	 %xmm7, %xmm2
1888
1889	mulps	 %xmm0, %xmm3
1890	mulps	 %xmm1, %xmm2
1891
1892	subps	 %xmm3, %xmm9
1893	subps	 %xmm2, %xmm9
1894
1895	movaps	-32 * SIZE(AO), %xmm5
1896
1897	pshufd	$0x00, %xmm5, %xmm0
1898	pshufd	$0x55, %xmm5, %xmm1
1899
1900	pshufd	$0xb1, %xmm9, %xmm10
1901
1902	xorps	 %xmm7, %xmm10
1903
1904	mulps	 %xmm0, %xmm9
1905	mulps	 %xmm1, %xmm10
1906
1907	addps	 %xmm10, %xmm9
1908#endif
1909
1910#ifdef LT
1911	movaps	-32 * SIZE(AO), %xmm5
1912
1913	pshufd	$0x00, %xmm5, %xmm0
1914	pshufd	$0x55, %xmm5, %xmm1
1915
1916	pshufd	$0xb1, %xmm9, %xmm10
1917
1918	xorps	 %xmm7, %xmm10
1919
1920	mulps	 %xmm0, %xmm9
1921	mulps	 %xmm1, %xmm10
1922
1923	addps	 %xmm10, %xmm9
1924
1925	pshufd	$0xaa, %xmm5, %xmm0
1926	pshufd	$0xff, %xmm5, %xmm1
1927
1928	movaps	%xmm9, %xmm3
1929	pshufd	$0xb1, %xmm9, %xmm2
1930
1931	xorps	 %xmm7, %xmm2
1932
1933	mulps	 %xmm0, %xmm3
1934	mulps	 %xmm1, %xmm2
1935
1936	subps	 %xmm3, %xmm11
1937	subps	 %xmm2, %xmm11
1938
1939	movaps	-28 * SIZE(AO), %xmm5
1940
1941	pshufd	$0xaa, %xmm5, %xmm0
1942	pshufd	$0xff, %xmm5, %xmm1
1943
1944	pshufd	$0xb1, %xmm11, %xmm10
1945
1946	xorps	 %xmm7, %xmm10
1947
1948	mulps	 %xmm0, %xmm11
1949	mulps	 %xmm1, %xmm10
1950
1951	addps	 %xmm10, %xmm11
1952#endif
1953
1954#ifdef RN
1955	movaps	-32 * SIZE(BO), %xmm5
1956
1957	pshufd	$0x00, %xmm5, %xmm0
1958	pshufd	$0x55, %xmm5, %xmm1
1959
1960	pshufd	$0xb1, %xmm9, %xmm8
1961
1962	xorps	 %xmm7, %xmm8
1963
1964	mulps	 %xmm0, %xmm9
1965	mulps	 %xmm1, %xmm8
1966
1967	addps	 %xmm8, %xmm9
1968
1969	movaps	%xmm9,  %xmm3
1970	pshufd	$0xb1, %xmm9, %xmm2
1971
1972	xorps	 %xmm7, %xmm2
1973
1974	pshufd	$0xaa, %xmm5, %xmm0
1975	pshufd	$0xff, %xmm5, %xmm1
1976
1977	mulps	 %xmm3, %xmm0
1978	mulps	 %xmm2, %xmm1
1979
1980	subps	 %xmm0, %xmm11
1981	subps	 %xmm1, %xmm11
1982
1983	movaps	-28 * SIZE(BO), %xmm5
1984
1985	pshufd	$0xaa, %xmm5, %xmm0
1986	pshufd	$0xff, %xmm5, %xmm1
1987
1988	pshufd	$0xb1, %xmm11, %xmm10
1989
1990	xorps	 %xmm7, %xmm10
1991
1992	mulps	 %xmm0, %xmm11
1993	mulps	 %xmm1, %xmm10
1994
1995	addps	 %xmm10, %xmm11
1996#endif
1997
1998#ifdef RT
1999	movaps	-28 * SIZE(BO), %xmm5
2000
2001	pshufd	$0xaa, %xmm5, %xmm0
2002	pshufd	$0xff, %xmm5, %xmm1
2003
2004	pshufd	$0xb1, %xmm11, %xmm10
2005
2006	xorps	 %xmm7, %xmm10
2007
2008	mulps	 %xmm0, %xmm11
2009	mulps	 %xmm1, %xmm10
2010
2011	addps	 %xmm10, %xmm11
2012
2013	movaps	%xmm11,  %xmm3
2014	pshufd	$0xb1, %xmm11, %xmm2
2015
2016	xorps	 %xmm7, %xmm2
2017
2018	pshufd	$0x00, %xmm5, %xmm0
2019	pshufd	$0x55, %xmm5, %xmm1
2020
2021	mulps	 %xmm3, %xmm0
2022	mulps	 %xmm2, %xmm1
2023
2024	subps	 %xmm0, %xmm9
2025	subps	 %xmm1, %xmm9
2026
2027	movaps	-32 * SIZE(BO), %xmm5
2028
2029	pshufd	$0x00, %xmm5, %xmm0
2030	pshufd	$0x55, %xmm5, %xmm1
2031
2032	pshufd	$0xb1, %xmm9, %xmm8
2033
2034	xorps	 %xmm7, %xmm8
2035
2036	mulps	 %xmm0, %xmm9
2037	mulps	 %xmm1, %xmm8
2038
2039	addps	 %xmm8, %xmm9
2040#endif
2041
2042#ifdef LN
2043	subq	$4 * SIZE, CO1
2044	subq	$4 * SIZE, CO2
2045#endif
2046
2047#if defined(LN) || defined(LT)
2048	movaps	%xmm9,  -32 * SIZE(BO)
2049	movaps	%xmm11, -28 * SIZE(BO)
2050
2051	movsd	%xmm9,  0 * SIZE(CO1)
2052	movsd	%xmm11, 2 * SIZE(CO1)
2053	movhps	%xmm9,  0 * SIZE(CO2)
2054	movhps	%xmm11, 2 * SIZE(CO2)
2055#else
2056	movaps	%xmm9,  -32 * SIZE(AO)
2057	movaps	%xmm11, -28 * SIZE(AO)
2058
2059	movsd	%xmm9,  0 * SIZE(CO1)
2060	movhps	%xmm9,  2 * SIZE(CO1)
2061	movsd	%xmm11, 0 * SIZE(CO2)
2062	movhps	%xmm11, 2 * SIZE(CO2)
2063#endif
2064
2065#ifndef LN
2066	addq	$4 * SIZE, CO1
2067	addq	$4 * SIZE, CO2
2068#endif
2069
2070#if defined(LT) || defined(RN)
2071	movq	K,  %rax
2072	subq	KK, %rax
2073	salq	$ZBASE_SHIFT, %rax
2074	leaq	(AO, %rax, 2), AO
2075	leaq	(BO, %rax, 2), BO
2076#endif
2077
2078#ifdef LN
2079	subq	$2, KK
2080#endif
2081
2082#ifdef LT
2083	addq	$2, KK
2084#endif
2085
2086#ifdef RT
2087       movq	K, %rax
2088       salq	$1 + ZBASE_SHIFT, %rax
2089       addq	%rax, AORIG
2090#endif
2091
2092	decq	I			# i --
2093	BRANCH
2094	jg	.L31
2095	ALIGN_4
2096
2097.L40:
2098	testq	$1, M
2099	BRANCH
2100	jle	.L49
2101
2102#ifdef LN
2103       movq	K, %rax
2104       salq	$ZBASE_SHIFT, %rax
2105       subq	%rax, AORIG
2106#endif
2107
2108#if defined(LN) || defined(RT)
2109	movq	AORIG, AO
2110
2111	movq	KK, %rax
2112	salq	$ZBASE_SHIFT, %rax
2113
2114	leaq	(AO, %rax, 1), AO
2115	leaq	(B,  %rax, 2), BO
2116#else
2117	movq	B, BO
2118#endif
2119
2120	xorps	%xmm1, %xmm1
2121	movddup  -32 * SIZE(AO), %xmm0
2122	xorps	%xmm2, %xmm2
2123	movaps   -32 * SIZE(BO), %xmm5
2124	xorps	%xmm3, %xmm3
2125	xorps	%xmm4, %xmm4
2126
2127	xorps	%xmm8,  %xmm8
2128	xorps	%xmm9,  %xmm9
2129	xorps	%xmm10, %xmm10
2130	xorps	%xmm11, %xmm11
2131
2132#if defined(LT) || defined(RN)
2133	movq	KK, %rax
2134#else
2135	movq	K, %rax
2136	subq	KK, %rax
2137#endif
2138	sarq	$2, %rax
2139	NOBRANCH
2140	jle	.L45
2141	ALIGN_3
2142
2143.L42:
2144	ADD1	%xmm1, %xmm8
2145	pshufd	$0xa0, %xmm5, %xmm1
2146	mulps	%xmm0, %xmm1
2147	ADD2	%xmm2, %xmm9
2148	pshufd	$0xf5, %xmm5, %xmm2
2149	movaps   -28 * SIZE(BO), %xmm5
2150	mulps	%xmm0, %xmm2
2151	movddup  -30 * SIZE(AO), %xmm0
2152
2153	ADD1	%xmm1, %xmm8
2154	pshufd	$0xa0, %xmm5, %xmm1
2155	mulps	%xmm0, %xmm1
2156	ADD2	%xmm2, %xmm9
2157	pshufd	$0xf5, %xmm5, %xmm2
2158	movaps   -24 * SIZE(BO), %xmm5
2159	mulps	%xmm0, %xmm2
2160	movddup  -28 * SIZE(AO), %xmm0
2161
2162	ADD1	%xmm1, %xmm8
2163	pshufd	$0xa0, %xmm5, %xmm1
2164	mulps	%xmm0, %xmm1
2165	ADD2	%xmm2, %xmm9
2166	pshufd	$0xf5, %xmm5, %xmm2
2167	movaps   -20 * SIZE(BO), %xmm5
2168	mulps	%xmm0, %xmm2
2169	movddup  -26 * SIZE(AO), %xmm0
2170
2171	ADD1	%xmm1, %xmm8
2172	pshufd	$0xa0, %xmm5, %xmm1
2173	mulps	%xmm0, %xmm1
2174	ADD2	%xmm2, %xmm9
2175	pshufd	$0xf5, %xmm5, %xmm2
2176	movaps   -16 * SIZE(BO), %xmm5
2177	mulps	%xmm0, %xmm2
2178	movddup  -24 * SIZE(AO), %xmm0
2179
2180	subq	$-16 * SIZE, BO
2181	subq	$ -8 * SIZE, AO
2182
2183	subq	$1, %rax
2184	BRANCH
2185	jg	.L42
2186	ALIGN_3
2187
2188.L45:
2189#if defined(LT) || defined(RN)
2190	movq	KK, %rax
2191#else
2192	movq	K, %rax
2193	subq	KK, %rax
2194#endif
2195	andq	$3, %rax		# if (k & 1)
2196	BRANCH
2197	je	.L48
2198	ALIGN_3
2199
2200.L46:
2201	ADD1	%xmm1, %xmm8
2202	pshufd	$0xa0, %xmm5, %xmm1
2203	mulps	%xmm0, %xmm1
2204	ADD2	%xmm2, %xmm9
2205	pshufd	$0xf5, %xmm5, %xmm2
2206	movaps   -28 * SIZE(BO), %xmm5
2207	mulps	%xmm0, %xmm2
2208	movddup  -30 * SIZE(AO), %xmm0
2209
2210	addq	$2 * SIZE, AO
2211	addq	$4 * SIZE, BO
2212
2213	subq	$1, %rax
2214	BRANCH
2215	jg	.L46
2216	ALIGN_3
2217
2218.L48:
2219#if defined(LN) || defined(RT)
2220	movq	KK, %rax
2221#ifdef LN
2222	subq	$1, %rax
2223#else
2224	subq	$2, %rax
2225#endif
2226
2227	salq	$ZBASE_SHIFT, %rax
2228
2229	movq	AORIG, AO
2230	leaq	(AO, %rax, 1), AO
2231	leaq	(B,  %rax, 2), BO
2232#endif
2233
2234	ADD1	%xmm1, %xmm8
2235	ADD2	%xmm2, %xmm9
2236
2237	pcmpeqb	%xmm0, %xmm0
2238	psllq	$63,   %xmm0
2239
2240#if defined(LN) || defined(LT)
2241
2242#ifndef CONJ
2243	xorps	%xmm0, %xmm9
2244	shufps	$0xb1, %xmm9,  %xmm9
2245#else
2246	xorps	%xmm0, %xmm8
2247	shufps	$0xb1, %xmm9,  %xmm9
2248#endif
2249
2250#else
2251
2252#ifndef CONJ
2253	xorps	%xmm0, %xmm9
2254	shufps	$0xb1, %xmm9,  %xmm9
2255#else
2256	shufps	$0xb1, %xmm9,  %xmm9
2257	xorps	%xmm0, %xmm9
2258#endif
2259
2260#endif
2261
2262	addps	%xmm9,  %xmm8
2263
2264#if defined(LN) || defined(LT)
2265	movaps	-32 * SIZE(BO), %xmm9
2266
2267	subps	%xmm8,   %xmm9
2268#else
2269	movaps	-32 * SIZE(AO), %xmm9
2270
2271	subps	%xmm8, %xmm9
2272	movhlps %xmm9, %xmm11
2273#endif
2274
2275	pcmpeqb	%xmm7, %xmm7
2276	psllq	$63,   %xmm7
2277
2278#ifndef CONJ
2279	shufps	$0xb1, %xmm7,  %xmm7
2280#endif
2281
2282#if defined(LN) || defined(LT)
2283	movsd	-32 * SIZE(AO), %xmm5
2284
2285	pshufd	$0x00, %xmm5, %xmm0
2286	pshufd	$0x55, %xmm5, %xmm1
2287
2288	pshufd	$0xb1, %xmm9, %xmm10
2289
2290	xorps	 %xmm7, %xmm10
2291
2292	mulps	 %xmm0, %xmm9
2293	mulps	 %xmm1, %xmm10
2294
2295	addps	 %xmm10, %xmm9
2296#endif
2297
2298#ifdef RN
2299	movaps	-32 * SIZE(BO), %xmm5
2300
2301	pshufd	$0x00, %xmm5, %xmm0
2302	pshufd	$0x55, %xmm5, %xmm1
2303
2304	pshufd	$0xb1, %xmm9, %xmm8
2305
2306	xorps	 %xmm7, %xmm8
2307
2308	mulps	 %xmm0, %xmm9
2309	mulps	 %xmm1, %xmm8
2310
2311	addps	 %xmm8, %xmm9
2312
2313	movaps	%xmm9,  %xmm3
2314	pshufd	$0xb1, %xmm9, %xmm2
2315
2316	xorps	 %xmm7, %xmm2
2317
2318	pshufd	$0xaa, %xmm5, %xmm0
2319	pshufd	$0xff, %xmm5, %xmm1
2320
2321	mulps	 %xmm3, %xmm0
2322	mulps	 %xmm2, %xmm1
2323
2324	subps	 %xmm0, %xmm11
2325	subps	 %xmm1, %xmm11
2326
2327	movaps	-28 * SIZE(BO), %xmm5
2328
2329	pshufd	$0xaa, %xmm5, %xmm0
2330	pshufd	$0xff, %xmm5, %xmm1
2331
2332	pshufd	$0xb1, %xmm11, %xmm10
2333
2334	xorps	 %xmm7, %xmm10
2335
2336	mulps	 %xmm0, %xmm11
2337	mulps	 %xmm1, %xmm10
2338
2339	addps	 %xmm10, %xmm11
2340#endif
2341
2342#ifdef RT
2343	movaps	-28 * SIZE(BO), %xmm5
2344
2345	pshufd	$0xaa, %xmm5, %xmm0
2346	pshufd	$0xff, %xmm5, %xmm1
2347
2348	pshufd	$0xb1, %xmm11, %xmm10
2349
2350	xorps	 %xmm7, %xmm10
2351
2352	mulps	 %xmm0, %xmm11
2353	mulps	 %xmm1, %xmm10
2354
2355	addps	 %xmm10, %xmm11
2356
2357	movaps	%xmm11,  %xmm3
2358	pshufd	$0xb1, %xmm11, %xmm2
2359
2360	xorps	 %xmm7, %xmm2
2361
2362	pshufd	$0x00, %xmm5, %xmm0
2363	pshufd	$0x55, %xmm5, %xmm1
2364
2365	mulps	 %xmm3, %xmm0
2366	mulps	 %xmm2, %xmm1
2367
2368	subps	 %xmm0, %xmm9
2369	subps	 %xmm1, %xmm9
2370
2371	movaps	-32 * SIZE(BO), %xmm5
2372
2373	pshufd	$0x00, %xmm5, %xmm0
2374	pshufd	$0x55, %xmm5, %xmm1
2375
2376	pshufd	$0xb1, %xmm9, %xmm8
2377
2378	xorps	 %xmm7, %xmm8
2379
2380	mulps	 %xmm0, %xmm9
2381	mulps	 %xmm1, %xmm8
2382
2383	addps	 %xmm8, %xmm9
2384#endif
2385
2386#ifdef LN
2387	subq	$2 * SIZE, CO1
2388	subq	$2 * SIZE, CO2
2389#endif
2390
2391#if defined(LN) || defined(LT)
2392	movaps	%xmm9,  -32 * SIZE(BO)
2393
2394	movlps	%xmm9,  (CO1)
2395	movhps	%xmm9,  (CO2)
2396#else
2397	movlps	%xmm9,  -32 * SIZE(AO)
2398	movlps	%xmm11, -30 * SIZE(AO)
2399
2400	movlps	%xmm9,  (CO1)
2401	movlps	%xmm11, (CO2)
2402#endif
2403
2404#ifndef LN
2405	addq	$2 * SIZE, CO1
2406	addq	$2 * SIZE, CO2
2407#endif
2408
2409#if defined(LT) || defined(RN)
2410	movq	K,  %rax
2411	subq	KK, %rax
2412	salq	$ZBASE_SHIFT, %rax
2413	leaq	(AO, %rax, 1), AO
2414	leaq	(BO, %rax, 2), BO
2415#endif
2416
2417#ifdef LN
2418	subq	$1, KK
2419#endif
2420
2421#ifdef LT
2422	addq	$1, KK
2423#endif
2424
2425#ifdef RT
2426       movq	K, %rax
2427       salq	$ZBASE_SHIFT, %rax
2428       addq	%rax, AORIG
2429#endif
2430	ALIGN_4
2431
2432.L49:
2433#ifdef LN
2434       movq	K, %rax
2435       salq	$ZBASE_SHIFT, %rax
2436       leaq	(B, %rax, 2), B
2437#endif
2438
2439#if defined(LT) || defined(RN)
2440	movq	BO, B
2441#endif
2442
2443#ifdef RN
2444	addq	$2, KK
2445#endif
2446
2447#ifdef RT
2448	subq	$2, KK
2449#endif
2450	ALIGN_4
2451
2452.L50:
2453	testq	$1, N
2454	BRANCH
2455	jle	.L999
2456
2457#if defined(LT) || defined(RN)
2458	movq	A, AO
2459#else
2460	movq	A, AORIG
2461#endif
2462
2463#ifdef RT
2464       movq	K, %rax
2465       salq	$ZBASE_SHIFT, %rax
2466       subq	%rax, B
2467
2468       subq	LDC, C
2469#endif
2470
2471	movq	C, CO1
2472#ifndef RT
2473	addq	LDC, C
2474#endif
2475
2476#ifdef LN
2477	movq	OFFSET, KK
2478	addq	M, KK
2479#endif
2480
2481#ifdef LT
2482	movq	OFFSET, KK
2483#endif
2484
2485	movq	M,  I
2486	sarq	$1, I
2487	NOBRANCH
2488	jle	.L60
2489	ALIGN_4
2490
2491.L51:
2492#ifdef LN
2493       movq	K, %rax
2494       salq	$1 + ZBASE_SHIFT, %rax
2495       subq	%rax, AORIG
2496#endif
2497
2498#if defined(LN) || defined(RT)
2499	movq	AORIG, AO
2500
2501	movq	KK, %rax
2502	salq	$ZBASE_SHIFT, %rax
2503
2504	leaq	(AO, %rax, 2), AO
2505	leaq	(B,  %rax, 1), BO
2506#else
2507	movq	B, BO
2508#endif
2509
2510	xorps	%xmm1, %xmm1
2511	movaps	-32 * SIZE(AO), %xmm0
2512	xorps	%xmm2, %xmm2
2513	xorps	%xmm3, %xmm3
2514	xorps	%xmm4, %xmm4
2515
2516	xorps	%xmm8,  %xmm8
2517	prefetcht2     4 * SIZE(CO1)
2518	xorps	%xmm9,  %xmm9
2519	xorps	%xmm10, %xmm10
2520	xorps	%xmm11, %xmm11
2521
2522#if defined(LT) || defined(RN)
2523	movq	KK, %rax
2524#else
2525	movq	K, %rax
2526	subq	KK, %rax
2527#endif
2528	sarq	$2, %rax
2529	NOBRANCH
2530	jle	.L55
2531	ALIGN_3
2532
2533.L52:
2534	PREFETCH	(PREFETCHSIZE +  0) * SIZE(AO)
2535
2536	ADD1	%xmm1, %xmm8
2537	movddup	-32 * SIZE(BO), %xmm1
2538	ADD2	%xmm2, %xmm9
2539	pshufd	$0xb1, %xmm1, %xmm2
2540	mulps	%xmm0, %xmm1
2541	mulps	%xmm0, %xmm2
2542	movaps	-28 * SIZE(AO), %xmm0
2543
2544	ADD1	%xmm1, %xmm8
2545	movddup	-30 * SIZE(BO), %xmm1
2546	ADD2	%xmm2, %xmm9
2547	pshufd	$0xb1, %xmm1, %xmm2
2548	mulps	%xmm0, %xmm1
2549	mulps	%xmm0, %xmm2
2550	movaps	-24 * SIZE(AO), %xmm0
2551
2552	ADD1	%xmm1, %xmm8
2553	movddup	-28 * SIZE(BO), %xmm1
2554	ADD2	%xmm2, %xmm9
2555	pshufd	$0xb1, %xmm1, %xmm2
2556	mulps	%xmm0, %xmm1
2557	mulps	%xmm0, %xmm2
2558	movaps	-20 * SIZE(AO), %xmm0
2559
2560	ADD1	%xmm1, %xmm8
2561	movddup	-26 * SIZE(BO), %xmm1
2562	ADD2	%xmm2, %xmm9
2563	pshufd	$0xb1, %xmm1, %xmm2
2564	mulps	%xmm0, %xmm1
2565	mulps	%xmm0, %xmm2
2566	movaps	-16 * SIZE(AO), %xmm0
2567
2568	subq	$ -8 * SIZE, BO
2569	subq	$-16 * SIZE, AO
2570
2571	subq	$1, %rax
2572	BRANCH
2573	jg	.L52
2574	ALIGN_3
2575
2576.L55:
2577#if defined(LT) || defined(RN)
2578	movq	KK, %rax
2579#else
2580	movq	K, %rax
2581	subq	KK, %rax
2582#endif
2583	andq	$3, %rax		# if (k & 1)
2584	BRANCH
2585	je	.L58
2586	ALIGN_3
2587
2588.L56:
2589	ADD1	%xmm1, %xmm8
2590	movddup	-32 * SIZE(BO), %xmm1
2591	ADD2	%xmm2, %xmm9
2592	pshufd	$0xb1, %xmm1, %xmm2
2593	mulps	%xmm0, %xmm1
2594	mulps	%xmm0, %xmm2
2595	movaps	-28 * SIZE(AO), %xmm0
2596
2597	addq	$4 * SIZE, AO
2598	addq	$2 * SIZE, BO
2599
2600	subq	$1, %rax
2601	BRANCH
2602	jg	.L56
2603	ALIGN_3
2604
2605.L58:
2606#if defined(LN) || defined(RT)
2607	movq	KK, %rax
2608#ifdef LN
2609	subq	$2, %rax
2610#else
2611	subq	$1, %rax
2612#endif
2613
2614	salq	$ZBASE_SHIFT, %rax
2615
2616	movq	AORIG, AO
2617	leaq	(AO, %rax, 2), AO
2618	leaq	(B,  %rax, 1), BO
2619#endif
2620
2621	ADD1	%xmm1, %xmm8
2622	ADD2	%xmm2, %xmm9
2623
2624	pcmpeqb	%xmm0, %xmm0
2625	psllq	$63,   %xmm0
2626
2627#if defined(LN) || defined(LT)
2628
2629#ifndef CONJ
2630	xorps	%xmm0, %xmm8
2631#else
2632	xorps	%xmm0, %xmm9
2633#endif
2634
2635#else
2636
2637#ifndef CONJ
2638	xorps	%xmm0, %xmm8
2639#else
2640	shufps	$0xb1, %xmm0,  %xmm0
2641
2642	xorps	%xmm0, %xmm9
2643#endif
2644
2645#endif
2646
2647	haddps	%xmm9,  %xmm8
2648
2649	shufps	$0xd8, %xmm8,  %xmm8
2650
2651#if defined(LN) || defined(LT)
2652	movaps	-32 * SIZE(BO), %xmm9
2653
2654	subps	%xmm8, %xmm9
2655	movhlps %xmm9, %xmm11
2656#else
2657	movaps	-32 * SIZE(AO), %xmm9
2658
2659	subps	%xmm8, %xmm9
2660#endif
2661
2662	pcmpeqb	%xmm7, %xmm7
2663	psllq	$63,   %xmm7
2664
2665#ifndef CONJ
2666	shufps	$0xb1, %xmm7,  %xmm7
2667#endif
2668
2669#ifdef LN
2670	movaps	-28 * SIZE(AO), %xmm5
2671
2672	pshufd	$0xaa, %xmm5, %xmm0
2673	pshufd	$0xff, %xmm5, %xmm1
2674
2675	pshufd	$0xb1, %xmm11, %xmm10
2676
2677	xorps	 %xmm7, %xmm10
2678
2679	mulps	 %xmm0, %xmm11
2680	mulps	 %xmm1, %xmm10
2681
2682	addps	 %xmm10, %xmm11
2683
2684	pshufd	$0x00, %xmm5, %xmm0
2685	pshufd	$0x55, %xmm5, %xmm1
2686
2687	movaps	%xmm11, %xmm3
2688	pshufd	$0xb1, %xmm11, %xmm2
2689
2690	xorps	 %xmm7, %xmm2
2691
2692	mulps	 %xmm0, %xmm3
2693	mulps	 %xmm1, %xmm2
2694
2695	subps	 %xmm3, %xmm9
2696	subps	 %xmm2, %xmm9
2697
2698	movaps	-32 * SIZE(AO), %xmm5
2699
2700	pshufd	$0x00, %xmm5, %xmm0
2701	pshufd	$0x55, %xmm5, %xmm1
2702
2703	pshufd	$0xb1, %xmm9, %xmm10
2704
2705	xorps	 %xmm7, %xmm10
2706
2707	mulps	 %xmm0, %xmm9
2708	mulps	 %xmm1, %xmm10
2709
2710	addps	 %xmm10, %xmm9
2711#endif
2712
2713#ifdef LT
2714	movaps	-32 * SIZE(AO), %xmm5
2715
2716	pshufd	$0x00, %xmm5, %xmm0
2717	pshufd	$0x55, %xmm5, %xmm1
2718
2719	pshufd	$0xb1, %xmm9, %xmm10
2720
2721	xorps	 %xmm7, %xmm10
2722
2723	mulps	 %xmm0, %xmm9
2724	mulps	 %xmm1, %xmm10
2725
2726	addps	 %xmm10, %xmm9
2727
2728	pshufd	$0xaa, %xmm5, %xmm0
2729	pshufd	$0xff, %xmm5, %xmm1
2730
2731	movaps	%xmm9, %xmm3
2732	pshufd	$0xb1, %xmm9, %xmm2
2733
2734	xorps	 %xmm7, %xmm2
2735
2736	mulps	 %xmm0, %xmm3
2737	mulps	 %xmm1, %xmm2
2738
2739	subps	 %xmm3, %xmm11
2740	subps	 %xmm2, %xmm11
2741
2742	movaps	-28 * SIZE(AO), %xmm5
2743
2744	pshufd	$0xaa, %xmm5, %xmm0
2745	pshufd	$0xff, %xmm5, %xmm1
2746
2747	pshufd	$0xb1, %xmm11, %xmm10
2748
2749	xorps	 %xmm7, %xmm10
2750
2751	mulps	 %xmm0, %xmm11
2752	mulps	 %xmm1, %xmm10
2753
2754	addps	 %xmm10, %xmm11
2755#endif
2756
2757#if defined(RN) || defined(RT)
2758	movaps	-32 * SIZE(BO), %xmm5
2759
2760	pshufd	$0x00, %xmm5, %xmm0
2761	pshufd	$0x55, %xmm5, %xmm1
2762
2763	pshufd	$0xb1, %xmm9, %xmm8
2764
2765	xorps	 %xmm7, %xmm8
2766
2767	mulps	 %xmm0, %xmm9
2768	mulps	 %xmm1, %xmm8
2769
2770	addps	 %xmm8, %xmm9
2771#endif
2772
2773#ifdef LN
2774	subq	$4 * SIZE, CO1
2775#endif
2776
2777#if defined(LN) || defined(LT)
2778	movlps	%xmm9,  -32 * SIZE(BO)
2779	movlps	%xmm11, -30 * SIZE(BO)
2780
2781	movlps	%xmm9,  0 * SIZE(CO1)
2782	movlps	%xmm11, 2 * SIZE(CO1)
2783#else
2784	movaps	%xmm9,  -32 * SIZE(AO)
2785
2786	movlps	%xmm9,  0 * SIZE(CO1)
2787	movhps	%xmm9,  2 * SIZE(CO1)
2788#endif
2789
2790#ifndef LN
2791	addq	$4 * SIZE, CO1
2792#endif
2793
2794#if defined(LT) || defined(RN)
2795	movq	K,  %rax
2796	subq	KK, %rax
2797	salq	$ZBASE_SHIFT, %rax
2798	leaq	(AO, %rax, 2), AO
2799	leaq	(BO, %rax, 1), BO
2800#endif
2801
2802#ifdef LN
2803	subq	$2, KK
2804#endif
2805
2806#ifdef LT
2807	addq	$2, KK
2808#endif
2809
2810#ifdef RT
2811       movq	K, %rax
2812       salq	$1 + ZBASE_SHIFT, %rax
2813       addq	%rax, AORIG
2814#endif
2815
2816	decq	I			# i --
2817	BRANCH
2818	jg	.L51
2819	ALIGN_4
2820
2821.L60:
2822	testq	$1, M
2823	BRANCH
2824	jle	.L69
2825
2826#ifdef LN
2827       movq	K, %rax
2828       salq	$ZBASE_SHIFT, %rax
2829       subq	%rax, AORIG
2830#endif
2831
2832#if defined(LN) || defined(RT)
2833	movq	AORIG, AO
2834
2835	movq	KK, %rax
2836	salq	$ZBASE_SHIFT, %rax
2837
2838	leaq	(AO, %rax, 1), AO
2839	leaq	(B,  %rax, 1), BO
2840#else
2841	movq	B, BO
2842#endif
2843
2844	xorps	%xmm1, %xmm1
2845	movddup  -32 * SIZE(AO), %xmm0
2846	xorps	%xmm2, %xmm2
2847	movsd   -32 * SIZE(BO), %xmm5
2848	xorps	%xmm8,  %xmm8
2849	xorps	%xmm9,  %xmm9
2850
2851#if defined(LT) || defined(RN)
2852	movq	KK, %rax
2853#else
2854	movq	K, %rax
2855	subq	KK, %rax
2856#endif
2857	sarq	$2, %rax
2858	NOBRANCH
2859	jle	.L65
2860	ALIGN_3
2861
2862.L62:
2863	ADD1	%xmm1, %xmm8
2864	pshufd	$0xa0, %xmm5, %xmm1
2865	mulps	%xmm0, %xmm1
2866	ADD2	%xmm2, %xmm9
2867	pshufd	$0xf5, %xmm5, %xmm2
2868	movsd   -30 * SIZE(BO), %xmm5
2869	mulps	%xmm0, %xmm2
2870	movddup -30 * SIZE(AO), %xmm0
2871
2872	ADD1	%xmm1, %xmm8
2873	pshufd	$0xa0, %xmm5, %xmm1
2874	mulps	%xmm0, %xmm1
2875	ADD2	%xmm2, %xmm9
2876	pshufd	$0xf5, %xmm5, %xmm2
2877	movsd   -28 * SIZE(BO), %xmm5
2878	mulps	%xmm0, %xmm2
2879	movddup -28 * SIZE(AO), %xmm0
2880
2881	ADD1	%xmm1, %xmm8
2882	pshufd	$0xa0, %xmm5, %xmm1
2883	mulps	%xmm0, %xmm1
2884	ADD2	%xmm2, %xmm9
2885	pshufd	$0xf5, %xmm5, %xmm2
2886	movsd   -26 * SIZE(BO), %xmm5
2887	mulps	%xmm0, %xmm2
2888	movddup -26 * SIZE(AO), %xmm0
2889
2890	ADD1	%xmm1, %xmm8
2891	pshufd	$0xa0, %xmm5, %xmm1
2892	mulps	%xmm0, %xmm1
2893	ADD2	%xmm2, %xmm9
2894	pshufd	$0xf5, %xmm5, %xmm2
2895	movsd   -24 * SIZE(BO), %xmm5
2896	mulps	%xmm0, %xmm2
2897	movddup -24 * SIZE(AO), %xmm0
2898
2899	subq	$-8 * SIZE, BO
2900	subq	$-8 * SIZE, AO
2901
2902	subq	$1, %rax
2903	BRANCH
2904	jg	.L62
2905	ALIGN_3
2906
2907.L65:
2908#if defined(LT) || defined(RN)
2909	movq	KK, %rax
2910#else
2911	movq	K, %rax
2912	subq	KK, %rax
2913#endif
2914	andq	$3, %rax		# if (k & 1)
2915	BRANCH
2916	je	.L68
2917	ALIGN_3
2918
2919.L66:
2920	ADD1	%xmm1, %xmm8
2921	pshufd	$0xa0, %xmm5, %xmm1
2922	mulps	%xmm0, %xmm1
2923	ADD2	%xmm2, %xmm9
2924	pshufd	$0xf5, %xmm5, %xmm2
2925	movsd   -30 * SIZE(BO), %xmm5
2926	mulps	%xmm0, %xmm2
2927	movddup -30 * SIZE(AO), %xmm0
2928
2929	addq	$2 * SIZE, AO
2930	addq	$2 * SIZE, BO
2931
2932	subq	$1, %rax
2933	BRANCH
2934	jg	.L66
2935	ALIGN_3
2936
2937.L68:
2938#if defined(LN) || defined(RT)
2939	movq	KK, %rax
2940	subq	$1, %rax
2941
2942	salq	$ZBASE_SHIFT, %rax
2943
2944	movq	AORIG, AO
2945	leaq	(AO, %rax, 1), AO
2946	leaq	(B,  %rax, 1), BO
2947#endif
2948
2949	ADD1	%xmm1, %xmm8
2950	ADD2	%xmm2, %xmm9
2951
2952	pcmpeqb	%xmm0, %xmm0
2953	psllq	$63,   %xmm0
2954
2955#if defined(LN) || defined(LT)
2956
2957#ifndef CONJ
2958	xorps	%xmm0, %xmm9
2959	shufps	$0xb1, %xmm9,  %xmm9
2960#else
2961	xorps	%xmm0, %xmm8
2962	shufps	$0xb1, %xmm9,  %xmm9
2963#endif
2964
2965#else
2966
2967#ifndef CONJ
2968	xorps	%xmm0, %xmm9
2969	shufps	$0xb1, %xmm9,  %xmm9
2970#else
2971	shufps	$0xb1, %xmm9,  %xmm9
2972	xorps	%xmm0, %xmm9
2973#endif
2974
2975#endif
2976
2977	addps	%xmm9,  %xmm8
2978
2979#if defined(LN) || defined(LT)
2980	movsd	-32 * SIZE(BO), %xmm9
2981#else
2982	movsd	-32 * SIZE(AO), %xmm9
2983#endif
2984
2985	subps	%xmm8, %xmm9
2986
2987	pcmpeqb	%xmm7, %xmm7
2988	psllq	$63,   %xmm7
2989
2990#ifndef CONJ
2991	shufps	$0xb1, %xmm7,  %xmm7
2992#endif
2993
2994#if defined(LN) || defined(LT)
2995	movsd	-32 * SIZE(AO), %xmm5
2996#endif
2997
2998#if defined(RN) || defined(RT)
2999	movsd	-32 * SIZE(BO), %xmm5
3000#endif
3001
3002	pshufd	$0x00, %xmm5, %xmm0
3003	pshufd	$0x55, %xmm5, %xmm1
3004
3005	pshufd	$0xb1, %xmm9, %xmm10
3006
3007	xorps	 %xmm7, %xmm10
3008
3009	mulps	 %xmm0, %xmm9
3010	mulps	 %xmm1, %xmm10
3011
3012	addps	 %xmm10, %xmm9
3013
3014#ifdef LN
3015	subq	$2 * SIZE, CO1
3016#endif
3017
3018#if defined(LN) || defined(LT)
3019	movlps	%xmm9,  -32 * SIZE(BO)
3020#else
3021	movlps	%xmm9,  -32 * SIZE(AO)
3022#endif
3023
3024	movlps	%xmm9,  (CO1)
3025
3026#ifndef LN
3027	addq	$2 * SIZE, CO1
3028#endif
3029
3030#if defined(LT) || defined(RN)
3031	movq	K,  %rax
3032	subq	KK, %rax
3033	salq	$ZBASE_SHIFT, %rax
3034	leaq	(AO, %rax, 1), AO
3035	leaq	(BO, %rax, 1), BO
3036#endif
3037
3038#ifdef LN
3039	subq	$1, KK
3040#endif
3041
3042#ifdef LT
3043	addq	$1, KK
3044#endif
3045
3046#ifdef RT
3047       movq	K, %rax
3048       salq	$ZBASE_SHIFT, %rax
3049       addq	%rax, AORIG
3050#endif
3051	ALIGN_4
3052
3053.L69:
3054#ifdef LN
3055       movq	K, %rax
3056       salq	$ZBASE_SHIFT, %rax
3057       leaq	(B, %rax, 1), B
3058#endif
3059
3060#if defined(LT) || defined(RN)
3061	movq	BO, B
3062#endif
3063
3064#ifdef RN
3065	addq	$1, KK
3066#endif
3067
3068#ifdef RT
3069	subq	$1, KK
3070#endif
3071	ALIGN_4
3072
3073.L999:
3074	movq	  0(%rsp), %rbx
3075	movq	  8(%rsp), %rbp
3076	movq	 16(%rsp), %r12
3077	movq	 24(%rsp), %r13
3078	movq	 32(%rsp), %r14
3079	movq	 40(%rsp), %r15
3080
3081#ifdef WINDOWS_ABI
3082	movq	 48(%rsp), %rdi
3083	movq	 56(%rsp), %rsi
3084	movups	 64(%rsp), %xmm6
3085	movups	 80(%rsp), %xmm7
3086	movups	 96(%rsp), %xmm8
3087	movups	112(%rsp), %xmm9
3088	movups	128(%rsp), %xmm10
3089	movups	144(%rsp), %xmm11
3090	movups	160(%rsp), %xmm12
3091	movups	176(%rsp), %xmm13
3092	movups	192(%rsp), %xmm14
3093	movups	208(%rsp), %xmm15
3094#endif
3095
3096	addq	$STACKSIZE, %rsp
3097	ret
3098
3099	EPILOGUE
3100