1/*********************************************************************/
2/* Copyright 2009, 2010 The University of Texas at Austin.           */
3/* All rights reserved.                                              */
4/*                                                                   */
5/* Redistribution and use in source and binary forms, with or        */
6/* without modification, are permitted provided that the following   */
7/* conditions are met:                                               */
8/*                                                                   */
9/*   1. Redistributions of source code must retain the above         */
10/*      copyright notice, this list of conditions and the following  */
11/*      disclaimer.                                                  */
12/*                                                                   */
13/*   2. Redistributions in binary form must reproduce the above      */
14/*      copyright notice, this list of conditions and the following  */
15/*      disclaimer in the documentation and/or other materials       */
16/*      provided with the distribution.                              */
17/*                                                                   */
18/*    THIS  SOFTWARE IS PROVIDED  BY THE  UNIVERSITY OF  TEXAS AT    */
19/*    AUSTIN  ``AS IS''  AND ANY  EXPRESS OR  IMPLIED WARRANTIES,    */
20/*    INCLUDING, BUT  NOT LIMITED  TO, THE IMPLIED  WARRANTIES OF    */
21/*    MERCHANTABILITY  AND FITNESS FOR  A PARTICULAR  PURPOSE ARE    */
22/*    DISCLAIMED.  IN  NO EVENT SHALL THE UNIVERSITY  OF TEXAS AT    */
23/*    AUSTIN OR CONTRIBUTORS BE  LIABLE FOR ANY DIRECT, INDIRECT,    */
24/*    INCIDENTAL,  SPECIAL, EXEMPLARY,  OR  CONSEQUENTIAL DAMAGES    */
25/*    (INCLUDING, BUT  NOT LIMITED TO,  PROCUREMENT OF SUBSTITUTE    */
26/*    GOODS  OR  SERVICES; LOSS  OF  USE,  DATA,  OR PROFITS;  OR    */
27/*    BUSINESS INTERRUPTION) HOWEVER CAUSED  AND ON ANY THEORY OF    */
28/*    LIABILITY, WHETHER  IN CONTRACT, STRICT  LIABILITY, OR TORT    */
29/*    (INCLUDING NEGLIGENCE OR OTHERWISE)  ARISING IN ANY WAY OUT    */
30/*    OF  THE  USE OF  THIS  SOFTWARE,  EVEN  IF ADVISED  OF  THE    */
31/*    POSSIBILITY OF SUCH DAMAGE.                                    */
32/*                                                                   */
33/* The views and conclusions contained in the software and           */
34/* documentation are those of the authors and should not be          */
35/* interpreted as representing official policies, either expressed   */
36/* or implied, of The University of Texas at Austin.                 */
37/*********************************************************************/
38
39#define ASSEMBLER
40#include "common.h"
41#include "l2param.h"
42
43#if GEMV_UNROLL < 2
44#undef  GEMV_UNROLL
45#define GEMV_UNROLL 2
46#endif
47
48#ifndef WINDOWS_ABI
49
50#define STACKSIZE	128
51
52#define OLD_INCX	 8 + STACKSIZE(%rsp)
53#define OLD_Y		16 + STACKSIZE(%rsp)
54#define OLD_INCY	24 + STACKSIZE(%rsp)
55#define OLD_BUFFER	32 + STACKSIZE(%rsp)
56#define ALPHA		48	      (%rsp)
57
58#define MMM	64(%rsp)
59#define NN	72(%rsp)
60#define AA	80(%rsp)
61#define XX	88(%rsp)
62#define LDAX	96(%rsp)
63#define ALPHAR	104(%rsp)
64#define ALPHAI	112(%rsp)
65
66#define M	  %rdi
67#define N	  %rsi
68#define A	  %rcx
69#define LDA	  %r8
70#define X	  %r9
71#define INCX	  %rdx
72#define Y	  %rbp
73#define INCY	  %r10
74
75#else
76
77#define STACKSIZE	288
78
79#define OLD_ALPHA_I	 40 + STACKSIZE(%rsp)
80#define OLD_A		 48 + STACKSIZE(%rsp)
81#define OLD_LDA		 56 + STACKSIZE(%rsp)
82#define OLD_X		 64 + STACKSIZE(%rsp)
83#define OLD_INCX	 72 + STACKSIZE(%rsp)
84#define OLD_Y		 80 + STACKSIZE(%rsp)
85#define OLD_INCY	 88 + STACKSIZE(%rsp)
86#define OLD_BUFFER	 96 + STACKSIZE(%rsp)
87#define ALPHA		224	       (%rsp)
88
89#define MMM	232(%rsp)
90#define NN	240(%rsp)
91#define AA	248(%rsp)
92#define	XX	256(%rsp)
93#define LDAX	264(%rsp)
94#define ALPHAR	272(%rsp)
95#define ALPHAI	280(%rsp)
96
97#define M	  %rcx
98#define N	  %rdx
99#define A	  %r8
100#define LDA	  %r9
101#define X	  %rdi
102#define INCX	  %rsi
103#define Y	  %rbp
104#define INCY	  %r10
105
106#endif
107
108#define I	%rax
109#define A1	%r11
110#define A2	%r12
111
112#define Y1	%r13
113#define BUFFER	%r14
114
115#ifdef ALIGNED_ACCESS
116#define MM	%r15
117#else
118#define MM	M
119#endif
120
121#undef SUBPS
122
123#if (!defined(CONJ) && !defined(XCONJ)) || (defined(CONJ) && defined(XCONJ))
124#define SUBPS	   subps
125#else
126#define SUBPS	   addps
127#endif
128
129	PROLOGUE
130	PROFCODE
131
132	subq	$STACKSIZE, %rsp
133	movq	%rbx,  0(%rsp)
134	movq	%rbp,  8(%rsp)
135	movq	%r12, 16(%rsp)
136	movq	%r13, 24(%rsp)
137	movq	%r14, 32(%rsp)
138	movq	%r15, 40(%rsp)
139
140#ifdef WINDOWS_ABI
141	movq	%rdi,    48(%rsp)
142	movq	%rsi,    56(%rsp)
143	movups	%xmm6,   64(%rsp)
144	movups	%xmm7,   80(%rsp)
145	movups	%xmm8,   96(%rsp)
146	movups	%xmm9,  112(%rsp)
147	movups	%xmm10, 128(%rsp)
148	movups	%xmm11, 144(%rsp)
149	movups	%xmm12, 160(%rsp)
150	movups	%xmm13, 176(%rsp)
151	movups	%xmm14, 192(%rsp)
152	movups	%xmm15, 208(%rsp)
153
154	movq	OLD_A,     A
155	movq	OLD_LDA,   LDA
156	movq	OLD_X,     X
157
158	movaps	%xmm3,       %xmm0
159	movss	OLD_ALPHA_I, %xmm1
160#endif
161	movq	A, AA
162	movq	N, NN
163	movq	M, MMM
164	movq	LDA, LDAX
165	movq	X, XX
166	movq	OLD_Y,     Y
167	movss	%xmm0,ALPHAR
168	movss	%xmm1,ALPHAI
169
170.L0t:
171	xorq	I,I
172	addq	$1,I
173	salq	$20,I
174	subq	I,MMM
175	movq	I,M
176	movss	ALPHAR,%xmm0
177	movss	ALPHAI,%xmm1
178	jge	.L00t
179
180	movq	MMM,M
181	addq	I,M
182	jle	.L999x
183
184.L00t:
185	movq	AA, A
186	movq	NN, N
187	movq	LDAX, LDA
188	movq	XX, X
189
190	movq	OLD_INCX,  INCX
191#	movq	OLD_Y,     Y
192	movq	OLD_INCY,  INCY
193	movq	OLD_BUFFER, BUFFER
194
195	salq	$ZBASE_SHIFT,   LDA
196	salq	$ZBASE_SHIFT,   INCX
197	salq	$ZBASE_SHIFT,   INCY
198
199	unpcklps %xmm1, %xmm0
200
201	movlps	%xmm0, ALPHA
202
203	testq	M, M
204	jle	.L999
205	testq	N, N
206	jle	.L999
207	ALIGN_3
208
209	subq	$-32 * SIZE, A
210
211	movq	BUFFER, Y1
212
213	pxor	%xmm4, %xmm4
214
215	movq	M,   %rax
216	addq	$8,  %rax
217	sarq	$3,  %rax
218	ALIGN_3
219
220.L01:
221	movaps	%xmm4,  0 * SIZE(Y1)
222	movaps	%xmm4,  4 * SIZE(Y1)
223	movaps	%xmm4,  8 * SIZE(Y1)
224	movaps	%xmm4, 12 * SIZE(Y1)
225
226	subq	$-16 * SIZE, Y1
227	decq	%rax
228	jg	.L01
229	ALIGN_3
230
231.L10:
232#ifdef ALIGNED_ACCESS
233	movq	M, MM
234
235	movq	A, %rax
236	andq	$4 * SIZE - 1, %rax
237	leaq	2 * SIZE(BUFFER), A1
238	leaq	-1(M), A2
239
240	cmpq	$2 * SIZE, %rax
241	cmovge	A1, BUFFER
242	cmovge	A2, MM
243
244	testq	$SIZE, A
245	jne	.L200
246
247	testq	$2 * SIZE, LDA
248	jne	.L100
249#endif
250
251#if GEMV_UNROLL >= 4
252	cmpq	$4, N
253	jl	.L20
254	ALIGN_3
255
256.L11:
257	subq	$4, N
258
259	leaq	32 * SIZE(BUFFER), Y1
260	movq	A,  A1
261	leaq	(A,  LDA, 2), A2
262	leaq	(A,  LDA, 4), A
263
264	movsd	(X), %xmm9
265	addq	INCX, X
266	movsd	(X), %xmm11
267	addq	INCX, X
268	movsd	(X), %xmm13
269	addq	INCX, X
270	movsd	(X), %xmm15
271	addq	INCX, X
272
273#ifdef HAVE_SSE3
274	movddup	ALPHA, %xmm6
275#else
276	movsd	ALPHA, %xmm6
277	unpcklpd %xmm6, %xmm6
278#endif
279
280	pshufd	$0xb1, %xmm6, %xmm5
281
282	pcmpeqb	%xmm7, %xmm7
283	psllq	$63,   %xmm7
284
285	pshufd	$0x00, %xmm9,  %xmm8
286	pshufd	$0x55, %xmm9,  %xmm9
287	pshufd	$0x00, %xmm11, %xmm10
288	pshufd	$0x55, %xmm11, %xmm11
289	pshufd	$0x00, %xmm13, %xmm12
290	pshufd	$0x55, %xmm13, %xmm13
291	pshufd	$0x00, %xmm15, %xmm14
292	pshufd	$0x55, %xmm15, %xmm15
293
294#ifndef XCONJ
295	xorps	 %xmm7, %xmm9
296	xorps	 %xmm7, %xmm11
297	xorps	 %xmm7, %xmm13
298	xorps	 %xmm7, %xmm15
299#else
300	xorps	 %xmm7, %xmm8
301	xorps	 %xmm7, %xmm10
302	xorps	 %xmm7, %xmm12
303	xorps	 %xmm7, %xmm14
304#endif
305
306	mulps	 %xmm6, %xmm8
307	mulps	 %xmm5, %xmm9
308	mulps	 %xmm6, %xmm10
309	mulps	 %xmm5, %xmm11
310	mulps	 %xmm6, %xmm12
311	mulps	 %xmm5, %xmm13
312	mulps	 %xmm6, %xmm14
313	mulps	 %xmm5, %xmm15
314
315#ifndef XCONJ
316	subps	 %xmm9,  %xmm8
317	subps	 %xmm11, %xmm10
318	subps	 %xmm13, %xmm12
319	subps	 %xmm15, %xmm14
320#else
321	addps	 %xmm9,  %xmm8
322	addps	 %xmm11, %xmm10
323	addps	 %xmm13, %xmm12
324	addps	 %xmm15, %xmm14
325#endif
326
327	pshufd	$0x55, %xmm8,  %xmm9
328	pshufd	$0x00, %xmm8,  %xmm8
329	pshufd	$0x55, %xmm10, %xmm11
330	pshufd	$0x00, %xmm10, %xmm10
331	pshufd	$0x55, %xmm12, %xmm13
332	pshufd	$0x00, %xmm12, %xmm12
333	pshufd	$0x55, %xmm14, %xmm15
334	pshufd	$0x00, %xmm14, %xmm14
335
336#ifndef CONJ
337	xorps	 %xmm7, %xmm9
338	xorps	 %xmm7, %xmm11
339	xorps	 %xmm7, %xmm13
340	xorps	 %xmm7, %xmm15
341#else
342	xorps	 %xmm7, %xmm8
343	xorps	 %xmm7, %xmm10
344	xorps	 %xmm7, %xmm12
345	xorps	 %xmm7, %xmm14
346#endif
347
348#ifdef ALIGNED_ACCESS
349	cmpq	M, MM
350	je	.L1X
351
352	movsd	 -32 * SIZE(A1), %xmm4
353	movsd	 -32 * SIZE(A1, LDA), %xmm6
354
355	movsd	 -32 * SIZE(Y1), %xmm0
356
357	pshufd	 $0xb1, %xmm4, %xmm5
358	mulps	 %xmm8,  %xmm4
359	addps	 %xmm4,  %xmm0
360	movsd	 -32 * SIZE(A2), %xmm4
361	pshufd	 $0xb1, %xmm6, %xmm7
362	mulps	 %xmm9,  %xmm5
363	SUBPS	 %xmm5,  %xmm0
364
365	mulps	 %xmm10, %xmm6
366	addps	 %xmm6,  %xmm0
367	movsd	 -32 * SIZE(A2, LDA), %xmm6
368	mulps	 %xmm11, %xmm7
369	SUBPS	 %xmm7,  %xmm0
370
371	pshufd	 $0xb1, %xmm4, %xmm5
372	mulps	 %xmm12, %xmm4
373	addps	 %xmm4,  %xmm0
374	pshufd	 $0xb1, %xmm6, %xmm7
375	mulps	 %xmm13, %xmm5
376	SUBPS	 %xmm5,  %xmm0
377
378	mulps	 %xmm14, %xmm6
379	addps	 %xmm6,  %xmm0
380	mulps	 %xmm15, %xmm7
381	SUBPS	 %xmm7,  %xmm0
382
383	movlps	 %xmm0, -32 * SIZE(Y1)
384
385	addq	 $2 * SIZE, A1
386	addq	 $2 * SIZE, A2
387	addq	 $2 * SIZE, Y1
388	ALIGN_3
389.L1X:
390#endif
391
392	movaps	 -32 * SIZE(Y1), %xmm0
393	movaps	 -28 * SIZE(Y1), %xmm1
394	movaps	 -24 * SIZE(Y1), %xmm2
395	movaps	 -20 * SIZE(Y1), %xmm3
396
397	movq	MM,  I
398	sarq	$3,  I
399	jle	.L15
400
401	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
402	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
403
404	decq	 I
405	jle	 .L14
406	ALIGN_3
407
408.L13:
409#ifdef PREFETCH
410	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A1)
411#endif
412
413	pshufd	 $0xb1, %xmm4, %xmm5
414	mulps	 %xmm8,  %xmm4
415	addps	 %xmm4,  %xmm0
416	MOVUPS_A1(-24 * SIZE, A1, %xmm4)
417	pshufd	 $0xb1, %xmm6, %xmm7
418	mulps	 %xmm8,  %xmm6
419	addps	 %xmm6,  %xmm1
420	MOVUPS_A1(-20 * SIZE, A1, %xmm6)
421
422	mulps	 %xmm9,  %xmm5
423	SUBPS	 %xmm5,  %xmm0
424	mulps	 %xmm9,  %xmm7
425	SUBPS	 %xmm7,  %xmm1
426
427	pshufd	 $0xb1, %xmm4, %xmm5
428	mulps	 %xmm8,  %xmm4
429	addps	 %xmm4,  %xmm2
430	MOVUPS_A2(-32 * SIZE, A1, LDA, 1, %xmm4)
431	pshufd	 $0xb1, %xmm6, %xmm7
432	mulps	 %xmm8,  %xmm6
433	addps	 %xmm6,  %xmm3
434	MOVUPS_A2(-28 * SIZE, A1, LDA, 1, %xmm6)
435
436	mulps	 %xmm9,  %xmm5
437	SUBPS	 %xmm5,  %xmm2
438	mulps	 %xmm9,  %xmm7
439	SUBPS	 %xmm7,  %xmm3
440
441#ifdef PREFETCH
442	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A1, LDA)
443#endif
444
445	pshufd	 $0xb1, %xmm4, %xmm5
446	mulps	 %xmm10, %xmm4
447	addps	 %xmm4,  %xmm0
448	MOVUPS_A2(-24 * SIZE, A1, LDA, 1, %xmm4)
449	pshufd	 $0xb1, %xmm6, %xmm7
450	mulps	 %xmm10, %xmm6
451	addps	 %xmm6,  %xmm1
452	MOVUPS_A2(-20 * SIZE, A1, LDA, 1, %xmm6)
453
454	mulps	 %xmm11, %xmm5
455	SUBPS	 %xmm5,  %xmm0
456	mulps	 %xmm11, %xmm7
457	SUBPS	 %xmm7,  %xmm1
458
459	pshufd	 $0xb1, %xmm4, %xmm5
460	mulps	 %xmm10, %xmm4
461	addps	 %xmm4,  %xmm2
462	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
463	pshufd	 $0xb1, %xmm6, %xmm7
464	mulps	 %xmm10, %xmm6
465	addps	 %xmm6,  %xmm3
466	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
467
468	mulps	 %xmm11, %xmm5
469	SUBPS	 %xmm5,  %xmm2
470	mulps	 %xmm11, %xmm7
471	SUBPS	 %xmm7,  %xmm3
472
473#ifdef PREFETCH
474	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A2)
475#endif
476
477	pshufd	 $0xb1, %xmm4, %xmm5
478	mulps	 %xmm12, %xmm4
479	addps	 %xmm4,  %xmm0
480	MOVUPS_A1(-24 * SIZE, A2, %xmm4)
481	pshufd	 $0xb1, %xmm6, %xmm7
482	mulps	 %xmm12, %xmm6
483	addps	 %xmm6,  %xmm1
484	MOVUPS_A1(-20 * SIZE, A2, %xmm6)
485
486	mulps	 %xmm13, %xmm5
487	SUBPS	 %xmm5,  %xmm0
488	mulps	 %xmm13, %xmm7
489	SUBPS	 %xmm7,  %xmm1
490
491	pshufd	 $0xb1, %xmm4, %xmm5
492	mulps	 %xmm12, %xmm4
493	addps	 %xmm4,  %xmm2
494	MOVUPS_A2(-32 * SIZE, A2, LDA, 1, %xmm4)
495	pshufd	 $0xb1, %xmm6, %xmm7
496	mulps	 %xmm12, %xmm6
497	addps	 %xmm6,  %xmm3
498	MOVUPS_A2(-28 * SIZE, A2, LDA, 1, %xmm6)
499
500	mulps	 %xmm13, %xmm5
501	SUBPS	 %xmm5,  %xmm2
502	mulps	 %xmm13, %xmm7
503	SUBPS	 %xmm7,  %xmm3
504
505#ifdef PREFETCH
506	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A2, LDA)
507#endif
508
509	pshufd	 $0xb1, %xmm4, %xmm5
510	mulps	 %xmm14, %xmm4
511	addps	 %xmm4,  %xmm0
512	MOVUPS_A2(-24 * SIZE, A2, LDA, 1, %xmm4)
513	pshufd	 $0xb1, %xmm6, %xmm7
514	mulps	 %xmm14, %xmm6
515	addps	 %xmm6,  %xmm1
516	MOVUPS_A2(-20 * SIZE, A2, LDA, 1, %xmm6)
517
518	mulps	 %xmm15, %xmm5
519	SUBPS	 %xmm5,  %xmm0
520	mulps	 %xmm15, %xmm7
521	SUBPS	 %xmm7,  %xmm1
522
523	pshufd	 $0xb1, %xmm4, %xmm5
524	mulps	 %xmm14, %xmm4
525	addps	 %xmm4,  %xmm2
526	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
527	pshufd	 $0xb1, %xmm6, %xmm7
528	mulps	 %xmm14, %xmm6
529	addps	 %xmm6,  %xmm3
530	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
531
532	mulps	 %xmm15, %xmm5
533	SUBPS	 %xmm5,  %xmm2
534	mulps	 %xmm15, %xmm7
535	SUBPS	 %xmm7,  %xmm3
536
537#ifdef PREFETCHW
538	PREFETCHW	(PREFETCHSIZE) - 128 + PREOFFSET(Y1)
539#endif
540
541	movaps	 %xmm0, -32 * SIZE(Y1)
542	movaps	 %xmm1, -28 * SIZE(Y1)
543	movaps	 %xmm2, -24 * SIZE(Y1)
544	movaps	 %xmm3, -20 * SIZE(Y1)
545
546	movaps	 -16 * SIZE(Y1), %xmm0
547	movaps	 -12 * SIZE(Y1), %xmm1
548	movaps	  -8 * SIZE(Y1), %xmm2
549	movaps	  -4 * SIZE(Y1), %xmm3
550
551	subq	 $-16 * SIZE, A1
552	subq	 $-16 * SIZE, A2
553	subq	 $-16 * SIZE, Y1
554
555	subq	 $1, I
556	BRANCH
557	jg	.L13
558	ALIGN_3
559
560.L14:
561	pshufd	 $0xb1, %xmm4, %xmm5
562	mulps	 %xmm8,  %xmm4
563	addps	 %xmm4,  %xmm0
564	MOVUPS_A1(-24 * SIZE, A1, %xmm4)
565	pshufd	 $0xb1, %xmm6, %xmm7
566	mulps	 %xmm8,  %xmm6
567	addps	 %xmm6,  %xmm1
568	MOVUPS_A1(-20 * SIZE, A1, %xmm6)
569
570	mulps	 %xmm9,  %xmm5
571	SUBPS	 %xmm5,  %xmm0
572	mulps	 %xmm9,  %xmm7
573	SUBPS	 %xmm7,  %xmm1
574
575	pshufd	 $0xb1, %xmm4, %xmm5
576	mulps	 %xmm8,  %xmm4
577	addps	 %xmm4,  %xmm2
578	MOVUPS_A2(-32 * SIZE, A1, LDA, 1, %xmm4)
579	pshufd	 $0xb1, %xmm6, %xmm7
580	mulps	 %xmm8,  %xmm6
581	addps	 %xmm6,  %xmm3
582	MOVUPS_A2(-28 * SIZE, A1, LDA, 1, %xmm6)
583
584	mulps	 %xmm9,  %xmm5
585	SUBPS	 %xmm5,  %xmm2
586	mulps	 %xmm9,  %xmm7
587	SUBPS	 %xmm7,  %xmm3
588
589	pshufd	 $0xb1, %xmm4, %xmm5
590	mulps	 %xmm10, %xmm4
591	addps	 %xmm4,  %xmm0
592	MOVUPS_A2(-24 * SIZE, A1, LDA, 1, %xmm4)
593	pshufd	 $0xb1, %xmm6, %xmm7
594	mulps	 %xmm10, %xmm6
595	addps	 %xmm6,  %xmm1
596	MOVUPS_A2(-20 * SIZE, A1, LDA, 1, %xmm6)
597
598	mulps	 %xmm11, %xmm5
599	SUBPS	 %xmm5,  %xmm0
600	mulps	 %xmm11, %xmm7
601	SUBPS	 %xmm7,  %xmm1
602
603	pshufd	 $0xb1, %xmm4, %xmm5
604	mulps	 %xmm10, %xmm4
605	addps	 %xmm4,  %xmm2
606	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
607	pshufd	 $0xb1, %xmm6, %xmm7
608	mulps	 %xmm10, %xmm6
609	addps	 %xmm6,  %xmm3
610	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
611
612	mulps	 %xmm11, %xmm5
613	SUBPS	 %xmm5,  %xmm2
614	mulps	 %xmm11, %xmm7
615	SUBPS	 %xmm7,  %xmm3
616
617	pshufd	 $0xb1, %xmm4, %xmm5
618	mulps	 %xmm12, %xmm4
619	addps	 %xmm4,  %xmm0
620	MOVUPS_A1(-24 * SIZE, A2, %xmm4)
621	pshufd	 $0xb1, %xmm6, %xmm7
622	mulps	 %xmm12, %xmm6
623	addps	 %xmm6,  %xmm1
624	MOVUPS_A1(-20 * SIZE, A2, %xmm6)
625
626	mulps	 %xmm13, %xmm5
627	SUBPS	 %xmm5,  %xmm0
628	mulps	 %xmm13, %xmm7
629	SUBPS	 %xmm7,  %xmm1
630
631	pshufd	 $0xb1, %xmm4, %xmm5
632	mulps	 %xmm12, %xmm4
633	addps	 %xmm4,  %xmm2
634	MOVUPS_A2(-32 * SIZE, A2, LDA, 1, %xmm4)
635	pshufd	 $0xb1, %xmm6, %xmm7
636	mulps	 %xmm12, %xmm6
637	addps	 %xmm6,  %xmm3
638	MOVUPS_A2(-28 * SIZE, A2, LDA, 1, %xmm6)
639
640	mulps	 %xmm13, %xmm5
641	SUBPS	 %xmm5,  %xmm2
642	mulps	 %xmm13, %xmm7
643	SUBPS	 %xmm7,  %xmm3
644
645	pshufd	 $0xb1, %xmm4, %xmm5
646	mulps	 %xmm14, %xmm4
647	addps	 %xmm4,  %xmm0
648	MOVUPS_A2(-24 * SIZE, A2, LDA, 1, %xmm4)
649	pshufd	 $0xb1, %xmm6, %xmm7
650	mulps	 %xmm14, %xmm6
651	addps	 %xmm6,  %xmm1
652	MOVUPS_A2(-20 * SIZE, A2, LDA, 1, %xmm6)
653
654	mulps	 %xmm15, %xmm5
655	SUBPS	 %xmm5,  %xmm0
656	mulps	 %xmm15, %xmm7
657	SUBPS	 %xmm7,  %xmm1
658
659	pshufd	 $0xb1, %xmm4, %xmm5
660	mulps	 %xmm14, %xmm4
661	addps	 %xmm4,  %xmm2
662	pshufd	 $0xb1, %xmm6, %xmm7
663	mulps	 %xmm14, %xmm6
664	addps	 %xmm6,  %xmm3
665
666	mulps	 %xmm15, %xmm5
667	SUBPS	 %xmm5,  %xmm2
668	mulps	 %xmm15, %xmm7
669	SUBPS	 %xmm7,  %xmm3
670
671	movaps	 %xmm0, -32 * SIZE(Y1)
672	movaps	 %xmm1, -28 * SIZE(Y1)
673	movaps	 %xmm2, -24 * SIZE(Y1)
674	movaps	 %xmm3, -20 * SIZE(Y1)
675
676	movaps	 -16 * SIZE(Y1), %xmm0
677	movaps	 -12 * SIZE(Y1), %xmm1
678	movaps	  -8 * SIZE(Y1), %xmm2
679	movaps	  -4 * SIZE(Y1), %xmm3
680
681	subq	 $-16 * SIZE, A1
682	subq	 $-16 * SIZE, A2
683	subq	 $-16 * SIZE, Y1
684	ALIGN_3
685
686.L15:
687	testq	$4, MM
688	je	.L17
689
690	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
691	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
692
693	pshufd	 $0xb1, %xmm4, %xmm5
694	mulps	 %xmm8,  %xmm4
695	addps	 %xmm4,  %xmm0
696	pshufd	 $0xb1, %xmm6, %xmm7
697	mulps	 %xmm8,  %xmm6
698	addps	 %xmm6,  %xmm1
699
700	mulps	 %xmm9,  %xmm5
701	SUBPS	 %xmm5,  %xmm0
702	mulps	 %xmm9,  %xmm7
703	SUBPS	 %xmm7,  %xmm1
704
705	MOVUPS_A2(-32 * SIZE, A1, LDA, 1, %xmm4)
706	MOVUPS_A2(-28 * SIZE, A1, LDA, 1, %xmm6)
707
708	pshufd	 $0xb1, %xmm4, %xmm5
709	mulps	 %xmm10, %xmm4
710	addps	 %xmm4,  %xmm0
711	pshufd	 $0xb1, %xmm6, %xmm7
712	mulps	 %xmm10, %xmm6
713	addps	 %xmm6,  %xmm1
714
715	mulps	 %xmm11, %xmm5
716	SUBPS	 %xmm5,  %xmm0
717	mulps	 %xmm11, %xmm7
718	SUBPS	 %xmm7,  %xmm1
719
720	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
721	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
722
723	pshufd	 $0xb1, %xmm4, %xmm5
724	mulps	 %xmm12, %xmm4
725	addps	 %xmm4,  %xmm0
726	pshufd	 $0xb1, %xmm6, %xmm7
727	mulps	 %xmm12, %xmm6
728	addps	 %xmm6,  %xmm1
729
730	mulps	 %xmm13, %xmm5
731	SUBPS	 %xmm5,  %xmm0
732	mulps	 %xmm13, %xmm7
733	SUBPS	 %xmm7,  %xmm1
734
735	MOVUPS_A2(-32 * SIZE, A2, LDA, 1, %xmm4)
736	MOVUPS_A2(-28 * SIZE, A2, LDA, 1, %xmm6)
737
738	pshufd	 $0xb1, %xmm4, %xmm5
739	mulps	 %xmm14, %xmm4
740	addps	 %xmm4,  %xmm0
741	pshufd	 $0xb1, %xmm6, %xmm7
742	mulps	 %xmm14, %xmm6
743	addps	 %xmm6,  %xmm1
744
745	mulps	 %xmm15, %xmm5
746	SUBPS	 %xmm5,  %xmm0
747	mulps	 %xmm15, %xmm7
748	SUBPS	 %xmm7,  %xmm1
749
750	movaps	 %xmm0, -32 * SIZE(Y1)
751	movaps	 %xmm1, -28 * SIZE(Y1)
752
753	movaps	 %xmm2, %xmm0
754	movaps	 %xmm3, %xmm1
755
756	addq	 $8 * SIZE, A1
757	addq	 $8 * SIZE, A2
758	addq	 $8 * SIZE, Y1
759	ALIGN_3
760
761.L17:
762	testq	$2, MM
763	je	.L18
764
765	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
766	MOVUPS_A2(-32 * SIZE, A1, LDA, 1, %xmm6)
767
768	pshufd	 $0xb1, %xmm4, %xmm5
769	mulps	 %xmm8,  %xmm4
770	addps	 %xmm4,  %xmm0
771	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
772	pshufd	 $0xb1, %xmm6, %xmm7
773	mulps	 %xmm9,  %xmm5
774	SUBPS	 %xmm5,  %xmm0
775
776	mulps	 %xmm10, %xmm6
777	addps	 %xmm6,  %xmm0
778	MOVUPS_A2(-32 * SIZE, A2, LDA, 1, %xmm6)
779	mulps	 %xmm11, %xmm7
780	SUBPS	 %xmm7,  %xmm0
781
782	pshufd	 $0xb1, %xmm4, %xmm5
783	mulps	 %xmm12, %xmm4
784	addps	 %xmm4,  %xmm0
785	pshufd	 $0xb1, %xmm6, %xmm7
786	mulps	 %xmm13, %xmm5
787	SUBPS	 %xmm5,  %xmm0
788
789	mulps	 %xmm14, %xmm6
790	addps	 %xmm6,  %xmm0
791	mulps	 %xmm15, %xmm7
792	SUBPS	 %xmm7,  %xmm0
793
794	movaps	 %xmm0, -32 * SIZE(Y1)
795	movaps	 %xmm1, %xmm0
796
797	addq	 $4 * SIZE, A1
798	addq	 $4 * SIZE, A2
799	addq	 $4 * SIZE, Y1
800	ALIGN_3
801
802.L18:
803	testq	$1, MM
804	je	.L19
805
806	movsd	 -32 * SIZE(A1), %xmm4
807	movsd	 -32 * SIZE(A1, LDA), %xmm6
808
809	pshufd	 $0xb1, %xmm4, %xmm5
810	mulps	 %xmm8,  %xmm4
811	addps	 %xmm4,  %xmm0
812	movsd	 -32 * SIZE(A2), %xmm4
813	pshufd	 $0xb1, %xmm6, %xmm7
814	mulps	 %xmm9,  %xmm5
815	SUBPS	 %xmm5,  %xmm0
816
817	mulps	 %xmm10, %xmm6
818	addps	 %xmm6,  %xmm0
819	movsd	 -32 * SIZE(A2, LDA), %xmm6
820	mulps	 %xmm11, %xmm7
821	SUBPS	 %xmm7,  %xmm0
822
823	pshufd	 $0xb1, %xmm4, %xmm5
824	mulps	 %xmm12, %xmm4
825	addps	 %xmm4,  %xmm0
826	pshufd	 $0xb1, %xmm6, %xmm7
827	mulps	 %xmm13, %xmm5
828	SUBPS	 %xmm5,  %xmm0
829
830	mulps	 %xmm14, %xmm6
831	addps	 %xmm6,  %xmm0
832	mulps	 %xmm15, %xmm7
833	SUBPS	 %xmm7,  %xmm0
834
835	movlps	 %xmm0, -32 * SIZE(Y1)
836	ALIGN_3
837
838.L19:
839	cmpq	$4, N
840	jge	.L11
841	ALIGN_3
842
843.L20:
844#endif
845
846	cmpq	$2, N
847	jl	.L30
848
849#if GEMV_UNROLL == 2
850	ALIGN_3
851
852.L21:
853#endif
854
855	subq	$2, N
856
857	leaq	32 * SIZE(BUFFER), Y1
858	movq	A,  A1
859	leaq	(A,  LDA, 1), A2
860	leaq	(A,  LDA, 2), A
861
862	movsd	(X), %xmm13
863	addq	INCX, X
864	movsd	(X), %xmm15
865	addq	INCX, X
866
867#ifdef HAVE_SSE3
868	movddup	ALPHA, %xmm8
869#else
870	movsd	ALPHA, %xmm8
871	unpcklpd %xmm8, %xmm8
872#endif
873
874	pshufd	$0xb1, %xmm8, %xmm9
875
876	pcmpeqb	%xmm11, %xmm11
877	psllq	$63,    %xmm11
878
879	pshufd	$0x00, %xmm13, %xmm12
880	pshufd	$0x55, %xmm13, %xmm13
881	pshufd	$0x00, %xmm15, %xmm14
882	pshufd	$0x55, %xmm15, %xmm15
883
884#ifndef XCONJ
885	xorps	 %xmm11, %xmm13
886	xorps	 %xmm11, %xmm15
887#else
888	xorps	 %xmm11, %xmm12
889	xorps	 %xmm11, %xmm14
890#endif
891
892	mulps	 %xmm8, %xmm12
893	mulps	 %xmm9, %xmm13
894	mulps	 %xmm8, %xmm14
895	mulps	 %xmm9, %xmm15
896
897#ifndef XCONJ
898	subps	 %xmm13, %xmm12
899	subps	 %xmm15, %xmm14
900#else
901	addps	 %xmm13, %xmm12
902	addps	 %xmm15, %xmm14
903#endif
904
905	pshufd	$0x55, %xmm12, %xmm13
906	pshufd	$0x00, %xmm12, %xmm12
907	pshufd	$0x55, %xmm14, %xmm15
908	pshufd	$0x00, %xmm14, %xmm14
909
910#ifndef CONJ
911	xorps	 %xmm11, %xmm13
912	xorps	 %xmm11, %xmm15
913#else
914	xorps	 %xmm11, %xmm12
915	xorps	 %xmm11, %xmm14
916#endif
917
918#ifdef ALIGNED_ACCESS
919	cmpq	M, MM
920	je	.L2X
921
922	movsd	 -32 * SIZE(A1), %xmm4
923	movsd	 -32 * SIZE(A2), %xmm6
924
925	movsd	 -32 * SIZE(Y1), %xmm0
926
927	pshufd	 $0xb1, %xmm4, %xmm5
928	pshufd	 $0xb1, %xmm6, %xmm7
929
930	mulps	 %xmm12, %xmm4
931	addps	 %xmm4,  %xmm0
932	mulps	 %xmm13, %xmm5
933	SUBPS	 %xmm5,  %xmm0
934
935	mulps	 %xmm14, %xmm6
936	addps	 %xmm6,  %xmm0
937	mulps	 %xmm15, %xmm7
938	SUBPS	 %xmm7,  %xmm0
939
940	movlps	 %xmm0, -32 * SIZE(Y1)
941
942	addq	 $2 * SIZE, A1
943	addq	 $2 * SIZE, A2
944	addq	 $2 * SIZE, Y1
945	ALIGN_3
946.L2X:
947#endif
948
949	movaps	 -32 * SIZE(Y1), %xmm0
950	movaps	 -28 * SIZE(Y1), %xmm1
951	movaps	 -24 * SIZE(Y1), %xmm2
952	movaps	 -20 * SIZE(Y1), %xmm3
953	ALIGN_3
954
955	movq	MM,  I
956	sarq	$3,  I
957	jle	.L25
958
959	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
960	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
961	MOVUPS_A1(-24 * SIZE, A1, %xmm8)
962	MOVUPS_A1(-20 * SIZE, A1, %xmm10)
963
964	decq	 I
965	jle	 .L24
966	ALIGN_3
967
968.L23:
969#ifdef PREFETCH
970	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A2)
971#endif
972
973	pshufd	 $0xb1, %xmm4,  %xmm5
974	mulps	 %xmm12, %xmm4
975	addps	 %xmm4,  %xmm0
976	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
977	pshufd	 $0xb1, %xmm6,  %xmm7
978	mulps	 %xmm12, %xmm6
979	addps	 %xmm6,  %xmm1
980	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
981
982	pshufd	 $0xb1, %xmm8,  %xmm9
983	mulps	 %xmm12, %xmm8
984	addps	 %xmm8,  %xmm2
985	MOVUPS_A1(-24 * SIZE, A2, %xmm8)
986	pshufd	 $0xb1, %xmm10, %xmm11
987	mulps	 %xmm12, %xmm10
988	addps	 %xmm10, %xmm3
989	MOVUPS_A1(-20 * SIZE, A2, %xmm10)
990
991	mulps	 %xmm13, %xmm5
992	SUBPS	 %xmm5,  %xmm0
993	mulps	 %xmm13, %xmm7
994	SUBPS	 %xmm7,  %xmm1
995
996	mulps	 %xmm13, %xmm9
997	SUBPS	 %xmm9,  %xmm2
998	mulps	 %xmm13, %xmm11
999	SUBPS	 %xmm11, %xmm3
1000
1001#ifdef PREFETCH
1002	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A1)
1003#endif
1004
1005	pshufd	 $0xb1, %xmm4,  %xmm5
1006	mulps	 %xmm14, %xmm4
1007	addps	 %xmm4,  %xmm0
1008	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
1009	pshufd	 $0xb1, %xmm6,  %xmm7
1010	mulps	 %xmm14, %xmm6
1011	addps	 %xmm6,  %xmm1
1012	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
1013
1014	pshufd	 $0xb1, %xmm8,  %xmm9
1015	mulps	 %xmm14, %xmm8
1016	addps	 %xmm8,  %xmm2
1017	MOVUPS_A1( -8 * SIZE, A1, %xmm8)
1018	pshufd	 $0xb1, %xmm10, %xmm11
1019	mulps	 %xmm14, %xmm10
1020	addps	 %xmm10, %xmm3
1021	MOVUPS_A1( -4 * SIZE, A1, %xmm10)
1022
1023	mulps	 %xmm15, %xmm5
1024	SUBPS	 %xmm5,  %xmm0
1025	mulps	 %xmm15, %xmm7
1026	SUBPS	 %xmm7,  %xmm1
1027
1028	mulps	 %xmm15, %xmm9
1029	SUBPS	 %xmm9,  %xmm2
1030	mulps	 %xmm15, %xmm11
1031	SUBPS	 %xmm11, %xmm3
1032
1033#ifdef PREFETCHW
1034	PREFETCHW	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(Y1)
1035#endif
1036
1037	movaps	 %xmm0, -32 * SIZE(Y1)
1038	movaps	 %xmm1, -28 * SIZE(Y1)
1039	movaps	 %xmm2, -24 * SIZE(Y1)
1040	movaps	 %xmm3, -20 * SIZE(Y1)
1041
1042	movaps	 -16 * SIZE(Y1), %xmm0
1043	movaps	 -12 * SIZE(Y1), %xmm1
1044	movaps	  -8 * SIZE(Y1), %xmm2
1045	movaps	  -4 * SIZE(Y1), %xmm3
1046
1047	subq	 $-16 * SIZE, A1
1048	subq	 $-16 * SIZE, A2
1049	subq	 $-16 * SIZE, Y1
1050
1051	subq	 $1, I
1052	BRANCH
1053	jg	.L23
1054	ALIGN_3
1055
1056.L24:
1057	pshufd	 $0xb1, %xmm4,  %xmm5
1058	mulps	 %xmm12, %xmm4
1059	addps	 %xmm4,  %xmm0
1060	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
1061	pshufd	 $0xb1, %xmm6,  %xmm7
1062	mulps	 %xmm12, %xmm6
1063	addps	 %xmm6,  %xmm1
1064	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
1065
1066	pshufd	 $0xb1, %xmm8,  %xmm9
1067	mulps	 %xmm12, %xmm8
1068	addps	 %xmm8,  %xmm2
1069	MOVUPS_A1(-24 * SIZE, A2, %xmm8)
1070	pshufd	 $0xb1, %xmm10, %xmm11
1071	mulps	 %xmm12, %xmm10
1072	addps	 %xmm10, %xmm3
1073	MOVUPS_A1(-20 * SIZE, A2, %xmm10)
1074
1075	mulps	 %xmm13, %xmm5
1076	SUBPS	 %xmm5,  %xmm0
1077	mulps	 %xmm13, %xmm7
1078	SUBPS	 %xmm7,  %xmm1
1079
1080	mulps	 %xmm13, %xmm9
1081	SUBPS	 %xmm9,  %xmm2
1082	mulps	 %xmm13, %xmm11
1083	SUBPS	 %xmm11, %xmm3
1084
1085	pshufd	 $0xb1, %xmm4,  %xmm5
1086	mulps	 %xmm14, %xmm4
1087	addps	 %xmm4,  %xmm0
1088	pshufd	 $0xb1, %xmm6,  %xmm7
1089	mulps	 %xmm14, %xmm6
1090	addps	 %xmm6,  %xmm1
1091
1092	pshufd	 $0xb1, %xmm8,  %xmm9
1093	mulps	 %xmm14, %xmm8
1094	addps	 %xmm8,  %xmm2
1095	pshufd	 $0xb1, %xmm10, %xmm11
1096	mulps	 %xmm14, %xmm10
1097	addps	 %xmm10, %xmm3
1098
1099	mulps	 %xmm15, %xmm5
1100	SUBPS	 %xmm5,  %xmm0
1101	mulps	 %xmm15, %xmm7
1102	SUBPS	 %xmm7,  %xmm1
1103
1104	mulps	 %xmm15, %xmm9
1105	SUBPS	 %xmm9,  %xmm2
1106	mulps	 %xmm15, %xmm11
1107	SUBPS	 %xmm11, %xmm3
1108
1109	movaps	 %xmm0, -32 * SIZE(Y1)
1110	movaps	 %xmm1, -28 * SIZE(Y1)
1111	movaps	 %xmm2, -24 * SIZE(Y1)
1112	movaps	 %xmm3, -20 * SIZE(Y1)
1113
1114	movaps	 -16 * SIZE(Y1), %xmm0
1115	movaps	 -12 * SIZE(Y1), %xmm1
1116	movaps	  -8 * SIZE(Y1), %xmm2
1117	movaps	  -4 * SIZE(Y1), %xmm3
1118
1119	subq	 $-16 * SIZE, A1
1120	subq	 $-16 * SIZE, A2
1121	subq	 $-16 * SIZE, Y1
1122	ALIGN_3
1123
1124.L25:
1125	testq	$4, MM
1126	je	.L27
1127
1128	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1129	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
1130	MOVUPS_A1(-32 * SIZE, A2, %xmm8)
1131	MOVUPS_A1(-28 * SIZE, A2, %xmm10)
1132
1133	pshufd	 $0xb1, %xmm4,  %xmm5
1134	pshufd	 $0xb1, %xmm6,  %xmm7
1135	pshufd	 $0xb1, %xmm8,  %xmm9
1136	pshufd	 $0xb1, %xmm10, %xmm11
1137
1138	mulps	 %xmm12, %xmm4
1139	addps	 %xmm4,  %xmm0
1140	mulps	 %xmm12, %xmm6
1141	addps	 %xmm6,  %xmm1
1142
1143	mulps	 %xmm13, %xmm5
1144	SUBPS	 %xmm5,  %xmm0
1145	mulps	 %xmm13, %xmm7
1146	SUBPS	 %xmm7,  %xmm1
1147
1148	mulps	 %xmm14, %xmm8
1149	addps	 %xmm8,  %xmm0
1150	mulps	 %xmm14, %xmm10
1151	addps	 %xmm10, %xmm1
1152
1153	mulps	 %xmm15, %xmm9
1154	SUBPS	 %xmm9,  %xmm0
1155	mulps	 %xmm15, %xmm11
1156	SUBPS	 %xmm11, %xmm1
1157
1158	movaps	 %xmm0, -32 * SIZE(Y1)
1159	movaps	 %xmm1, -28 * SIZE(Y1)
1160
1161	movaps	 %xmm2, %xmm0
1162	movaps	 %xmm3, %xmm1
1163
1164	addq	 $8 * SIZE, A1
1165	addq	 $8 * SIZE, A2
1166	addq	 $8 * SIZE, Y1
1167	ALIGN_3
1168
1169.L27:
1170	testq	$2, MM
1171	je	.L28
1172
1173	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1174	MOVUPS_A1(-32 * SIZE, A2, %xmm6)
1175
1176	pshufd	 $0xb1, %xmm4, %xmm5
1177	mulps	 %xmm12, %xmm4
1178	addps	 %xmm4,  %xmm0
1179	pshufd	 $0xb1, %xmm6, %xmm7
1180	mulps	 %xmm13, %xmm5
1181	SUBPS	 %xmm5,  %xmm0
1182
1183	mulps	 %xmm14, %xmm6
1184	addps	 %xmm6,  %xmm0
1185	mulps	 %xmm15, %xmm7
1186	SUBPS	 %xmm7,  %xmm0
1187
1188	movaps	 %xmm0, -32 * SIZE(Y1)
1189	movaps	 %xmm1, %xmm0
1190
1191	addq	 $4 * SIZE, A1
1192	addq	 $4 * SIZE, A2
1193	addq	 $4 * SIZE, Y1
1194	ALIGN_3
1195
1196.L28:
1197	testq	$1, MM
1198#if GEMV_UNROLL == 2
1199	je	.L29
1200#else
1201	je	.L30
1202#endif
1203
1204	movsd	 -32 * SIZE(A1), %xmm4
1205	movsd	 -32 * SIZE(A2), %xmm6
1206
1207	pshufd	 $0xb1, %xmm4, %xmm5
1208	pshufd	 $0xb1, %xmm6, %xmm7
1209
1210	mulps	 %xmm12, %xmm4
1211	addps	 %xmm4,  %xmm0
1212	mulps	 %xmm13, %xmm5
1213	SUBPS	 %xmm5,  %xmm0
1214
1215	mulps	 %xmm14, %xmm6
1216	addps	 %xmm6,  %xmm0
1217	mulps	 %xmm15, %xmm7
1218	SUBPS	 %xmm7,  %xmm0
1219
1220	movlps	 %xmm0, -32 * SIZE(Y1)
1221
1222#if GEMV_UNROLL == 2
1223	ALIGN_3
1224
1225.L29:
1226	cmpq	$2, N
1227	jge	.L21
1228#endif
1229	ALIGN_3
1230
1231.L30:
1232	cmpq	$1, N
1233	jl	.L990
1234
1235	leaq	32 * SIZE(BUFFER), Y1
1236	movq	A,  A1
1237
1238	movsd	(X), %xmm13
1239	addq	INCX, X
1240
1241#ifdef HAVE_SSE3
1242	movddup	ALPHA, %xmm8
1243#else
1244	movsd	ALPHA, %xmm8
1245	unpcklpd %xmm8, %xmm8
1246#endif
1247
1248	pshufd	$0xb1, %xmm8, %xmm9
1249
1250	pcmpeqb	%xmm11, %xmm11
1251	psllq	$63,    %xmm11
1252
1253	pshufd	$0x00, %xmm13, %xmm12
1254	pshufd	$0x55, %xmm13, %xmm13
1255
1256#ifndef XCONJ
1257	xorps	 %xmm11, %xmm13
1258#else
1259	xorps	 %xmm11, %xmm12
1260#endif
1261
1262	mulps	 %xmm8, %xmm12
1263	mulps	 %xmm9, %xmm13
1264
1265#ifndef XCONJ
1266	subps	 %xmm13, %xmm12
1267#else
1268	addps	 %xmm13, %xmm12
1269#endif
1270
1271	pshufd	$0x55, %xmm12, %xmm13
1272	pshufd	$0x00, %xmm12, %xmm12
1273
1274#ifndef CONJ
1275	xorps	 %xmm11, %xmm13
1276#else
1277	xorps	 %xmm11, %xmm12
1278#endif
1279
1280#ifdef ALIGNED_ACCESS
1281	cmpq	M, MM
1282	je	.L3X
1283
1284	movsd	 -32 * SIZE(A1), %xmm4
1285	movsd	 -32 * SIZE(Y1), %xmm0
1286
1287	pshufd	 $0xb1, %xmm4, %xmm5
1288
1289	mulps	 %xmm12, %xmm4
1290	addps	 %xmm4,  %xmm0
1291	mulps	 %xmm13, %xmm5
1292	SUBPS	 %xmm5,  %xmm0
1293
1294	movlps	 %xmm0, -32 * SIZE(Y1)
1295
1296	addq	 $2 * SIZE, A1
1297	addq	 $2 * SIZE, Y1
1298	ALIGN_3
1299.L3X:
1300#endif
1301
1302	movaps	 -32 * SIZE(Y1), %xmm0
1303	movaps	 -28 * SIZE(Y1), %xmm1
1304	movaps	 -24 * SIZE(Y1), %xmm2
1305	movaps	 -20 * SIZE(Y1), %xmm3
1306	ALIGN_3
1307
1308	movq	MM,  I
1309	sarq	$3,  I
1310	jle	.L35
1311
1312	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1313	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
1314	MOVUPS_A1(-24 * SIZE, A1, %xmm8)
1315	MOVUPS_A1(-20 * SIZE, A1, %xmm10)
1316
1317	decq	 I
1318	jle	 .L34
1319	ALIGN_3
1320
1321.L33:
1322#ifdef PREFETCH
1323	PREFETCH	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(A1)
1324#endif
1325
1326	pshufd	 $0xb1, %xmm4,  %xmm5
1327	mulps	 %xmm12, %xmm4
1328	addps	 %xmm4,  %xmm0
1329	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
1330	pshufd	 $0xb1, %xmm6,  %xmm7
1331	mulps	 %xmm12, %xmm6
1332	addps	 %xmm6,  %xmm1
1333	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
1334
1335	pshufd	 $0xb1, %xmm8,  %xmm9
1336	mulps	 %xmm12, %xmm8
1337	addps	 %xmm8,  %xmm2
1338	MOVUPS_A1( -8 * SIZE, A1, %xmm8)
1339	pshufd	 $0xb1, %xmm10, %xmm11
1340	mulps	 %xmm12, %xmm10
1341	addps	 %xmm10, %xmm3
1342	MOVUPS_A1( -4 * SIZE, A1, %xmm10)
1343
1344	mulps	 %xmm13, %xmm5
1345	SUBPS	 %xmm5,  %xmm0
1346	mulps	 %xmm13, %xmm7
1347	SUBPS	 %xmm7,  %xmm1
1348
1349	mulps	 %xmm13, %xmm9
1350	SUBPS	 %xmm9,  %xmm2
1351	mulps	 %xmm13, %xmm11
1352	SUBPS	 %xmm11, %xmm3
1353
1354#ifdef PREFETCHW
1355	PREFETCHW	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(Y1)
1356#endif
1357
1358	movaps	 %xmm0, -32 * SIZE(Y1)
1359	movaps	 %xmm1, -28 * SIZE(Y1)
1360	movaps	 %xmm2, -24 * SIZE(Y1)
1361	movaps	 %xmm3, -20 * SIZE(Y1)
1362
1363	movaps	 -16 * SIZE(Y1), %xmm0
1364	movaps	 -12 * SIZE(Y1), %xmm1
1365	movaps	  -8 * SIZE(Y1), %xmm2
1366	movaps	  -4 * SIZE(Y1), %xmm3
1367
1368	subq	 $-16 * SIZE, A1
1369	subq	 $-16 * SIZE, A2
1370	subq	 $-16 * SIZE, Y1
1371
1372	subq	 $1, I
1373	BRANCH
1374	jg	.L33
1375	ALIGN_3
1376
1377.L34:
1378	pshufd	 $0xb1, %xmm4,  %xmm5
1379	mulps	 %xmm12, %xmm4
1380	addps	 %xmm4,  %xmm0
1381	pshufd	 $0xb1, %xmm6,  %xmm7
1382	mulps	 %xmm12, %xmm6
1383	addps	 %xmm6,  %xmm1
1384
1385	pshufd	 $0xb1, %xmm8,  %xmm9
1386	mulps	 %xmm12, %xmm8
1387	addps	 %xmm8,  %xmm2
1388	pshufd	 $0xb1, %xmm10, %xmm11
1389	mulps	 %xmm12, %xmm10
1390	addps	 %xmm10, %xmm3
1391
1392	mulps	 %xmm13, %xmm5
1393	SUBPS	 %xmm5,  %xmm0
1394	mulps	 %xmm13, %xmm7
1395	SUBPS	 %xmm7,  %xmm1
1396
1397	mulps	 %xmm13, %xmm9
1398	SUBPS	 %xmm9,  %xmm2
1399	mulps	 %xmm13, %xmm11
1400	SUBPS	 %xmm11, %xmm3
1401
1402	movaps	 %xmm0, -32 * SIZE(Y1)
1403	movaps	 %xmm1, -28 * SIZE(Y1)
1404	movaps	 %xmm2, -24 * SIZE(Y1)
1405	movaps	 %xmm3, -20 * SIZE(Y1)
1406
1407	movaps	 -16 * SIZE(Y1), %xmm0
1408	movaps	 -12 * SIZE(Y1), %xmm1
1409	movaps	  -8 * SIZE(Y1), %xmm2
1410	movaps	  -4 * SIZE(Y1), %xmm3
1411
1412	subq	 $-16 * SIZE, A1
1413	subq	 $-16 * SIZE, Y1
1414	ALIGN_3
1415
1416.L35:
1417	testq	$4, MM
1418	je	.L37
1419
1420	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1421	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
1422
1423	pshufd	 $0xb1, %xmm4,  %xmm5
1424	mulps	 %xmm12, %xmm4
1425	addps	 %xmm4,  %xmm0
1426	pshufd	 $0xb1, %xmm6,  %xmm7
1427	mulps	 %xmm12, %xmm6
1428	addps	 %xmm6,  %xmm1
1429
1430	mulps	 %xmm13, %xmm5
1431	SUBPS	 %xmm5,  %xmm0
1432	mulps	 %xmm13, %xmm7
1433	SUBPS	 %xmm7,  %xmm1
1434
1435	movaps	 %xmm0, -32 * SIZE(Y1)
1436	movaps	 %xmm1, -28 * SIZE(Y1)
1437
1438	movaps	 %xmm2, %xmm0
1439	movaps	 %xmm3, %xmm1
1440
1441	addq	 $8 * SIZE, A1
1442	addq	 $8 * SIZE, Y1
1443	ALIGN_3
1444
1445.L37:
1446	testq	$2, MM
1447	je	.L38
1448
1449	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1450
1451	pshufd	 $0xb1, %xmm4, %xmm5
1452
1453	mulps	 %xmm12, %xmm4
1454	addps	 %xmm4,  %xmm0
1455	mulps	 %xmm13, %xmm5
1456	SUBPS	 %xmm5,  %xmm0
1457
1458	movaps	 %xmm0, -32 * SIZE(Y1)
1459	movaps	 %xmm1, %xmm0
1460
1461	addq	 $4 * SIZE, A1
1462	addq	 $4 * SIZE, Y1
1463	ALIGN_3
1464
1465.L38:
1466	testq	$1, MM
1467	je	.L990
1468
1469	movsd	 -32 * SIZE(A1), %xmm4
1470
1471	pshufd	 $0xb1, %xmm4, %xmm5
1472
1473	mulps	 %xmm12, %xmm4
1474	addps	 %xmm4,  %xmm0
1475	mulps	 %xmm13, %xmm5
1476	SUBPS	 %xmm5,  %xmm0
1477
1478	movlps	 %xmm0, -32 * SIZE(Y1)
1479
1480#ifdef ALIGNED_ACCESS
1481	jmp	 .L990
1482	ALIGN_3
1483
1484.L100:
1485#if GEMV_UNROLL >= 4
1486	cmpq	$4, N
1487	jl	.L110
1488	ALIGN_3
1489
1490.L101:
1491	subq	$4, N
1492
1493	leaq	32 * SIZE(BUFFER), Y1
1494	movq	A,  A1
1495	leaq	(A,  LDA, 2), A2
1496	leaq	(A,  LDA, 4), A
1497
1498	movsd	(X), %xmm9
1499	addq	INCX, X
1500	movsd	(X), %xmm11
1501	addq	INCX, X
1502	movsd	(X), %xmm13
1503	addq	INCX, X
1504	movsd	(X), %xmm15
1505	addq	INCX, X
1506
1507#ifdef HAVE_SSE3
1508	movddup	ALPHA, %xmm6
1509#else
1510	movsd	ALPHA, %xmm6
1511	unpcklpd %xmm6, %xmm6
1512#endif
1513
1514	pshufd	$0xb1, %xmm6, %xmm5
1515
1516	pcmpeqb	%xmm7, %xmm7
1517	psllq	$63,   %xmm7
1518
1519	pshufd	$0x00, %xmm9,  %xmm8
1520	pshufd	$0x55, %xmm9,  %xmm9
1521	pshufd	$0x00, %xmm11, %xmm10
1522	pshufd	$0x55, %xmm11, %xmm11
1523	pshufd	$0x00, %xmm13, %xmm12
1524	pshufd	$0x55, %xmm13, %xmm13
1525	pshufd	$0x00, %xmm15, %xmm14
1526	pshufd	$0x55, %xmm15, %xmm15
1527
1528#ifndef XCONJ
1529	xorps	 %xmm7, %xmm9
1530	xorps	 %xmm7, %xmm11
1531	xorps	 %xmm7, %xmm13
1532	xorps	 %xmm7, %xmm15
1533#else
1534	xorps	 %xmm7, %xmm8
1535	xorps	 %xmm7, %xmm10
1536	xorps	 %xmm7, %xmm12
1537	xorps	 %xmm7, %xmm14
1538#endif
1539
1540	mulps	 %xmm6, %xmm8
1541	mulps	 %xmm5, %xmm9
1542	mulps	 %xmm6, %xmm10
1543	mulps	 %xmm5, %xmm11
1544	mulps	 %xmm6, %xmm12
1545	mulps	 %xmm5, %xmm13
1546	mulps	 %xmm6, %xmm14
1547	mulps	 %xmm5, %xmm15
1548
1549#ifndef XCONJ
1550	subps	 %xmm9,  %xmm8
1551	subps	 %xmm11, %xmm10
1552	subps	 %xmm13, %xmm12
1553	subps	 %xmm15, %xmm14
1554#else
1555	addps	 %xmm9,  %xmm8
1556	addps	 %xmm11, %xmm10
1557	addps	 %xmm13, %xmm12
1558	addps	 %xmm15, %xmm14
1559#endif
1560
1561	pshufd	$0x55, %xmm8,  %xmm9
1562	pshufd	$0x00, %xmm8,  %xmm8
1563	pshufd	$0x55, %xmm10, %xmm11
1564	pshufd	$0x00, %xmm10, %xmm10
1565	pshufd	$0x55, %xmm12, %xmm13
1566	pshufd	$0x00, %xmm12, %xmm12
1567	pshufd	$0x55, %xmm14, %xmm15
1568	pshufd	$0x00, %xmm14, %xmm14
1569
1570#ifndef CONJ
1571	xorps	 %xmm7, %xmm9
1572	xorps	 %xmm7, %xmm11
1573	xorps	 %xmm7, %xmm13
1574	xorps	 %xmm7, %xmm15
1575#else
1576	xorps	 %xmm7, %xmm8
1577	xorps	 %xmm7, %xmm10
1578	xorps	 %xmm7, %xmm12
1579	xorps	 %xmm7, %xmm14
1580#endif
1581
1582#ifdef ALIGNED_ACCESS
1583	cmpq	M, MM
1584	je	.L10X
1585
1586	movsd	 -32 * SIZE(A1), %xmm4
1587	movsd	 -32 * SIZE(A1, LDA), %xmm6
1588
1589	movsd	 -32 * SIZE(Y1), %xmm0
1590
1591	pshufd	 $0xb1, %xmm4, %xmm5
1592	mulps	 %xmm8,  %xmm4
1593	addps	 %xmm4,  %xmm0
1594	movsd	 -32 * SIZE(A2), %xmm4
1595	pshufd	 $0xb1, %xmm6, %xmm7
1596	mulps	 %xmm9,  %xmm5
1597	SUBPS	 %xmm5,  %xmm0
1598
1599	mulps	 %xmm10, %xmm6
1600	addps	 %xmm6,  %xmm0
1601	movsd	 -32 * SIZE(A2, LDA), %xmm6
1602	mulps	 %xmm11, %xmm7
1603	SUBPS	 %xmm7,  %xmm0
1604
1605	pshufd	 $0xb1, %xmm4, %xmm5
1606	mulps	 %xmm12, %xmm4
1607	addps	 %xmm4,  %xmm0
1608	pshufd	 $0xb1, %xmm6, %xmm7
1609	mulps	 %xmm13, %xmm5
1610	SUBPS	 %xmm5,  %xmm0
1611
1612	mulps	 %xmm14, %xmm6
1613	addps	 %xmm6,  %xmm0
1614	mulps	 %xmm15, %xmm7
1615	SUBPS	 %xmm7,  %xmm0
1616
1617	movlps	 %xmm0, -32 * SIZE(Y1)
1618
1619	addq	 $2 * SIZE, A1
1620	addq	 $2 * SIZE, A2
1621	addq	 $2 * SIZE, Y1
1622	ALIGN_3
1623.L10X:
1624#endif
1625
1626	movaps	 -32 * SIZE(Y1), %xmm0
1627	movaps	 -28 * SIZE(Y1), %xmm1
1628	movaps	 -24 * SIZE(Y1), %xmm2
1629	movaps	 -20 * SIZE(Y1), %xmm3
1630
1631	movq	MM,  I
1632	sarq	$3,  I
1633	jle	.L105
1634
1635	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1636	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
1637
1638	decq	 I
1639	jle	 .L104
1640	ALIGN_3
1641
1642.L103:
1643#ifdef PREFETCH
1644	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A1)
1645#endif
1646
1647	pshufd	 $0xb1, %xmm4, %xmm5
1648	mulps	 %xmm8,  %xmm4
1649	addps	 %xmm4,  %xmm0
1650	MOVUPS_A1(-24 * SIZE, A1, %xmm4)
1651	pshufd	 $0xb1, %xmm6, %xmm7
1652	mulps	 %xmm8,  %xmm6
1653	addps	 %xmm6,  %xmm1
1654	MOVUPS_A1(-20 * SIZE, A1, %xmm6)
1655
1656	mulps	 %xmm9,  %xmm5
1657	SUBPS	 %xmm5,  %xmm0
1658	mulps	 %xmm9,  %xmm7
1659	SUBPS	 %xmm7,  %xmm1
1660
1661	pshufd	 $0xb1, %xmm4, %xmm5
1662	mulps	 %xmm8,  %xmm4
1663	addps	 %xmm4,  %xmm2
1664	movsd	-32 * SIZE(A1, LDA), %xmm4
1665	movhps	-30 * SIZE(A1, LDA), %xmm4
1666	pshufd	 $0xb1, %xmm6, %xmm7
1667	mulps	 %xmm8,  %xmm6
1668	addps	 %xmm6,  %xmm3
1669	movsd	-28 * SIZE(A1, LDA), %xmm6
1670	movhps	-26 * SIZE(A1, LDA), %xmm6
1671
1672	mulps	 %xmm9,  %xmm5
1673	SUBPS	 %xmm5,  %xmm2
1674	mulps	 %xmm9,  %xmm7
1675	SUBPS	 %xmm7,  %xmm3
1676
1677#ifdef PREFETCH
1678	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A1, LDA)
1679#endif
1680
1681	pshufd	 $0xb1, %xmm4, %xmm5
1682	mulps	 %xmm10, %xmm4
1683	addps	 %xmm4,  %xmm0
1684	movsd	-24 * SIZE(A1, LDA), %xmm4
1685	movhps	-22 * SIZE(A1, LDA), %xmm4
1686	pshufd	 $0xb1, %xmm6, %xmm7
1687	mulps	 %xmm10, %xmm6
1688	addps	 %xmm6,  %xmm1
1689	movsd	-20 * SIZE(A1, LDA), %xmm6
1690	movhps	-18 * SIZE(A1, LDA), %xmm6
1691
1692	mulps	 %xmm11, %xmm5
1693	SUBPS	 %xmm5,  %xmm0
1694	mulps	 %xmm11, %xmm7
1695	SUBPS	 %xmm7,  %xmm1
1696
1697	pshufd	 $0xb1, %xmm4, %xmm5
1698	mulps	 %xmm10, %xmm4
1699	addps	 %xmm4,  %xmm2
1700	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
1701	pshufd	 $0xb1, %xmm6, %xmm7
1702	mulps	 %xmm10, %xmm6
1703	addps	 %xmm6,  %xmm3
1704	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
1705
1706	mulps	 %xmm11, %xmm5
1707	SUBPS	 %xmm5,  %xmm2
1708	mulps	 %xmm11, %xmm7
1709	SUBPS	 %xmm7,  %xmm3
1710
1711#ifdef PREFETCH
1712	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A2)
1713#endif
1714
1715	pshufd	 $0xb1, %xmm4, %xmm5
1716	mulps	 %xmm12, %xmm4
1717	addps	 %xmm4,  %xmm0
1718	MOVUPS_A1(-24 * SIZE, A2, %xmm4)
1719	pshufd	 $0xb1, %xmm6, %xmm7
1720	mulps	 %xmm12, %xmm6
1721	addps	 %xmm6,  %xmm1
1722	MOVUPS_A1(-20 * SIZE, A2, %xmm6)
1723
1724	mulps	 %xmm13, %xmm5
1725	SUBPS	 %xmm5,  %xmm0
1726	mulps	 %xmm13, %xmm7
1727	SUBPS	 %xmm7,  %xmm1
1728
1729	pshufd	 $0xb1, %xmm4, %xmm5
1730	mulps	 %xmm12, %xmm4
1731	addps	 %xmm4,  %xmm2
1732	movsd	-32 * SIZE(A2, LDA), %xmm4
1733	movhps	-30 * SIZE(A2, LDA), %xmm4
1734	pshufd	 $0xb1, %xmm6, %xmm7
1735	mulps	 %xmm12, %xmm6
1736	addps	 %xmm6,  %xmm3
1737	movsd	-28 * SIZE(A2, LDA), %xmm6
1738	movhps	-26 * SIZE(A2, LDA), %xmm6
1739
1740	mulps	 %xmm13, %xmm5
1741	SUBPS	 %xmm5,  %xmm2
1742	mulps	 %xmm13, %xmm7
1743	SUBPS	 %xmm7,  %xmm3
1744
1745#ifdef PREFETCH
1746	PREFETCH	(PREFETCHSIZE) - 128 + PREOFFSET(A2, LDA)
1747#endif
1748
1749	pshufd	 $0xb1, %xmm4, %xmm5
1750	mulps	 %xmm14, %xmm4
1751	addps	 %xmm4,  %xmm0
1752	movsd	-24 * SIZE(A2, LDA), %xmm4
1753	movhps	-22 * SIZE(A2, LDA), %xmm4
1754	pshufd	 $0xb1, %xmm6, %xmm7
1755	mulps	 %xmm14, %xmm6
1756	addps	 %xmm6,  %xmm1
1757	movsd	-20 * SIZE(A2, LDA), %xmm6
1758	movhps	-18 * SIZE(A2, LDA), %xmm6
1759
1760	mulps	 %xmm15, %xmm5
1761	SUBPS	 %xmm5,  %xmm0
1762	mulps	 %xmm15, %xmm7
1763	SUBPS	 %xmm7,  %xmm1
1764
1765	pshufd	 $0xb1, %xmm4, %xmm5
1766	mulps	 %xmm14, %xmm4
1767	addps	 %xmm4,  %xmm2
1768	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
1769	pshufd	 $0xb1, %xmm6, %xmm7
1770	mulps	 %xmm14, %xmm6
1771	addps	 %xmm6,  %xmm3
1772	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
1773
1774	mulps	 %xmm15, %xmm5
1775	SUBPS	 %xmm5,  %xmm2
1776	mulps	 %xmm15, %xmm7
1777	SUBPS	 %xmm7,  %xmm3
1778
1779#ifdef PREFETCHW
1780	PREFETCHW	(PREFETCHSIZE) - 128 + PREOFFSET(Y1)
1781#endif
1782
1783	movaps	 %xmm0, -32 * SIZE(Y1)
1784	movaps	 %xmm1, -28 * SIZE(Y1)
1785	movaps	 %xmm2, -24 * SIZE(Y1)
1786	movaps	 %xmm3, -20 * SIZE(Y1)
1787
1788	movaps	 -16 * SIZE(Y1), %xmm0
1789	movaps	 -12 * SIZE(Y1), %xmm1
1790	movaps	  -8 * SIZE(Y1), %xmm2
1791	movaps	  -4 * SIZE(Y1), %xmm3
1792
1793	subq	 $-16 * SIZE, A1
1794	subq	 $-16 * SIZE, A2
1795	subq	 $-16 * SIZE, Y1
1796
1797	subq	 $1, I
1798	BRANCH
1799	jg	.L103
1800	ALIGN_3
1801
1802.L104:
1803	pshufd	 $0xb1, %xmm4, %xmm5
1804	mulps	 %xmm8,  %xmm4
1805	addps	 %xmm4,  %xmm0
1806	MOVUPS_A1(-24 * SIZE, A1, %xmm4)
1807	pshufd	 $0xb1, %xmm6, %xmm7
1808	mulps	 %xmm8,  %xmm6
1809	addps	 %xmm6,  %xmm1
1810	MOVUPS_A1(-20 * SIZE, A1, %xmm6)
1811
1812	mulps	 %xmm9,  %xmm5
1813	SUBPS	 %xmm5,  %xmm0
1814	mulps	 %xmm9,  %xmm7
1815	SUBPS	 %xmm7,  %xmm1
1816
1817	pshufd	 $0xb1, %xmm4, %xmm5
1818	mulps	 %xmm8,  %xmm4
1819	addps	 %xmm4,  %xmm2
1820	movsd	-32 * SIZE(A1, LDA), %xmm4
1821	movhps	-30 * SIZE(A1, LDA), %xmm4
1822	pshufd	 $0xb1, %xmm6, %xmm7
1823	mulps	 %xmm8,  %xmm6
1824	addps	 %xmm6,  %xmm3
1825	movsd	-28 * SIZE(A1, LDA), %xmm6
1826	movhps	-26 * SIZE(A1, LDA), %xmm6
1827
1828	mulps	 %xmm9,  %xmm5
1829	SUBPS	 %xmm5,  %xmm2
1830	mulps	 %xmm9,  %xmm7
1831	SUBPS	 %xmm7,  %xmm3
1832
1833	pshufd	 $0xb1, %xmm4, %xmm5
1834	mulps	 %xmm10, %xmm4
1835	addps	 %xmm4,  %xmm0
1836	movsd	-24 * SIZE(A1, LDA), %xmm4
1837	movhps	-22 * SIZE(A1, LDA), %xmm4
1838	pshufd	 $0xb1, %xmm6, %xmm7
1839	mulps	 %xmm10, %xmm6
1840	addps	 %xmm6,  %xmm1
1841	movsd	-20 * SIZE(A1, LDA), %xmm6
1842	movhps	-18 * SIZE(A1, LDA), %xmm6
1843
1844	mulps	 %xmm11, %xmm5
1845	SUBPS	 %xmm5,  %xmm0
1846	mulps	 %xmm11, %xmm7
1847	SUBPS	 %xmm7,  %xmm1
1848
1849	pshufd	 $0xb1, %xmm4, %xmm5
1850	mulps	 %xmm10, %xmm4
1851	addps	 %xmm4,  %xmm2
1852	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
1853	pshufd	 $0xb1, %xmm6, %xmm7
1854	mulps	 %xmm10, %xmm6
1855	addps	 %xmm6,  %xmm3
1856	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
1857
1858	mulps	 %xmm11, %xmm5
1859	SUBPS	 %xmm5,  %xmm2
1860	mulps	 %xmm11, %xmm7
1861	SUBPS	 %xmm7,  %xmm3
1862
1863	pshufd	 $0xb1, %xmm4, %xmm5
1864	mulps	 %xmm12, %xmm4
1865	addps	 %xmm4,  %xmm0
1866	MOVUPS_A1(-24 * SIZE, A2, %xmm4)
1867	pshufd	 $0xb1, %xmm6, %xmm7
1868	mulps	 %xmm12, %xmm6
1869	addps	 %xmm6,  %xmm1
1870	MOVUPS_A1(-20 * SIZE, A2, %xmm6)
1871
1872	mulps	 %xmm13, %xmm5
1873	SUBPS	 %xmm5,  %xmm0
1874	mulps	 %xmm13, %xmm7
1875	SUBPS	 %xmm7,  %xmm1
1876
1877	pshufd	 $0xb1, %xmm4, %xmm5
1878	mulps	 %xmm12, %xmm4
1879	addps	 %xmm4,  %xmm2
1880	movsd	-32 * SIZE(A2, LDA), %xmm4
1881	movhps	-30 * SIZE(A2, LDA), %xmm4
1882	pshufd	 $0xb1, %xmm6, %xmm7
1883	mulps	 %xmm12, %xmm6
1884	addps	 %xmm6,  %xmm3
1885	movsd	-28 * SIZE(A2, LDA), %xmm6
1886	movhps	-26 * SIZE(A2, LDA), %xmm6
1887
1888	mulps	 %xmm13, %xmm5
1889	SUBPS	 %xmm5,  %xmm2
1890	mulps	 %xmm13, %xmm7
1891	SUBPS	 %xmm7,  %xmm3
1892
1893	pshufd	 $0xb1, %xmm4, %xmm5
1894	mulps	 %xmm14, %xmm4
1895	addps	 %xmm4,  %xmm0
1896	movsd	-24 * SIZE(A2, LDA), %xmm4
1897	movhps	-22 * SIZE(A2, LDA), %xmm4
1898	pshufd	 $0xb1, %xmm6, %xmm7
1899	mulps	 %xmm14, %xmm6
1900	addps	 %xmm6,  %xmm1
1901	movsd	-20 * SIZE(A2, LDA), %xmm6
1902	movhps	-18 * SIZE(A2, LDA), %xmm6
1903
1904	mulps	 %xmm15, %xmm5
1905	SUBPS	 %xmm5,  %xmm0
1906	mulps	 %xmm15, %xmm7
1907	SUBPS	 %xmm7,  %xmm1
1908
1909	pshufd	 $0xb1, %xmm4, %xmm5
1910	mulps	 %xmm14, %xmm4
1911	addps	 %xmm4,  %xmm2
1912	pshufd	 $0xb1, %xmm6, %xmm7
1913	mulps	 %xmm14, %xmm6
1914	addps	 %xmm6,  %xmm3
1915
1916	mulps	 %xmm15, %xmm5
1917	SUBPS	 %xmm5,  %xmm2
1918	mulps	 %xmm15, %xmm7
1919	SUBPS	 %xmm7,  %xmm3
1920
1921	movaps	 %xmm0, -32 * SIZE(Y1)
1922	movaps	 %xmm1, -28 * SIZE(Y1)
1923	movaps	 %xmm2, -24 * SIZE(Y1)
1924	movaps	 %xmm3, -20 * SIZE(Y1)
1925
1926	movaps	 -16 * SIZE(Y1), %xmm0
1927	movaps	 -12 * SIZE(Y1), %xmm1
1928	movaps	  -8 * SIZE(Y1), %xmm2
1929	movaps	  -4 * SIZE(Y1), %xmm3
1930
1931	subq	 $-16 * SIZE, A1
1932	subq	 $-16 * SIZE, A2
1933	subq	 $-16 * SIZE, Y1
1934	ALIGN_3
1935
1936.L105:
1937	testq	$4, MM
1938	je	.L107
1939
1940	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
1941	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
1942
1943	pshufd	 $0xb1, %xmm4, %xmm5
1944	mulps	 %xmm8,  %xmm4
1945	addps	 %xmm4,  %xmm0
1946	movsd	-32 * SIZE(A1, LDA), %xmm4
1947	movhps	-30 * SIZE(A1, LDA), %xmm4
1948	pshufd	 $0xb1, %xmm6, %xmm7
1949	mulps	 %xmm8,  %xmm6
1950	addps	 %xmm6,  %xmm1
1951	movsd	-28 * SIZE(A1, LDA), %xmm6
1952	movhps	-26 * SIZE(A1, LDA), %xmm6
1953
1954	mulps	 %xmm9,  %xmm5
1955	SUBPS	 %xmm5,  %xmm0
1956	mulps	 %xmm9,  %xmm7
1957	SUBPS	 %xmm7,  %xmm1
1958
1959	pshufd	 $0xb1, %xmm4, %xmm5
1960	mulps	 %xmm10, %xmm4
1961	addps	 %xmm4,  %xmm0
1962	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
1963	pshufd	 $0xb1, %xmm6, %xmm7
1964	mulps	 %xmm10, %xmm6
1965	addps	 %xmm6,  %xmm1
1966	MOVUPS_A1(-28 * SIZE, A2, %xmm6)
1967
1968	mulps	 %xmm11, %xmm5
1969	SUBPS	 %xmm5,  %xmm0
1970	mulps	 %xmm11, %xmm7
1971	SUBPS	 %xmm7,  %xmm1
1972
1973	pshufd	 $0xb1, %xmm4, %xmm5
1974	mulps	 %xmm12, %xmm4
1975	addps	 %xmm4,  %xmm0
1976	movsd	-32 * SIZE(A2, LDA), %xmm4
1977	movhps	-30 * SIZE(A2, LDA), %xmm4
1978	pshufd	 $0xb1, %xmm6, %xmm7
1979	mulps	 %xmm12, %xmm6
1980	addps	 %xmm6,  %xmm1
1981	movsd	-28 * SIZE(A2, LDA), %xmm6
1982	movhps	-26 * SIZE(A2, LDA), %xmm6
1983
1984	mulps	 %xmm13, %xmm5
1985	SUBPS	 %xmm5,  %xmm0
1986	mulps	 %xmm13, %xmm7
1987	SUBPS	 %xmm7,  %xmm1
1988
1989	pshufd	 $0xb1, %xmm4, %xmm5
1990	mulps	 %xmm14, %xmm4
1991	addps	 %xmm4,  %xmm0
1992	pshufd	 $0xb1, %xmm6, %xmm7
1993	mulps	 %xmm14, %xmm6
1994	addps	 %xmm6,  %xmm1
1995
1996	mulps	 %xmm15, %xmm5
1997	SUBPS	 %xmm5,  %xmm0
1998	mulps	 %xmm15, %xmm7
1999	SUBPS	 %xmm7,  %xmm1
2000
2001	movaps	 %xmm0, -32 * SIZE(Y1)
2002	movaps	 %xmm1, -28 * SIZE(Y1)
2003
2004	movaps	 %xmm2, %xmm0
2005	movaps	 %xmm3, %xmm1
2006
2007	addq	 $8 * SIZE, A1
2008	addq	 $8 * SIZE, A2
2009	addq	 $8 * SIZE, Y1
2010	ALIGN_3
2011
2012.L107:
2013	testq	$2, MM
2014	je	.L108
2015
2016	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2017	movsd	-32 * SIZE(A1, LDA), %xmm6
2018	movhps	-30 * SIZE(A1, LDA), %xmm6
2019
2020	pshufd	 $0xb1, %xmm4, %xmm5
2021	mulps	 %xmm8,  %xmm4
2022	addps	 %xmm4,  %xmm0
2023	MOVUPS_A1(-32 * SIZE, A2, %xmm4)
2024	pshufd	 $0xb1, %xmm6, %xmm7
2025	mulps	 %xmm9,  %xmm5
2026	SUBPS	 %xmm5,  %xmm0
2027
2028	mulps	 %xmm10, %xmm6
2029	addps	 %xmm6,  %xmm0
2030	movsd	-32 * SIZE(A2, LDA), %xmm6
2031	movhps	-30 * SIZE(A2, LDA), %xmm6
2032	mulps	 %xmm11, %xmm7
2033	SUBPS	 %xmm7,  %xmm0
2034
2035	pshufd	 $0xb1, %xmm4, %xmm5
2036	mulps	 %xmm12, %xmm4
2037	addps	 %xmm4,  %xmm0
2038	pshufd	 $0xb1, %xmm6, %xmm7
2039	mulps	 %xmm13, %xmm5
2040	SUBPS	 %xmm5,  %xmm0
2041
2042	mulps	 %xmm14, %xmm6
2043	addps	 %xmm6,  %xmm0
2044	mulps	 %xmm15, %xmm7
2045	SUBPS	 %xmm7,  %xmm0
2046
2047	movaps	 %xmm0, -32 * SIZE(Y1)
2048	movaps	 %xmm1, %xmm0
2049
2050	addq	 $4 * SIZE, A1
2051	addq	 $4 * SIZE, A2
2052	addq	 $4 * SIZE, Y1
2053	ALIGN_3
2054
2055.L108:
2056	testq	$1, MM
2057	je	.L109
2058
2059	movsd	 -32 * SIZE(A1), %xmm4
2060	movsd	 -32 * SIZE(A1, LDA), %xmm6
2061
2062	pshufd	 $0xb1, %xmm4, %xmm5
2063	mulps	 %xmm8,  %xmm4
2064	addps	 %xmm4,  %xmm0
2065	movsd	 -32 * SIZE(A2), %xmm4
2066	pshufd	 $0xb1, %xmm6, %xmm7
2067	mulps	 %xmm9,  %xmm5
2068	SUBPS	 %xmm5,  %xmm0
2069
2070	mulps	 %xmm10, %xmm6
2071	addps	 %xmm6,  %xmm0
2072	movsd	 -32 * SIZE(A2, LDA), %xmm6
2073	mulps	 %xmm11, %xmm7
2074	SUBPS	 %xmm7,  %xmm0
2075
2076	pshufd	 $0xb1, %xmm4, %xmm5
2077	mulps	 %xmm12, %xmm4
2078	addps	 %xmm4,  %xmm0
2079	pshufd	 $0xb1, %xmm6, %xmm7
2080	mulps	 %xmm13, %xmm5
2081	SUBPS	 %xmm5,  %xmm0
2082
2083	mulps	 %xmm14, %xmm6
2084	addps	 %xmm6,  %xmm0
2085	mulps	 %xmm15, %xmm7
2086	SUBPS	 %xmm7,  %xmm0
2087
2088	movlps	 %xmm0, -32 * SIZE(Y1)
2089	ALIGN_3
2090
2091.L109:
2092	cmpq	$4, N
2093	jge	.L101
2094	ALIGN_3
2095
2096.L110:
2097#endif
2098
2099#if GEMV_UNROLL >= 2
2100
2101	cmpq	$2, N
2102	jl	.L120
2103
2104#if GEMV_UNROLL == 2
2105	ALIGN_3
2106
2107.L111:
2108#endif
2109
2110	subq	$2, N
2111
2112	leaq	32 * SIZE(BUFFER), Y1
2113	movq	A,  A1
2114	leaq	(A,  LDA, 1), A2
2115	leaq	(A,  LDA, 2), A
2116
2117	movsd	(X), %xmm13
2118	addq	INCX, X
2119	movsd	(X), %xmm15
2120	addq	INCX, X
2121
2122#ifdef HAVE_SSE3
2123	movddup	ALPHA, %xmm8
2124#else
2125	movsd	ALPHA, %xmm8
2126	unpcklpd %xmm8, %xmm8
2127#endif
2128
2129	pshufd	$0xb1, %xmm8, %xmm9
2130
2131	pcmpeqb	%xmm11, %xmm11
2132	psllq	$63,    %xmm11
2133
2134	pshufd	$0x00, %xmm13, %xmm12
2135	pshufd	$0x55, %xmm13, %xmm13
2136	pshufd	$0x00, %xmm15, %xmm14
2137	pshufd	$0x55, %xmm15, %xmm15
2138
2139#ifndef XCONJ
2140	xorps	 %xmm11, %xmm13
2141	xorps	 %xmm11, %xmm15
2142#else
2143	xorps	 %xmm11, %xmm12
2144	xorps	 %xmm11, %xmm14
2145#endif
2146
2147	mulps	 %xmm8, %xmm12
2148	mulps	 %xmm9, %xmm13
2149	mulps	 %xmm8, %xmm14
2150	mulps	 %xmm9, %xmm15
2151
2152#ifndef XCONJ
2153	subps	 %xmm13, %xmm12
2154	subps	 %xmm15, %xmm14
2155#else
2156	addps	 %xmm13, %xmm12
2157	addps	 %xmm15, %xmm14
2158#endif
2159
2160	pshufd	$0x55, %xmm12, %xmm13
2161	pshufd	$0x00, %xmm12, %xmm12
2162	pshufd	$0x55, %xmm14, %xmm15
2163	pshufd	$0x00, %xmm14, %xmm14
2164
2165#ifndef CONJ
2166	xorps	 %xmm11, %xmm13
2167	xorps	 %xmm11, %xmm15
2168#else
2169	xorps	 %xmm11, %xmm12
2170	xorps	 %xmm11, %xmm14
2171#endif
2172
2173#ifdef ALIGNED_ACCESS
2174	cmpq	M, MM
2175	je	.L11X
2176
2177	movsd	 -32 * SIZE(A1), %xmm4
2178	movsd	 -32 * SIZE(A2), %xmm6
2179
2180	movsd	 -32 * SIZE(Y1), %xmm0
2181
2182	pshufd	 $0xb1, %xmm4, %xmm5
2183	pshufd	 $0xb1, %xmm6, %xmm7
2184
2185	mulps	 %xmm12, %xmm4
2186	addps	 %xmm4,  %xmm0
2187	mulps	 %xmm13, %xmm5
2188	SUBPS	 %xmm5,  %xmm0
2189
2190	mulps	 %xmm14, %xmm6
2191	addps	 %xmm6,  %xmm0
2192	mulps	 %xmm15, %xmm7
2193	SUBPS	 %xmm7,  %xmm0
2194
2195	movlps	 %xmm0, -32 * SIZE(Y1)
2196
2197	addq	 $2 * SIZE, A1
2198	addq	 $2 * SIZE, A2
2199	addq	 $2 * SIZE, Y1
2200	ALIGN_3
2201.L11X:
2202#endif
2203
2204	movaps	 -32 * SIZE(Y1), %xmm0
2205	movaps	 -28 * SIZE(Y1), %xmm1
2206	movaps	 -24 * SIZE(Y1), %xmm2
2207	movaps	 -20 * SIZE(Y1), %xmm3
2208	ALIGN_3
2209
2210	movq	MM,  I
2211	sarq	$3,  I
2212	jle	.L115
2213
2214	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2215	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
2216	MOVUPS_A1(-24 * SIZE, A1, %xmm8)
2217	MOVUPS_A1(-20 * SIZE, A1, %xmm10)
2218
2219	decq	 I
2220	jle	 .L114
2221	ALIGN_3
2222
2223.L113:
2224#ifdef PREFETCH
2225	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A2)
2226#endif
2227
2228	pshufd	 $0xb1, %xmm4,  %xmm5
2229	mulps	 %xmm12, %xmm4
2230	addps	 %xmm4,  %xmm0
2231	movsd	-32 * SIZE(A2), %xmm4
2232	movhps	-30 * SIZE(A2), %xmm4
2233	pshufd	 $0xb1, %xmm6,  %xmm7
2234	mulps	 %xmm12, %xmm6
2235	addps	 %xmm6,  %xmm1
2236	movsd	-28 * SIZE(A2), %xmm6
2237	movhps	-26 * SIZE(A2), %xmm6
2238
2239	pshufd	 $0xb1, %xmm8,  %xmm9
2240	mulps	 %xmm12, %xmm8
2241	addps	 %xmm8,  %xmm2
2242	movsd	-24 * SIZE(A2), %xmm8
2243	movhps	-22 * SIZE(A2), %xmm8
2244	pshufd	 $0xb1, %xmm10, %xmm11
2245	mulps	 %xmm12, %xmm10
2246	addps	 %xmm10, %xmm3
2247	movsd	-20 * SIZE(A2), %xmm10
2248	movhps	-18 * SIZE(A2), %xmm10
2249
2250	mulps	 %xmm13, %xmm5
2251	SUBPS	 %xmm5,  %xmm0
2252	mulps	 %xmm13, %xmm7
2253	SUBPS	 %xmm7,  %xmm1
2254
2255	mulps	 %xmm13, %xmm9
2256	SUBPS	 %xmm9,  %xmm2
2257	mulps	 %xmm13, %xmm11
2258	SUBPS	 %xmm11, %xmm3
2259
2260#ifdef PREFETCH
2261	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A1)
2262#endif
2263
2264	pshufd	 $0xb1, %xmm4,  %xmm5
2265	mulps	 %xmm14, %xmm4
2266	addps	 %xmm4,  %xmm0
2267	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
2268	pshufd	 $0xb1, %xmm6,  %xmm7
2269	mulps	 %xmm14, %xmm6
2270	addps	 %xmm6,  %xmm1
2271	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
2272
2273	pshufd	 $0xb1, %xmm8,  %xmm9
2274	mulps	 %xmm14, %xmm8
2275	addps	 %xmm8,  %xmm2
2276	MOVUPS_A1( -8 * SIZE, A1, %xmm8)
2277	pshufd	 $0xb1, %xmm10, %xmm11
2278	mulps	 %xmm14, %xmm10
2279	addps	 %xmm10, %xmm3
2280	MOVUPS_A1( -4 * SIZE, A1, %xmm10)
2281
2282	mulps	 %xmm15, %xmm5
2283	SUBPS	 %xmm5,  %xmm0
2284	mulps	 %xmm15, %xmm7
2285	SUBPS	 %xmm7,  %xmm1
2286
2287	mulps	 %xmm15, %xmm9
2288	SUBPS	 %xmm9,  %xmm2
2289	mulps	 %xmm15, %xmm11
2290	SUBPS	 %xmm11, %xmm3
2291
2292#ifdef PREFETCHW
2293	PREFETCHW	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(Y1)
2294#endif
2295
2296	movaps	 %xmm0, -32 * SIZE(Y1)
2297	movaps	 %xmm1, -28 * SIZE(Y1)
2298	movaps	 %xmm2, -24 * SIZE(Y1)
2299	movaps	 %xmm3, -20 * SIZE(Y1)
2300
2301	movaps	 -16 * SIZE(Y1), %xmm0
2302	movaps	 -12 * SIZE(Y1), %xmm1
2303	movaps	  -8 * SIZE(Y1), %xmm2
2304	movaps	  -4 * SIZE(Y1), %xmm3
2305
2306	subq	 $-16 * SIZE, A1
2307	subq	 $-16 * SIZE, A2
2308	subq	 $-16 * SIZE, Y1
2309
2310	subq	 $1, I
2311	BRANCH
2312	jg	.L113
2313	ALIGN_3
2314
2315.L114:
2316	pshufd	 $0xb1, %xmm4,  %xmm5
2317	mulps	 %xmm12, %xmm4
2318	addps	 %xmm4,  %xmm0
2319	movsd	-32 * SIZE(A2), %xmm4
2320	movhps	-30 * SIZE(A2), %xmm4
2321	pshufd	 $0xb1, %xmm6,  %xmm7
2322	mulps	 %xmm12, %xmm6
2323	addps	 %xmm6,  %xmm1
2324	movsd	-28 * SIZE(A2), %xmm6
2325	movhps	-26 * SIZE(A2), %xmm6
2326
2327	pshufd	 $0xb1, %xmm8,  %xmm9
2328	mulps	 %xmm12, %xmm8
2329	addps	 %xmm8,  %xmm2
2330	movsd	-24 * SIZE(A2), %xmm8
2331	movhps	-22 * SIZE(A2), %xmm8
2332	pshufd	 $0xb1, %xmm10, %xmm11
2333	mulps	 %xmm12, %xmm10
2334	addps	 %xmm10, %xmm3
2335	movsd	-20 * SIZE(A2), %xmm10
2336	movhps	-18 * SIZE(A2), %xmm10
2337
2338	mulps	 %xmm13, %xmm5
2339	SUBPS	 %xmm5,  %xmm0
2340	mulps	 %xmm13, %xmm7
2341	SUBPS	 %xmm7,  %xmm1
2342
2343	mulps	 %xmm13, %xmm9
2344	SUBPS	 %xmm9,  %xmm2
2345	mulps	 %xmm13, %xmm11
2346	SUBPS	 %xmm11, %xmm3
2347
2348	pshufd	 $0xb1, %xmm4,  %xmm5
2349	mulps	 %xmm14, %xmm4
2350	addps	 %xmm4,  %xmm0
2351	pshufd	 $0xb1, %xmm6,  %xmm7
2352	mulps	 %xmm14, %xmm6
2353	addps	 %xmm6,  %xmm1
2354
2355	pshufd	 $0xb1, %xmm8,  %xmm9
2356	mulps	 %xmm14, %xmm8
2357	addps	 %xmm8,  %xmm2
2358	pshufd	 $0xb1, %xmm10, %xmm11
2359	mulps	 %xmm14, %xmm10
2360	addps	 %xmm10, %xmm3
2361
2362	mulps	 %xmm15, %xmm5
2363	SUBPS	 %xmm5,  %xmm0
2364	mulps	 %xmm15, %xmm7
2365	SUBPS	 %xmm7,  %xmm1
2366
2367	mulps	 %xmm15, %xmm9
2368	SUBPS	 %xmm9,  %xmm2
2369	mulps	 %xmm15, %xmm11
2370	SUBPS	 %xmm11, %xmm3
2371
2372	movaps	 %xmm0, -32 * SIZE(Y1)
2373	movaps	 %xmm1, -28 * SIZE(Y1)
2374	movaps	 %xmm2, -24 * SIZE(Y1)
2375	movaps	 %xmm3, -20 * SIZE(Y1)
2376
2377	movaps	 -16 * SIZE(Y1), %xmm0
2378	movaps	 -12 * SIZE(Y1), %xmm1
2379	movaps	  -8 * SIZE(Y1), %xmm2
2380	movaps	  -4 * SIZE(Y1), %xmm3
2381
2382	subq	 $-16 * SIZE, A1
2383	subq	 $-16 * SIZE, A2
2384	subq	 $-16 * SIZE, Y1
2385	ALIGN_3
2386
2387.L115:
2388	testq	$4, MM
2389	je	.L117
2390
2391	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2392	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
2393	movsd	-32 * SIZE(A2), %xmm8
2394	movhps	-30 * SIZE(A2), %xmm8
2395	movsd	-28 * SIZE(A2), %xmm10
2396	movhps	-26 * SIZE(A2), %xmm10
2397
2398	pshufd	 $0xb1, %xmm4,  %xmm5
2399	pshufd	 $0xb1, %xmm6,  %xmm7
2400	pshufd	 $0xb1, %xmm8,  %xmm9
2401	pshufd	 $0xb1, %xmm10, %xmm11
2402
2403	mulps	 %xmm12, %xmm4
2404	addps	 %xmm4,  %xmm0
2405	mulps	 %xmm12, %xmm6
2406	addps	 %xmm6,  %xmm1
2407
2408	mulps	 %xmm13, %xmm5
2409	SUBPS	 %xmm5,  %xmm0
2410	mulps	 %xmm13, %xmm7
2411	SUBPS	 %xmm7,  %xmm1
2412
2413	mulps	 %xmm14, %xmm8
2414	addps	 %xmm8,  %xmm0
2415	mulps	 %xmm14, %xmm10
2416	addps	 %xmm10, %xmm1
2417
2418	mulps	 %xmm15, %xmm9
2419	SUBPS	 %xmm9,  %xmm0
2420	mulps	 %xmm15, %xmm11
2421	SUBPS	 %xmm11, %xmm1
2422
2423	movaps	 %xmm0, -32 * SIZE(Y1)
2424	movaps	 %xmm1, -28 * SIZE(Y1)
2425
2426	movaps	 %xmm2, %xmm0
2427	movaps	 %xmm3, %xmm1
2428
2429	addq	 $8 * SIZE, A1
2430	addq	 $8 * SIZE, A2
2431	addq	 $8 * SIZE, Y1
2432	ALIGN_3
2433
2434.L117:
2435	testq	$2, MM
2436	je	.L118
2437
2438	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2439	movsd	-32 * SIZE(A2), %xmm6
2440	movhps	-30 * SIZE(A2), %xmm6
2441
2442	pshufd	 $0xb1, %xmm4, %xmm5
2443	mulps	 %xmm12, %xmm4
2444	addps	 %xmm4,  %xmm0
2445	pshufd	 $0xb1, %xmm6, %xmm7
2446	mulps	 %xmm13, %xmm5
2447	SUBPS	 %xmm5,  %xmm0
2448
2449	mulps	 %xmm14, %xmm6
2450	addps	 %xmm6,  %xmm0
2451	mulps	 %xmm15, %xmm7
2452	SUBPS	 %xmm7,  %xmm0
2453
2454	movaps	 %xmm0, -32 * SIZE(Y1)
2455	movaps	 %xmm1, %xmm0
2456
2457	addq	 $4 * SIZE, A1
2458	addq	 $4 * SIZE, A2
2459	addq	 $4 * SIZE, Y1
2460	ALIGN_3
2461
2462.L118:
2463	testq	$1, MM
2464#if GEMV_UNROLL == 2
2465	je	.L119
2466#else
2467	je	.L120
2468#endif
2469
2470	movsd	 -32 * SIZE(A1), %xmm4
2471	movsd	 -32 * SIZE(A2), %xmm6
2472
2473	pshufd	 $0xb1, %xmm4, %xmm5
2474	pshufd	 $0xb1, %xmm6, %xmm7
2475
2476	mulps	 %xmm12, %xmm4
2477	addps	 %xmm4,  %xmm0
2478	mulps	 %xmm13, %xmm5
2479	SUBPS	 %xmm5,  %xmm0
2480
2481	mulps	 %xmm14, %xmm6
2482	addps	 %xmm6,  %xmm0
2483	mulps	 %xmm15, %xmm7
2484	SUBPS	 %xmm7,  %xmm0
2485
2486	movlps	 %xmm0, -32 * SIZE(Y1)
2487
2488#if GEMV_UNROLL == 2
2489	ALIGN_3
2490
2491.L119:
2492	cmpq	$2, N
2493	jge	.L111
2494#endif
2495	ALIGN_3
2496
2497.L120:
2498#endif
2499
2500	cmpq	$1, N
2501	jl	.L990
2502
2503	leaq	32 * SIZE(BUFFER), Y1
2504	movq	A,  A1
2505
2506	movsd	(X), %xmm13
2507	addq	INCX, X
2508
2509#ifdef HAVE_SSE3
2510	movddup	ALPHA, %xmm8
2511#else
2512	movsd	ALPHA, %xmm8
2513	unpcklpd %xmm8, %xmm8
2514#endif
2515
2516	pshufd	$0xb1, %xmm8, %xmm9
2517
2518	pcmpeqb	%xmm11, %xmm11
2519	psllq	$63,    %xmm11
2520
2521	pshufd	$0x00, %xmm13, %xmm12
2522	pshufd	$0x55, %xmm13, %xmm13
2523
2524#ifndef XCONJ
2525	xorps	 %xmm11, %xmm13
2526#else
2527	xorps	 %xmm11, %xmm12
2528#endif
2529
2530	mulps	 %xmm8, %xmm12
2531	mulps	 %xmm9, %xmm13
2532
2533#ifndef XCONJ
2534	subps	 %xmm13, %xmm12
2535#else
2536	addps	 %xmm13, %xmm12
2537#endif
2538
2539	pshufd	$0x55, %xmm12, %xmm13
2540	pshufd	$0x00, %xmm12, %xmm12
2541
2542#ifndef CONJ
2543	xorps	 %xmm11, %xmm13
2544#else
2545	xorps	 %xmm11, %xmm12
2546#endif
2547
2548#ifdef ALIGNED_ACCESS
2549	cmpq	M, MM
2550	je	.L12X
2551
2552	movsd	 -32 * SIZE(A1), %xmm4
2553	movsd	 -32 * SIZE(Y1), %xmm0
2554
2555	pshufd	 $0xb1, %xmm4, %xmm5
2556
2557	mulps	 %xmm12, %xmm4
2558	addps	 %xmm4,  %xmm0
2559	mulps	 %xmm13, %xmm5
2560	SUBPS	 %xmm5,  %xmm0
2561
2562	movlps	 %xmm0, -32 * SIZE(Y1)
2563
2564	addq	 $2 * SIZE, A1
2565	addq	 $2 * SIZE, Y1
2566	ALIGN_3
2567.L12X:
2568#endif
2569
2570	movaps	 -32 * SIZE(Y1), %xmm0
2571	movaps	 -28 * SIZE(Y1), %xmm1
2572	movaps	 -24 * SIZE(Y1), %xmm2
2573	movaps	 -20 * SIZE(Y1), %xmm3
2574	ALIGN_3
2575
2576	movq	MM,  I
2577	sarq	$3,  I
2578	jle	.L125
2579
2580	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2581	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
2582	MOVUPS_A1(-24 * SIZE, A1, %xmm8)
2583	MOVUPS_A1(-20 * SIZE, A1, %xmm10)
2584
2585	decq	 I
2586	jle	 .L124
2587	ALIGN_3
2588
2589.L123:
2590#ifdef PREFETCH
2591	PREFETCH	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(A1)
2592#endif
2593
2594	pshufd	 $0xb1, %xmm4,  %xmm5
2595	mulps	 %xmm12, %xmm4
2596	addps	 %xmm4,  %xmm0
2597	MOVUPS_A1(-16 * SIZE, A1, %xmm4)
2598	pshufd	 $0xb1, %xmm6,  %xmm7
2599	mulps	 %xmm12, %xmm6
2600	addps	 %xmm6,  %xmm1
2601	MOVUPS_A1(-12 * SIZE, A1, %xmm6)
2602
2603	pshufd	 $0xb1, %xmm8,  %xmm9
2604	mulps	 %xmm12, %xmm8
2605	addps	 %xmm8,  %xmm2
2606	MOVUPS_A1( -8 * SIZE, A1, %xmm8)
2607	pshufd	 $0xb1, %xmm10, %xmm11
2608	mulps	 %xmm12, %xmm10
2609	addps	 %xmm10, %xmm3
2610	MOVUPS_A1( -4 * SIZE, A1, %xmm10)
2611
2612	mulps	 %xmm13, %xmm5
2613	SUBPS	 %xmm5,  %xmm0
2614	mulps	 %xmm13, %xmm7
2615	SUBPS	 %xmm7,  %xmm1
2616
2617	mulps	 %xmm13, %xmm9
2618	SUBPS	 %xmm9,  %xmm2
2619	mulps	 %xmm13, %xmm11
2620	SUBPS	 %xmm11, %xmm3
2621
2622#ifdef PREFETCHW
2623	PREFETCHW	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(Y1)
2624#endif
2625
2626	movaps	 %xmm0, -32 * SIZE(Y1)
2627	movaps	 %xmm1, -28 * SIZE(Y1)
2628	movaps	 %xmm2, -24 * SIZE(Y1)
2629	movaps	 %xmm3, -20 * SIZE(Y1)
2630
2631	movaps	 -16 * SIZE(Y1), %xmm0
2632	movaps	 -12 * SIZE(Y1), %xmm1
2633	movaps	  -8 * SIZE(Y1), %xmm2
2634	movaps	  -4 * SIZE(Y1), %xmm3
2635
2636	subq	 $-16 * SIZE, A1
2637	subq	 $-16 * SIZE, A2
2638	subq	 $-16 * SIZE, Y1
2639
2640	subq	 $1, I
2641	BRANCH
2642	jg	.L123
2643	ALIGN_3
2644
2645.L124:
2646	pshufd	 $0xb1, %xmm4,  %xmm5
2647	mulps	 %xmm12, %xmm4
2648	addps	 %xmm4,  %xmm0
2649	pshufd	 $0xb1, %xmm6,  %xmm7
2650	mulps	 %xmm12, %xmm6
2651	addps	 %xmm6,  %xmm1
2652
2653	pshufd	 $0xb1, %xmm8,  %xmm9
2654	mulps	 %xmm12, %xmm8
2655	addps	 %xmm8,  %xmm2
2656	pshufd	 $0xb1, %xmm10, %xmm11
2657	mulps	 %xmm12, %xmm10
2658	addps	 %xmm10, %xmm3
2659
2660	mulps	 %xmm13, %xmm5
2661	SUBPS	 %xmm5,  %xmm0
2662	mulps	 %xmm13, %xmm7
2663	SUBPS	 %xmm7,  %xmm1
2664
2665	mulps	 %xmm13, %xmm9
2666	SUBPS	 %xmm9,  %xmm2
2667	mulps	 %xmm13, %xmm11
2668	SUBPS	 %xmm11, %xmm3
2669
2670	movaps	 %xmm0, -32 * SIZE(Y1)
2671	movaps	 %xmm1, -28 * SIZE(Y1)
2672	movaps	 %xmm2, -24 * SIZE(Y1)
2673	movaps	 %xmm3, -20 * SIZE(Y1)
2674
2675	movaps	 -16 * SIZE(Y1), %xmm0
2676	movaps	 -12 * SIZE(Y1), %xmm1
2677	movaps	  -8 * SIZE(Y1), %xmm2
2678	movaps	  -4 * SIZE(Y1), %xmm3
2679
2680	subq	 $-16 * SIZE, A1
2681	subq	 $-16 * SIZE, Y1
2682	ALIGN_3
2683
2684.L125:
2685	testq	$4, MM
2686	je	.L127
2687
2688	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2689	MOVUPS_A1(-28 * SIZE, A1, %xmm6)
2690
2691	pshufd	 $0xb1, %xmm4,  %xmm5
2692	mulps	 %xmm12, %xmm4
2693	addps	 %xmm4,  %xmm0
2694	pshufd	 $0xb1, %xmm6,  %xmm7
2695	mulps	 %xmm12, %xmm6
2696	addps	 %xmm6,  %xmm1
2697
2698	mulps	 %xmm13, %xmm5
2699	SUBPS	 %xmm5,  %xmm0
2700	mulps	 %xmm13, %xmm7
2701	SUBPS	 %xmm7,  %xmm1
2702
2703	movaps	 %xmm0, -32 * SIZE(Y1)
2704	movaps	 %xmm1, -28 * SIZE(Y1)
2705
2706	movaps	 %xmm2, %xmm0
2707	movaps	 %xmm3, %xmm1
2708
2709	addq	 $8 * SIZE, A1
2710	addq	 $8 * SIZE, Y1
2711	ALIGN_3
2712
2713.L127:
2714	testq	$2, MM
2715	je	.L128
2716
2717	MOVUPS_A1(-32 * SIZE, A1, %xmm4)
2718
2719	pshufd	 $0xb1, %xmm4, %xmm5
2720
2721	mulps	 %xmm12, %xmm4
2722	addps	 %xmm4,  %xmm0
2723	mulps	 %xmm13, %xmm5
2724	SUBPS	 %xmm5,  %xmm0
2725
2726	movaps	 %xmm0, -32 * SIZE(Y1)
2727	movaps	 %xmm1, %xmm0
2728
2729	addq	 $4 * SIZE, A1
2730	addq	 $4 * SIZE, Y1
2731	ALIGN_3
2732
2733.L128:
2734	testq	$1, MM
2735	je	.L990
2736
2737	movsd	 -32 * SIZE(A1), %xmm4
2738
2739	pshufd	 $0xb1, %xmm4, %xmm5
2740
2741	mulps	 %xmm12, %xmm4
2742	addps	 %xmm4,  %xmm0
2743	mulps	 %xmm13, %xmm5
2744	SUBPS	 %xmm5,  %xmm0
2745
2746	movlps	 %xmm0, -32 * SIZE(Y1)
2747
2748	jmp	.L990
2749	ALIGN_3
2750
2751.L200:
2752	testq	$2 * SIZE, LDA
2753	jne	.L300
2754
2755	cmpq	$2, N
2756	jl	.L210
2757	ALIGN_3
2758
2759.L201:
2760	subq	$2, N
2761
2762	leaq	32 * SIZE(BUFFER), Y1
2763	movq	A,  A1
2764	leaq	(A,  LDA, 1), A2
2765	leaq	(A,  LDA, 2), A
2766
2767	movsd	(X), %xmm13
2768	addq	INCX, X
2769	movsd	(X), %xmm15
2770	addq	INCX, X
2771
2772#ifdef HAVE_SSE3
2773	movddup	ALPHA, %xmm8
2774#else
2775	movsd	ALPHA, %xmm8
2776	unpcklpd %xmm8, %xmm8
2777#endif
2778
2779	pshufd	$0xb1, %xmm8, %xmm9
2780
2781	pcmpeqb	%xmm11, %xmm11
2782	psllq	$63,    %xmm11
2783
2784	pshufd	$0x00, %xmm13, %xmm12
2785	pshufd	$0x55, %xmm13, %xmm13
2786	pshufd	$0x00, %xmm15, %xmm14
2787	pshufd	$0x55, %xmm15, %xmm15
2788
2789#ifndef XCONJ
2790	xorps	 %xmm11, %xmm13
2791	xorps	 %xmm11, %xmm15
2792#else
2793	xorps	 %xmm11, %xmm12
2794	xorps	 %xmm11, %xmm14
2795#endif
2796
2797	mulps	 %xmm8, %xmm12
2798	mulps	 %xmm9, %xmm13
2799	mulps	 %xmm8, %xmm14
2800	mulps	 %xmm9, %xmm15
2801
2802#ifndef XCONJ
2803	subps	 %xmm13, %xmm12
2804	subps	 %xmm15, %xmm14
2805#else
2806	addps	 %xmm13, %xmm12
2807	addps	 %xmm15, %xmm14
2808#endif
2809
2810	pshufd	$0x55, %xmm12, %xmm13
2811	pshufd	$0x00, %xmm12, %xmm12
2812	pshufd	$0x55, %xmm14, %xmm15
2813	pshufd	$0x00, %xmm14, %xmm14
2814
2815#ifndef CONJ
2816	xorps	 %xmm11, %xmm13
2817	xorps	 %xmm11, %xmm15
2818#else
2819	xorps	 %xmm11, %xmm12
2820	xorps	 %xmm11, %xmm14
2821#endif
2822
2823#ifdef ALIGNED_ACCESS
2824	cmpq	M, MM
2825	je	.L20X
2826
2827	movsd	 -32 * SIZE(A1), %xmm4
2828	movsd	 -32 * SIZE(A2), %xmm6
2829
2830	movsd	 -32 * SIZE(Y1), %xmm0
2831
2832	pshufd	 $0xb1, %xmm4, %xmm5
2833	pshufd	 $0xb1, %xmm6, %xmm7
2834
2835	mulps	 %xmm12, %xmm4
2836	addps	 %xmm4,  %xmm0
2837	mulps	 %xmm13, %xmm5
2838	SUBPS	 %xmm5,  %xmm0
2839
2840	mulps	 %xmm14, %xmm6
2841	addps	 %xmm6,  %xmm0
2842	mulps	 %xmm15, %xmm7
2843	SUBPS	 %xmm7,  %xmm0
2844
2845	movlps	 %xmm0, -32 * SIZE(Y1)
2846
2847	addq	 $2 * SIZE, A1
2848	addq	 $2 * SIZE, A2
2849	addq	 $2 * SIZE, Y1
2850	ALIGN_3
2851.L20X:
2852#endif
2853
2854	movaps	 -33 * SIZE(A1), %xmm4
2855	movaps	 -33 * SIZE(A2), %xmm6
2856
2857	movaps	 -32 * SIZE(Y1), %xmm0
2858	movaps	 -28 * SIZE(Y1), %xmm1
2859	movaps	 -24 * SIZE(Y1), %xmm2
2860	movaps	 -20 * SIZE(Y1), %xmm3
2861
2862	movq	MM,  I
2863	sarq	$3,  I
2864	jle	.L205
2865
2866	movaps	 -29 * SIZE(A1), %xmm8
2867	movaps	 -25 * SIZE(A1), %xmm9
2868	movaps	 -21 * SIZE(A1), %xmm10
2869
2870	decq	 I
2871	jle	 .L204
2872	ALIGN_3
2873
2874.L203:
2875#ifdef PREFETCH
2876	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A2)
2877#endif
2878
2879	movss	 %xmm8,  %xmm4
2880	shufps	 $0x39,  %xmm4, %xmm4
2881	pshufd	 $0xb1,  %xmm4, %xmm5
2882	mulps	 %xmm12, %xmm4
2883	addps	 %xmm4,  %xmm0
2884	movaps	 -17 * SIZE(A1), %xmm4
2885
2886	movss	 %xmm9,  %xmm8
2887	shufps	 $0x39,  %xmm8, %xmm8
2888	pshufd	 $0xb1,  %xmm8, %xmm7
2889	mulps	 %xmm12, %xmm8
2890	addps	 %xmm8,  %xmm1
2891	movaps	 -29 * SIZE(A2), %xmm8
2892
2893	mulps	 %xmm13, %xmm5
2894	SUBPS	 %xmm5,  %xmm0
2895	mulps	 %xmm13, %xmm7
2896	SUBPS	 %xmm7,  %xmm1
2897
2898	movss	 %xmm10, %xmm9
2899	shufps	 $0x39,  %xmm9, %xmm9
2900	pshufd	 $0xb1,  %xmm9, %xmm5
2901	mulps	 %xmm12, %xmm9
2902	addps	 %xmm9,  %xmm2
2903	movaps	 -25 * SIZE(A2), %xmm9
2904
2905	movss	 %xmm4,  %xmm10
2906	shufps	 $0x39,  %xmm10, %xmm10
2907	pshufd	 $0xb1,  %xmm10, %xmm7
2908	mulps	 %xmm12, %xmm10
2909	addps	 %xmm10, %xmm3
2910	movaps	 -21 * SIZE(A2), %xmm10
2911
2912	mulps	 %xmm13, %xmm5
2913	SUBPS	 %xmm5,  %xmm2
2914	mulps	 %xmm13, %xmm7
2915	SUBPS	 %xmm7,  %xmm3
2916
2917#ifdef PREFETCH
2918	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A1)
2919#endif
2920
2921	movss	 %xmm8,  %xmm6
2922	shufps	 $0x39,  %xmm6, %xmm6
2923	pshufd	 $0xb1,  %xmm6, %xmm5
2924	mulps	 %xmm14, %xmm6
2925	addps	 %xmm6,  %xmm0
2926	movaps	 -17 * SIZE(A2), %xmm6
2927
2928	movss	 %xmm9,  %xmm8
2929	shufps	 $0x39,  %xmm8, %xmm8
2930	pshufd	 $0xb1,  %xmm8, %xmm7
2931	mulps	 %xmm14, %xmm8
2932	addps	 %xmm8,  %xmm1
2933	movaps	 -13 * SIZE(A1), %xmm8
2934
2935	mulps	 %xmm15, %xmm5
2936	SUBPS	 %xmm5,  %xmm0
2937	mulps	 %xmm15, %xmm7
2938	SUBPS	 %xmm7,  %xmm1
2939
2940	movss	 %xmm10, %xmm9
2941	shufps	 $0x39,  %xmm9, %xmm9
2942	pshufd	 $0xb1,  %xmm9, %xmm5
2943	mulps	 %xmm14, %xmm9
2944	addps	 %xmm9,  %xmm2
2945	movaps	  -9 * SIZE(A1), %xmm9
2946
2947	movss	 %xmm6,  %xmm10
2948	shufps	 $0x39,  %xmm10, %xmm10
2949	pshufd	 $0xb1,  %xmm10, %xmm7
2950	mulps	 %xmm14, %xmm10
2951	addps	 %xmm10, %xmm3
2952	movaps	  -5 * SIZE(A1), %xmm10
2953
2954	mulps	 %xmm15, %xmm5
2955	SUBPS	 %xmm5,  %xmm2
2956	mulps	 %xmm15, %xmm7
2957	SUBPS	 %xmm7,  %xmm3
2958
2959#ifdef PREFETCHW
2960	PREFETCHW	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(Y1)
2961#endif
2962
2963	movaps	 %xmm0, -32 * SIZE(Y1)
2964	movaps	 %xmm1, -28 * SIZE(Y1)
2965	movaps	 %xmm2, -24 * SIZE(Y1)
2966	movaps	 %xmm3, -20 * SIZE(Y1)
2967
2968	movaps	 -16 * SIZE(Y1), %xmm0
2969	movaps	 -12 * SIZE(Y1), %xmm1
2970	movaps	  -8 * SIZE(Y1), %xmm2
2971	movaps	  -4 * SIZE(Y1), %xmm3
2972
2973	subq	 $-16 * SIZE, A1
2974	subq	 $-16 * SIZE, A2
2975	subq	 $-16 * SIZE, Y1
2976
2977	subq	 $1, I
2978	BRANCH
2979	jg	.L203
2980	ALIGN_3
2981
2982.L204:
2983	movss	 %xmm8,  %xmm4
2984	shufps	 $0x39,  %xmm4, %xmm4
2985	pshufd	 $0xb1,  %xmm4, %xmm5
2986	mulps	 %xmm12, %xmm4
2987	addps	 %xmm4,  %xmm0
2988	movaps	 -17 * SIZE(A1), %xmm4
2989
2990	movss	 %xmm9,  %xmm8
2991	shufps	 $0x39,  %xmm8, %xmm8
2992	pshufd	 $0xb1,  %xmm8, %xmm7
2993	mulps	 %xmm12, %xmm8
2994	addps	 %xmm8,  %xmm1
2995	movaps	 -29 * SIZE(A2), %xmm8
2996
2997	mulps	 %xmm13, %xmm5
2998	SUBPS	 %xmm5,  %xmm0
2999	mulps	 %xmm13, %xmm7
3000	SUBPS	 %xmm7,  %xmm1
3001
3002	movss	 %xmm10, %xmm9
3003	shufps	 $0x39,  %xmm9, %xmm9
3004	pshufd	 $0xb1,  %xmm9, %xmm5
3005	mulps	 %xmm12, %xmm9
3006	addps	 %xmm9,  %xmm2
3007	movaps	 -25 * SIZE(A2), %xmm9
3008
3009	movss	 %xmm4,  %xmm10
3010	shufps	 $0x39,  %xmm10, %xmm10
3011	pshufd	 $0xb1,  %xmm10, %xmm7
3012	mulps	 %xmm12, %xmm10
3013	addps	 %xmm10, %xmm3
3014	movaps	 -21 * SIZE(A2), %xmm10
3015
3016	mulps	 %xmm13, %xmm5
3017	SUBPS	 %xmm5,  %xmm2
3018	mulps	 %xmm13, %xmm7
3019	SUBPS	 %xmm7,  %xmm3
3020
3021	movss	 %xmm8,  %xmm6
3022	shufps	 $0x39,  %xmm6, %xmm6
3023	pshufd	 $0xb1,  %xmm6, %xmm5
3024	mulps	 %xmm14, %xmm6
3025	addps	 %xmm6,  %xmm0
3026	movaps	 -17 * SIZE(A2), %xmm6
3027
3028	movss	 %xmm9,  %xmm8
3029	shufps	 $0x39,  %xmm8, %xmm8
3030	pshufd	 $0xb1,  %xmm8, %xmm7
3031	mulps	 %xmm14, %xmm8
3032	addps	 %xmm8,  %xmm1
3033
3034	mulps	 %xmm15, %xmm5
3035	SUBPS	 %xmm5,  %xmm0
3036	mulps	 %xmm15, %xmm7
3037	SUBPS	 %xmm7,  %xmm1
3038
3039	movss	 %xmm10, %xmm9
3040	shufps	 $0x39,  %xmm9, %xmm9
3041	pshufd	 $0xb1,  %xmm9, %xmm5
3042	mulps	 %xmm14, %xmm9
3043	addps	 %xmm9,  %xmm2
3044
3045	movss	 %xmm6,  %xmm10
3046	shufps	 $0x39,  %xmm10, %xmm10
3047	pshufd	 $0xb1,  %xmm10, %xmm7
3048	mulps	 %xmm14, %xmm10
3049	addps	 %xmm10, %xmm3
3050
3051	mulps	 %xmm15, %xmm5
3052	SUBPS	 %xmm5,  %xmm2
3053	mulps	 %xmm15, %xmm7
3054	SUBPS	 %xmm7,  %xmm3
3055
3056	movaps	 %xmm0, -32 * SIZE(Y1)
3057	movaps	 %xmm1, -28 * SIZE(Y1)
3058	movaps	 %xmm2, -24 * SIZE(Y1)
3059	movaps	 %xmm3, -20 * SIZE(Y1)
3060
3061	movaps	 -16 * SIZE(Y1), %xmm0
3062	movaps	 -12 * SIZE(Y1), %xmm1
3063	movaps	  -8 * SIZE(Y1), %xmm2
3064	movaps	  -4 * SIZE(Y1), %xmm3
3065
3066	subq	 $-16 * SIZE, A1
3067	subq	 $-16 * SIZE, A2
3068	subq	 $-16 * SIZE, Y1
3069	ALIGN_3
3070
3071.L205:
3072	testq	$4, MM
3073	je	.L207
3074
3075	movaps	 -29 * SIZE(A1), %xmm8
3076	movaps	 -25 * SIZE(A1), %xmm9
3077	movaps	 -29 * SIZE(A2), %xmm10
3078	movaps	 -25 * SIZE(A2), %xmm11
3079
3080	movss	 %xmm8,  %xmm4
3081	shufps	 $0x39,  %xmm4, %xmm4
3082	pshufd	 $0xb1,  %xmm4, %xmm5
3083	mulps	 %xmm12, %xmm4
3084	addps	 %xmm4,  %xmm0
3085
3086	movss	 %xmm9,  %xmm8
3087	shufps	 $0x39,  %xmm8, %xmm8
3088	pshufd	 $0xb1,  %xmm8, %xmm7
3089	mulps	 %xmm12, %xmm8
3090	addps	 %xmm8,  %xmm1
3091
3092	mulps	 %xmm13, %xmm5
3093	SUBPS	 %xmm5,  %xmm0
3094	mulps	 %xmm13, %xmm7
3095	SUBPS	 %xmm7,  %xmm1
3096
3097	movss	 %xmm10, %xmm6
3098	shufps	 $0x39,  %xmm6, %xmm6
3099	pshufd	 $0xb1,  %xmm6, %xmm5
3100	mulps	 %xmm14, %xmm6
3101	addps	 %xmm6,  %xmm0
3102
3103	movss	 %xmm11, %xmm10
3104	shufps	 $0x39,  %xmm10, %xmm10
3105	pshufd	 $0xb1,  %xmm10, %xmm7
3106	mulps	 %xmm14, %xmm10
3107	addps	 %xmm10, %xmm1
3108
3109	mulps	 %xmm15, %xmm5
3110	SUBPS	 %xmm5,  %xmm0
3111	mulps	 %xmm15, %xmm7
3112	SUBPS	 %xmm7,  %xmm1
3113
3114	movaps	 %xmm0, -32 * SIZE(Y1)
3115	movaps	 %xmm1, -28 * SIZE(Y1)
3116
3117	movaps	 %xmm9,  %xmm4
3118	movaps	 %xmm11, %xmm6
3119	movaps	 %xmm2, %xmm0
3120	movaps	 %xmm3, %xmm1
3121
3122	addq	 $8 * SIZE, A1
3123	addq	 $8 * SIZE, A2
3124	addq	 $8 * SIZE, Y1
3125	ALIGN_3
3126
3127.L207:
3128	testq	$2, MM
3129	je	.L208
3130
3131	movaps	 -29 * SIZE(A1), %xmm8
3132	movaps	 -29 * SIZE(A2), %xmm9
3133
3134	movss	 %xmm8,  %xmm4
3135	shufps	 $0x39,  %xmm4, %xmm4
3136	movss	 %xmm9, %xmm6
3137	shufps	 $0x39,  %xmm6, %xmm6
3138
3139	pshufd	 $0xb1, %xmm4, %xmm5
3140	mulps	 %xmm12, %xmm4
3141	addps	 %xmm4,  %xmm0
3142	pshufd	 $0xb1, %xmm6, %xmm7
3143	mulps	 %xmm13, %xmm5
3144	SUBPS	 %xmm5,  %xmm0
3145
3146	mulps	 %xmm14, %xmm6
3147	addps	 %xmm6,  %xmm0
3148	mulps	 %xmm15, %xmm7
3149	SUBPS	 %xmm7,  %xmm0
3150
3151	movaps	 %xmm0, -32 * SIZE(Y1)
3152	movaps	 %xmm1, %xmm0
3153
3154	addq	 $4 * SIZE, A1
3155	addq	 $4 * SIZE, A2
3156	addq	 $4 * SIZE, Y1
3157	ALIGN_3
3158
3159.L208:
3160	testq	$1, MM
3161	je	.L209
3162
3163	movsd	 -32 * SIZE(A1), %xmm4
3164	movsd	 -32 * SIZE(A2), %xmm6
3165
3166	pshufd	 $0xb1, %xmm4, %xmm5
3167	pshufd	 $0xb1, %xmm6, %xmm7
3168
3169	mulps	 %xmm12, %xmm4
3170	addps	 %xmm4,  %xmm0
3171	mulps	 %xmm13, %xmm5
3172	SUBPS	 %xmm5,  %xmm0
3173
3174	mulps	 %xmm14, %xmm6
3175	addps	 %xmm6,  %xmm0
3176	mulps	 %xmm15, %xmm7
3177	SUBPS	 %xmm7,  %xmm0
3178
3179	movlps	 %xmm0, -32 * SIZE(Y1)
3180	ALIGN_3
3181
3182.L209:
3183	cmpq	$2, N
3184	jge	.L201
3185	ALIGN_3
3186
3187.L210:
3188	cmpq	$1, N
3189	jl	.L990
3190
3191	leaq	32 * SIZE(BUFFER), Y1
3192	movq	A,  A1
3193
3194	movsd	(X), %xmm13
3195	addq	INCX, X
3196
3197#ifdef HAVE_SSE3
3198	movddup	ALPHA, %xmm8
3199#else
3200	movsd	ALPHA, %xmm8
3201	unpcklpd %xmm8, %xmm8
3202#endif
3203
3204	pshufd	$0xb1, %xmm8, %xmm9
3205
3206	pcmpeqb	%xmm11, %xmm11
3207	psllq	$63,    %xmm11
3208
3209	pshufd	$0x00, %xmm13, %xmm12
3210	pshufd	$0x55, %xmm13, %xmm13
3211
3212#ifndef XCONJ
3213	xorps	 %xmm11, %xmm13
3214#else
3215	xorps	 %xmm11, %xmm12
3216#endif
3217
3218	mulps	 %xmm8, %xmm12
3219	mulps	 %xmm9, %xmm13
3220
3221#ifndef XCONJ
3222	subps	 %xmm13, %xmm12
3223#else
3224	addps	 %xmm13, %xmm12
3225#endif
3226
3227	pshufd	$0x55, %xmm12, %xmm13
3228	pshufd	$0x00, %xmm12, %xmm12
3229
3230#ifndef CONJ
3231	xorps	 %xmm11, %xmm13
3232#else
3233	xorps	 %xmm11, %xmm12
3234#endif
3235
3236#ifdef ALIGNED_ACCESS
3237	cmpq	M, MM
3238	je	.L21X
3239
3240	movsd	 -32 * SIZE(A1), %xmm4
3241	movsd	 -32 * SIZE(Y1), %xmm0
3242
3243	pshufd	 $0xb1, %xmm4, %xmm5
3244
3245	mulps	 %xmm12, %xmm4
3246	addps	 %xmm4,  %xmm0
3247	mulps	 %xmm13, %xmm5
3248	SUBPS	 %xmm5,  %xmm0
3249
3250	movlps	 %xmm0, -32 * SIZE(Y1)
3251
3252	addq	 $2 * SIZE, A1
3253	addq	 $2 * SIZE, Y1
3254	ALIGN_3
3255.L21X:
3256#endif
3257
3258	movaps	 -33 * SIZE(A1), %xmm4
3259
3260	movaps	 -32 * SIZE(Y1), %xmm0
3261	movaps	 -28 * SIZE(Y1), %xmm1
3262	movaps	 -24 * SIZE(Y1), %xmm2
3263	movaps	 -20 * SIZE(Y1), %xmm3
3264
3265	movq	MM,  I
3266	sarq	$3,  I
3267	jle	.L215
3268
3269	movaps	 -29 * SIZE(A1), %xmm6
3270	movaps	 -25 * SIZE(A1), %xmm8
3271	movaps	 -21 * SIZE(A1), %xmm10
3272
3273	decq	 I
3274	jle	 .L214
3275	ALIGN_3
3276
3277.L213:
3278#ifdef PREFETCH
3279	PREFETCH	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(A1)
3280#endif
3281
3282	movss	 %xmm6,  %xmm4
3283	shufps	 $0x39,  %xmm4, %xmm4
3284	pshufd	 $0xb1, %xmm4,  %xmm5
3285	mulps	 %xmm12, %xmm4
3286	addps	 %xmm4,  %xmm0
3287	movaps	 -17 * SIZE(A1), %xmm4
3288
3289	movss	 %xmm8,  %xmm6
3290	shufps	 $0x39,  %xmm6, %xmm6
3291	pshufd	 $0xb1, %xmm6,  %xmm7
3292	mulps	 %xmm12, %xmm6
3293	addps	 %xmm6,  %xmm1
3294	movaps	 -13 * SIZE(A1), %xmm6
3295
3296	movss	 %xmm10, %xmm8
3297	shufps	 $0x39, %xmm8, %xmm8
3298	pshufd	 $0xb1, %xmm8,  %xmm9
3299	mulps	 %xmm12, %xmm8
3300	addps	 %xmm8,  %xmm2
3301	movaps	  -9 * SIZE(A1), %xmm8
3302
3303	movss	 %xmm4, %xmm10
3304	shufps	 $0x39, %xmm10, %xmm10
3305	pshufd	 $0xb1, %xmm10, %xmm11
3306	mulps	 %xmm12, %xmm10
3307	addps	 %xmm10, %xmm3
3308	movaps	  -5 * SIZE(A1), %xmm10
3309
3310	mulps	 %xmm13, %xmm5
3311	SUBPS	 %xmm5,  %xmm0
3312	mulps	 %xmm13, %xmm7
3313	SUBPS	 %xmm7,  %xmm1
3314
3315	mulps	 %xmm13, %xmm9
3316	SUBPS	 %xmm9,  %xmm2
3317	mulps	 %xmm13, %xmm11
3318	SUBPS	 %xmm11, %xmm3
3319
3320#ifdef PREFETCHW
3321	PREFETCHW	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(Y1)
3322#endif
3323
3324	movaps	 %xmm0, -32 * SIZE(Y1)
3325	movaps	 %xmm1, -28 * SIZE(Y1)
3326	movaps	 %xmm2, -24 * SIZE(Y1)
3327	movaps	 %xmm3, -20 * SIZE(Y1)
3328
3329	movaps	 -16 * SIZE(Y1), %xmm0
3330	movaps	 -12 * SIZE(Y1), %xmm1
3331	movaps	  -8 * SIZE(Y1), %xmm2
3332	movaps	  -4 * SIZE(Y1), %xmm3
3333
3334	subq	 $-16 * SIZE, A1
3335	subq	 $-16 * SIZE, A2
3336	subq	 $-16 * SIZE, Y1
3337
3338	subq	 $1, I
3339	BRANCH
3340	jg	.L213
3341	ALIGN_3
3342
3343.L214:
3344	movss	 %xmm6,  %xmm4
3345	shufps	 $0x39,  %xmm4, %xmm4
3346	pshufd	 $0xb1, %xmm4,  %xmm5
3347	mulps	 %xmm12, %xmm4
3348	addps	 %xmm4,  %xmm0
3349	movaps	 -17 * SIZE(A1), %xmm4
3350
3351	movss	 %xmm8,  %xmm6
3352	shufps	 $0x39,  %xmm6, %xmm6
3353	pshufd	 $0xb1, %xmm6,  %xmm7
3354	mulps	 %xmm12, %xmm6
3355	addps	 %xmm6,  %xmm1
3356
3357	movss	 %xmm10, %xmm8
3358	shufps	 $0x39, %xmm8, %xmm8
3359	pshufd	 $0xb1, %xmm8,  %xmm9
3360	mulps	 %xmm12, %xmm8
3361	addps	 %xmm8,  %xmm2
3362
3363	movss	 %xmm4, %xmm10
3364	shufps	 $0x39, %xmm10, %xmm10
3365	pshufd	 $0xb1, %xmm10, %xmm11
3366	mulps	 %xmm12, %xmm10
3367	addps	 %xmm10, %xmm3
3368
3369	mulps	 %xmm13, %xmm5
3370	SUBPS	 %xmm5,  %xmm0
3371	mulps	 %xmm13, %xmm7
3372	SUBPS	 %xmm7,  %xmm1
3373
3374	mulps	 %xmm13, %xmm9
3375	SUBPS	 %xmm9,  %xmm2
3376	mulps	 %xmm13, %xmm11
3377	SUBPS	 %xmm11, %xmm3
3378
3379	movaps	 %xmm0, -32 * SIZE(Y1)
3380	movaps	 %xmm1, -28 * SIZE(Y1)
3381	movaps	 %xmm2, -24 * SIZE(Y1)
3382	movaps	 %xmm3, -20 * SIZE(Y1)
3383
3384	movaps	 -16 * SIZE(Y1), %xmm0
3385	movaps	 -12 * SIZE(Y1), %xmm1
3386	movaps	  -8 * SIZE(Y1), %xmm2
3387	movaps	  -4 * SIZE(Y1), %xmm3
3388
3389	subq	 $-16 * SIZE, A1
3390	subq	 $-16 * SIZE, Y1
3391	ALIGN_3
3392
3393.L215:
3394	testq	$4, MM
3395	je	.L217
3396
3397	movaps	 -29 * SIZE(A1), %xmm6
3398	movaps	 -25 * SIZE(A1), %xmm8
3399
3400	movss	 %xmm6, %xmm4
3401	shufps	 $0x39, %xmm4, %xmm4
3402	pshufd	 $0xb1, %xmm4, %xmm5
3403	mulps	 %xmm12, %xmm4
3404	addps	 %xmm4,  %xmm0
3405
3406	movss	 %xmm8, %xmm6
3407	shufps	 $0x39, %xmm6, %xmm6
3408	pshufd	 $0xb1, %xmm6, %xmm7
3409	mulps	 %xmm12, %xmm6
3410	addps	 %xmm6,  %xmm1
3411
3412	mulps	 %xmm13, %xmm5
3413	SUBPS	 %xmm5,  %xmm0
3414	mulps	 %xmm13, %xmm7
3415	SUBPS	 %xmm7,  %xmm1
3416
3417	movaps	 %xmm0, -32 * SIZE(Y1)
3418	movaps	 %xmm1, -28 * SIZE(Y1)
3419
3420	movaps	 %xmm2, %xmm0
3421	movaps	 %xmm3, %xmm1
3422	movaps	 %xmm8, %xmm4
3423
3424	addq	 $8 * SIZE, A1
3425	addq	 $8 * SIZE, Y1
3426	ALIGN_3
3427
3428.L217:
3429	testq	$2, MM
3430	je	.L218
3431
3432	movaps	 -29 * SIZE(A1), %xmm6
3433
3434	movss	 %xmm6, %xmm4
3435	shufps	 $0x39, %xmm4, %xmm4
3436
3437	pshufd	 $0xb1, %xmm4, %xmm5
3438	mulps	 %xmm12, %xmm4
3439	addps	 %xmm4,  %xmm0
3440	mulps	 %xmm13, %xmm5
3441	SUBPS	 %xmm5,  %xmm0
3442
3443	movaps	 %xmm0, -32 * SIZE(Y1)
3444	movaps	 %xmm1, %xmm0
3445
3446	addq	 $4 * SIZE, A1
3447	addq	 $4 * SIZE, Y1
3448	ALIGN_3
3449
3450.L218:
3451	testq	$1, MM
3452	je	.L990
3453
3454	movsd	 -32 * SIZE(A1), %xmm4
3455
3456	pshufd	 $0xb1, %xmm4, %xmm5
3457
3458	mulps	 %xmm12, %xmm4
3459	addps	 %xmm4,  %xmm0
3460	mulps	 %xmm13, %xmm5
3461	SUBPS	 %xmm5,  %xmm0
3462
3463	movlps	 %xmm0, -32 * SIZE(Y1)
3464	jmp	 .L990
3465	ALIGN_3
3466
3467.L300:
3468	cmpq	$2, N
3469	jl	.L310
3470	ALIGN_3
3471
3472.L301:
3473	subq	$2, N
3474
3475	leaq	32 * SIZE(BUFFER), Y1
3476	movq	A,  A1
3477	leaq	(A,  LDA, 1), A2
3478	leaq	(A,  LDA, 2), A
3479
3480	movsd	(X), %xmm13
3481	addq	INCX, X
3482	movsd	(X), %xmm15
3483	addq	INCX, X
3484
3485#ifdef HAVE_SSE3
3486	movddup	ALPHA, %xmm8
3487#else
3488	movsd	ALPHA, %xmm8
3489	unpcklpd %xmm8, %xmm8
3490#endif
3491
3492	pshufd	$0xb1, %xmm8, %xmm9
3493
3494	pcmpeqb	%xmm11, %xmm11
3495	psllq	$63,    %xmm11
3496
3497	pshufd	$0x00, %xmm13, %xmm12
3498	pshufd	$0x55, %xmm13, %xmm13
3499	pshufd	$0x00, %xmm15, %xmm14
3500	pshufd	$0x55, %xmm15, %xmm15
3501
3502#ifndef XCONJ
3503	xorps	 %xmm11, %xmm13
3504	xorps	 %xmm11, %xmm15
3505#else
3506	xorps	 %xmm11, %xmm12
3507	xorps	 %xmm11, %xmm14
3508#endif
3509
3510	mulps	 %xmm8, %xmm12
3511	mulps	 %xmm9, %xmm13
3512	mulps	 %xmm8, %xmm14
3513	mulps	 %xmm9, %xmm15
3514
3515#ifndef XCONJ
3516	subps	 %xmm13, %xmm12
3517	subps	 %xmm15, %xmm14
3518#else
3519	addps	 %xmm13, %xmm12
3520	addps	 %xmm15, %xmm14
3521#endif
3522
3523	pshufd	$0x55, %xmm12, %xmm13
3524	pshufd	$0x00, %xmm12, %xmm12
3525	pshufd	$0x55, %xmm14, %xmm15
3526	pshufd	$0x00, %xmm14, %xmm14
3527
3528#ifndef CONJ
3529	xorps	 %xmm11, %xmm13
3530	xorps	 %xmm11, %xmm15
3531#else
3532	xorps	 %xmm11, %xmm12
3533	xorps	 %xmm11, %xmm14
3534#endif
3535
3536#ifdef ALIGNED_ACCESS
3537	cmpq	M, MM
3538	je	.L30X
3539
3540	movsd	 -32 * SIZE(A1), %xmm4
3541	movsd	 -32 * SIZE(A2), %xmm6
3542
3543	movsd	 -32 * SIZE(Y1), %xmm0
3544
3545	pshufd	 $0xb1, %xmm4, %xmm5
3546	pshufd	 $0xb1, %xmm6, %xmm7
3547
3548	mulps	 %xmm12, %xmm4
3549	addps	 %xmm4,  %xmm0
3550	mulps	 %xmm13, %xmm5
3551	SUBPS	 %xmm5,  %xmm0
3552
3553	mulps	 %xmm14, %xmm6
3554	addps	 %xmm6,  %xmm0
3555	mulps	 %xmm15, %xmm7
3556	SUBPS	 %xmm7,  %xmm0
3557
3558	movlps	 %xmm0, -32 * SIZE(Y1)
3559
3560	addq	 $2 * SIZE, A1
3561	addq	 $2 * SIZE, A2
3562	addq	 $2 * SIZE, Y1
3563	ALIGN_3
3564.L30X:
3565#endif
3566
3567	movaps	 -33 * SIZE(A1), %xmm4
3568	movaps	 -35 * SIZE(A2), %xmm6
3569
3570	movaps	 -32 * SIZE(Y1), %xmm0
3571	movaps	 -28 * SIZE(Y1), %xmm1
3572	movaps	 -24 * SIZE(Y1), %xmm2
3573	movaps	 -20 * SIZE(Y1), %xmm3
3574
3575	movq	MM,  I
3576	sarq	$3,  I
3577	jle	.L305
3578
3579	movaps	 -29 * SIZE(A1), %xmm8
3580	movaps	 -25 * SIZE(A1), %xmm9
3581	movaps	 -21 * SIZE(A1), %xmm10
3582
3583	decq	 I
3584	jle	 .L304
3585	ALIGN_3
3586
3587.L303:
3588#ifdef PREFETCH
3589	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A2)
3590#endif
3591
3592	movss	 %xmm8,  %xmm4
3593	shufps	 $0x39,  %xmm4, %xmm4
3594	pshufd	 $0xb1,  %xmm4, %xmm5
3595	mulps	 %xmm12, %xmm4
3596	addps	 %xmm4,  %xmm0
3597	movaps	 -17 * SIZE(A1), %xmm4
3598
3599	movss	 %xmm9,  %xmm8
3600	shufps	 $0x39,  %xmm8, %xmm8
3601	pshufd	 $0xb1,  %xmm8, %xmm7
3602	mulps	 %xmm12, %xmm8
3603	addps	 %xmm8,  %xmm1
3604	movaps	 -31 * SIZE(A2), %xmm8
3605
3606	mulps	 %xmm13, %xmm5
3607	SUBPS	 %xmm5,  %xmm0
3608	mulps	 %xmm13, %xmm7
3609	SUBPS	 %xmm7,  %xmm1
3610
3611	movss	 %xmm10, %xmm9
3612	shufps	 $0x39,  %xmm9, %xmm9
3613	pshufd	 $0xb1,  %xmm9, %xmm5
3614	mulps	 %xmm12, %xmm9
3615	addps	 %xmm9,  %xmm2
3616	movaps	 -27 * SIZE(A2), %xmm9
3617
3618	movss	 %xmm4,  %xmm10
3619	shufps	 $0x39,  %xmm10, %xmm10
3620	pshufd	 $0xb1,  %xmm10, %xmm7
3621	mulps	 %xmm12, %xmm10
3622	addps	 %xmm10, %xmm3
3623	movaps	 -23 * SIZE(A2), %xmm10
3624
3625	mulps	 %xmm13, %xmm5
3626	SUBPS	 %xmm5,  %xmm2
3627	mulps	 %xmm13, %xmm7
3628	SUBPS	 %xmm7,  %xmm3
3629
3630#ifdef PREFETCH
3631	PREFETCH	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(A1)
3632#endif
3633
3634	movss	 %xmm8,  %xmm6
3635	shufps	 $0x93,  %xmm8, %xmm6
3636	pshufd	 $0xb1,  %xmm6, %xmm5
3637	mulps	 %xmm14, %xmm6
3638	addps	 %xmm6,  %xmm0
3639	movaps	 -19 * SIZE(A2), %xmm6
3640
3641	movss	 %xmm9,  %xmm8
3642	shufps	 $0x93,  %xmm9, %xmm8
3643	pshufd	 $0xb1,  %xmm8, %xmm7
3644	mulps	 %xmm14, %xmm8
3645	addps	 %xmm8,  %xmm1
3646	movaps	 -13 * SIZE(A1), %xmm8
3647
3648	mulps	 %xmm15, %xmm5
3649	SUBPS	 %xmm5,  %xmm0
3650	mulps	 %xmm15, %xmm7
3651	SUBPS	 %xmm7,  %xmm1
3652
3653	movss	 %xmm10, %xmm9
3654	shufps	 $0x93,  %xmm10, %xmm9
3655	pshufd	 $0xb1,  %xmm9, %xmm5
3656	mulps	 %xmm14, %xmm9
3657	addps	 %xmm9,  %xmm2
3658	movaps	  -9 * SIZE(A1), %xmm9
3659
3660	movss	 %xmm6,  %xmm10
3661	shufps	 $0x93,  %xmm6, %xmm10
3662	pshufd	 $0xb1,  %xmm10, %xmm7
3663	mulps	 %xmm14, %xmm10
3664	addps	 %xmm10, %xmm3
3665	movaps	  -5 * SIZE(A1), %xmm10
3666
3667	mulps	 %xmm15, %xmm5
3668	SUBPS	 %xmm5,  %xmm2
3669	mulps	 %xmm15, %xmm7
3670	SUBPS	 %xmm7,  %xmm3
3671
3672#ifdef PREFETCHW
3673	PREFETCHW	(PREFETCHSIZE) * 2 - 128 + PREOFFSET(Y1)
3674#endif
3675
3676	movaps	 %xmm0, -32 * SIZE(Y1)
3677	movaps	 %xmm1, -28 * SIZE(Y1)
3678	movaps	 %xmm2, -24 * SIZE(Y1)
3679	movaps	 %xmm3, -20 * SIZE(Y1)
3680
3681	movaps	 -16 * SIZE(Y1), %xmm0
3682	movaps	 -12 * SIZE(Y1), %xmm1
3683	movaps	  -8 * SIZE(Y1), %xmm2
3684	movaps	  -4 * SIZE(Y1), %xmm3
3685
3686	subq	 $-16 * SIZE, A1
3687	subq	 $-16 * SIZE, A2
3688	subq	 $-16 * SIZE, Y1
3689
3690	subq	 $1, I
3691	BRANCH
3692	jg	.L303
3693	ALIGN_3
3694
3695.L304:
3696	movss	 %xmm8,  %xmm4
3697	shufps	 $0x39,  %xmm4, %xmm4
3698	pshufd	 $0xb1,  %xmm4, %xmm5
3699	mulps	 %xmm12, %xmm4
3700	addps	 %xmm4,  %xmm0
3701	movaps	 -17 * SIZE(A1), %xmm4
3702
3703	movss	 %xmm9,  %xmm8
3704	shufps	 $0x39,  %xmm8, %xmm8
3705	pshufd	 $0xb1,  %xmm8, %xmm7
3706	mulps	 %xmm12, %xmm8
3707	addps	 %xmm8,  %xmm1
3708	movaps	 -31 * SIZE(A2), %xmm8
3709
3710	mulps	 %xmm13, %xmm5
3711	SUBPS	 %xmm5,  %xmm0
3712	mulps	 %xmm13, %xmm7
3713	SUBPS	 %xmm7,  %xmm1
3714
3715	movss	 %xmm10, %xmm9
3716	shufps	 $0x39,  %xmm9, %xmm9
3717	pshufd	 $0xb1,  %xmm9, %xmm5
3718	mulps	 %xmm12, %xmm9
3719	addps	 %xmm9,  %xmm2
3720	movaps	 -27 * SIZE(A2), %xmm9
3721
3722	movss	 %xmm4,  %xmm10
3723	shufps	 $0x39,  %xmm10, %xmm10
3724	pshufd	 $0xb1,  %xmm10, %xmm7
3725	mulps	 %xmm12, %xmm10
3726	addps	 %xmm10, %xmm3
3727	movaps	 -23 * SIZE(A2), %xmm10
3728
3729	mulps	 %xmm13, %xmm5
3730	SUBPS	 %xmm5,  %xmm2
3731	mulps	 %xmm13, %xmm7
3732	SUBPS	 %xmm7,  %xmm3
3733
3734	movss	 %xmm8,  %xmm6
3735	shufps	 $0x93,  %xmm8, %xmm6
3736	pshufd	 $0xb1,  %xmm6, %xmm5
3737	mulps	 %xmm14, %xmm6
3738	addps	 %xmm6,  %xmm0
3739	movaps	 -19 * SIZE(A2), %xmm6
3740
3741	movss	 %xmm9,  %xmm8
3742	shufps	 $0x93,  %xmm9, %xmm8
3743	pshufd	 $0xb1,  %xmm8, %xmm7
3744	mulps	 %xmm14, %xmm8
3745	addps	 %xmm8,  %xmm1
3746
3747	mulps	 %xmm15, %xmm5
3748	SUBPS	 %xmm5,  %xmm0
3749	mulps	 %xmm15, %xmm7
3750	SUBPS	 %xmm7,  %xmm1
3751
3752	movss	 %xmm10, %xmm9
3753	shufps	 $0x93,  %xmm10, %xmm9
3754	pshufd	 $0xb1,  %xmm9, %xmm5
3755	mulps	 %xmm14, %xmm9
3756	addps	 %xmm9,  %xmm2
3757
3758	movss	 %xmm6,  %xmm10
3759	shufps	 $0x93,  %xmm6,  %xmm10
3760	pshufd	 $0xb1,  %xmm10, %xmm7
3761	mulps	 %xmm14, %xmm10
3762	addps	 %xmm10, %xmm3
3763
3764	mulps	 %xmm15, %xmm5
3765	SUBPS	 %xmm5,  %xmm2
3766	mulps	 %xmm15, %xmm7
3767	SUBPS	 %xmm7,  %xmm3
3768
3769	movaps	 %xmm0, -32 * SIZE(Y1)
3770	movaps	 %xmm1, -28 * SIZE(Y1)
3771	movaps	 %xmm2, -24 * SIZE(Y1)
3772	movaps	 %xmm3, -20 * SIZE(Y1)
3773
3774	movaps	 -16 * SIZE(Y1), %xmm0
3775	movaps	 -12 * SIZE(Y1), %xmm1
3776	movaps	  -8 * SIZE(Y1), %xmm2
3777	movaps	  -4 * SIZE(Y1), %xmm3
3778
3779	subq	 $-16 * SIZE, A1
3780	subq	 $-16 * SIZE, A2
3781	subq	 $-16 * SIZE, Y1
3782	ALIGN_3
3783
3784.L305:
3785	testq	$4, MM
3786	je	.L307
3787
3788	movaps	 -29 * SIZE(A1), %xmm8
3789	movaps	 -25 * SIZE(A1), %xmm9
3790	movaps	 -31 * SIZE(A2), %xmm10
3791	movaps	 -27 * SIZE(A2), %xmm11
3792
3793	movss	 %xmm8,  %xmm4
3794	shufps	 $0x39,  %xmm4, %xmm4
3795	pshufd	 $0xb1,  %xmm4, %xmm5
3796	mulps	 %xmm12, %xmm4
3797	addps	 %xmm4,  %xmm0
3798
3799	movss	 %xmm9,  %xmm8
3800	shufps	 $0x39,  %xmm8, %xmm8
3801	pshufd	 $0xb1,  %xmm8, %xmm7
3802	mulps	 %xmm12, %xmm8
3803	addps	 %xmm8,  %xmm1
3804
3805	mulps	 %xmm13, %xmm5
3806	SUBPS	 %xmm5,  %xmm0
3807	mulps	 %xmm13, %xmm7
3808	SUBPS	 %xmm7,  %xmm1
3809
3810	movss	 %xmm10, %xmm6
3811	shufps	 $0x93,  %xmm10, %xmm6
3812	pshufd	 $0xb1,  %xmm6,  %xmm5
3813	mulps	 %xmm14, %xmm6
3814	addps	 %xmm6,  %xmm0
3815
3816	movss	 %xmm11, %xmm10
3817	shufps	 $0x93,  %xmm11, %xmm10
3818	pshufd	 $0xb1,  %xmm10, %xmm7
3819	mulps	 %xmm14, %xmm10
3820	addps	 %xmm10, %xmm1
3821
3822	mulps	 %xmm15, %xmm5
3823	SUBPS	 %xmm5,  %xmm0
3824	mulps	 %xmm15, %xmm7
3825	SUBPS	 %xmm7,  %xmm1
3826
3827	movaps	 %xmm0, -32 * SIZE(Y1)
3828	movaps	 %xmm1, -28 * SIZE(Y1)
3829
3830	movaps	 %xmm9,  %xmm4
3831	movaps	 %xmm11, %xmm6
3832	movaps	 %xmm2, %xmm0
3833	movaps	 %xmm3, %xmm1
3834
3835	addq	 $8 * SIZE, A1
3836	addq	 $8 * SIZE, A2
3837	addq	 $8 * SIZE, Y1
3838	ALIGN_3
3839
3840.L307:
3841	testq	$2, MM
3842	je	.L308
3843
3844	movaps	 -29 * SIZE(A1), %xmm8
3845	movaps	 -31 * SIZE(A2), %xmm9
3846
3847	movss	 %xmm8,  %xmm4
3848	shufps	 $0x39,  %xmm4, %xmm4
3849	pshufd	 $0xb1, %xmm4, %xmm5
3850	mulps	 %xmm12, %xmm4
3851	addps	 %xmm4,  %xmm0
3852
3853	movss	 %xmm9, %xmm6
3854	shufps	 $0x93,  %xmm9, %xmm6
3855	pshufd	 $0xb1, %xmm6, %xmm7
3856	mulps	 %xmm13, %xmm5
3857	SUBPS	 %xmm5,  %xmm0
3858
3859	mulps	 %xmm14, %xmm6
3860	addps	 %xmm6,  %xmm0
3861	mulps	 %xmm15, %xmm7
3862	SUBPS	 %xmm7,  %xmm0
3863
3864	movaps	 %xmm0, -32 * SIZE(Y1)
3865	movaps	 %xmm1, %xmm0
3866
3867	addq	 $4 * SIZE, A1
3868	addq	 $4 * SIZE, A2
3869	addq	 $4 * SIZE, Y1
3870	ALIGN_3
3871
3872.L308:
3873	testq	$1, MM
3874	je	.L309
3875
3876	movsd	 -32 * SIZE(A1), %xmm4
3877	movsd	 -32 * SIZE(A2), %xmm6
3878
3879	pshufd	 $0xb1, %xmm4, %xmm5
3880	pshufd	 $0xb1, %xmm6, %xmm7
3881
3882	mulps	 %xmm12, %xmm4
3883	addps	 %xmm4,  %xmm0
3884	mulps	 %xmm13, %xmm5
3885	SUBPS	 %xmm5,  %xmm0
3886
3887	mulps	 %xmm14, %xmm6
3888	addps	 %xmm6,  %xmm0
3889	mulps	 %xmm15, %xmm7
3890	SUBPS	 %xmm7,  %xmm0
3891
3892	movlps	 %xmm0, -32 * SIZE(Y1)
3893	ALIGN_3
3894
3895.L309:
3896	cmpq	$2, N
3897	jge	.L301
3898	ALIGN_3
3899
3900.L310:
3901	cmpq	$1, N
3902	jl	.L990
3903
3904	leaq	32 * SIZE(BUFFER), Y1
3905	movq	A,  A1
3906
3907	movsd	(X), %xmm13
3908	addq	INCX, X
3909
3910#ifdef HAVE_SSE3
3911	movddup	ALPHA, %xmm8
3912#else
3913	movsd	ALPHA, %xmm8
3914	unpcklpd %xmm8, %xmm8
3915#endif
3916
3917	pshufd	$0xb1, %xmm8, %xmm9
3918
3919	pcmpeqb	%xmm11, %xmm11
3920	psllq	$63,    %xmm11
3921
3922	pshufd	$0x00, %xmm13, %xmm12
3923	pshufd	$0x55, %xmm13, %xmm13
3924
3925#ifndef XCONJ
3926	xorps	 %xmm11, %xmm13
3927#else
3928	xorps	 %xmm11, %xmm12
3929#endif
3930
3931	mulps	 %xmm8, %xmm12
3932	mulps	 %xmm9, %xmm13
3933
3934#ifndef XCONJ
3935	subps	 %xmm13, %xmm12
3936#else
3937	addps	 %xmm13, %xmm12
3938#endif
3939
3940	pshufd	$0x55, %xmm12, %xmm13
3941	pshufd	$0x00, %xmm12, %xmm12
3942
3943#ifndef CONJ
3944	xorps	 %xmm11, %xmm13
3945#else
3946	xorps	 %xmm11, %xmm12
3947#endif
3948
3949#ifdef ALIGNED_ACCESS
3950	cmpq	M, MM
3951	je	.L31X
3952
3953	movsd	 -32 * SIZE(A1), %xmm4
3954	movsd	 -32 * SIZE(Y1), %xmm0
3955
3956	pshufd	 $0xb1, %xmm4, %xmm5
3957
3958	mulps	 %xmm12, %xmm4
3959	addps	 %xmm4,  %xmm0
3960	mulps	 %xmm13, %xmm5
3961	SUBPS	 %xmm5,  %xmm0
3962
3963	movlps	 %xmm0, -32 * SIZE(Y1)
3964
3965	addq	 $2 * SIZE, A1
3966	addq	 $2 * SIZE, Y1
3967	ALIGN_3
3968.L31X:
3969#endif
3970
3971	movaps	 -33 * SIZE(A1), %xmm4
3972
3973	movaps	 -32 * SIZE(Y1), %xmm0
3974	movaps	 -28 * SIZE(Y1), %xmm1
3975	movaps	 -24 * SIZE(Y1), %xmm2
3976	movaps	 -20 * SIZE(Y1), %xmm3
3977
3978	movq	MM,  I
3979	sarq	$3,  I
3980	jle	.L315
3981
3982	movaps	 -29 * SIZE(A1), %xmm6
3983	movaps	 -25 * SIZE(A1), %xmm8
3984	movaps	 -21 * SIZE(A1), %xmm10
3985
3986	decq	 I
3987	jle	 .L314
3988	ALIGN_3
3989
3990.L313:
3991#ifdef PREFETCH
3992	PREFETCH	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(A1)
3993#endif
3994
3995	movss	 %xmm6,  %xmm4
3996	shufps	 $0x39,  %xmm4, %xmm4
3997	pshufd	 $0xb1, %xmm4,  %xmm5
3998	mulps	 %xmm12, %xmm4
3999	addps	 %xmm4,  %xmm0
4000	movaps	 -17 * SIZE(A1), %xmm4
4001
4002	movss	 %xmm8,  %xmm6
4003	shufps	 $0x39,  %xmm6, %xmm6
4004	pshufd	 $0xb1, %xmm6,  %xmm7
4005	mulps	 %xmm12, %xmm6
4006	addps	 %xmm6,  %xmm1
4007	movaps	 -13 * SIZE(A1), %xmm6
4008
4009	movss	 %xmm10, %xmm8
4010	shufps	 $0x39, %xmm8, %xmm8
4011	pshufd	 $0xb1, %xmm8,  %xmm9
4012	mulps	 %xmm12, %xmm8
4013	addps	 %xmm8,  %xmm2
4014	movaps	  -9 * SIZE(A1), %xmm8
4015
4016	movss	 %xmm4, %xmm10
4017	shufps	 $0x39, %xmm10, %xmm10
4018	pshufd	 $0xb1, %xmm10, %xmm11
4019	mulps	 %xmm12, %xmm10
4020	addps	 %xmm10, %xmm3
4021	movaps	  -5 * SIZE(A1), %xmm10
4022
4023	mulps	 %xmm13, %xmm5
4024	SUBPS	 %xmm5,  %xmm0
4025	mulps	 %xmm13, %xmm7
4026	SUBPS	 %xmm7,  %xmm1
4027
4028	mulps	 %xmm13, %xmm9
4029	SUBPS	 %xmm9,  %xmm2
4030	mulps	 %xmm13, %xmm11
4031	SUBPS	 %xmm11, %xmm3
4032
4033#ifdef PREFETCHW
4034	PREFETCHW	(PREFETCHSIZE) * 4 - 128 + PREOFFSET(Y1)
4035#endif
4036
4037	movaps	 %xmm0, -32 * SIZE(Y1)
4038	movaps	 %xmm1, -28 * SIZE(Y1)
4039	movaps	 %xmm2, -24 * SIZE(Y1)
4040	movaps	 %xmm3, -20 * SIZE(Y1)
4041
4042	movaps	 -16 * SIZE(Y1), %xmm0
4043	movaps	 -12 * SIZE(Y1), %xmm1
4044	movaps	  -8 * SIZE(Y1), %xmm2
4045	movaps	  -4 * SIZE(Y1), %xmm3
4046
4047	subq	 $-16 * SIZE, A1
4048	subq	 $-16 * SIZE, A2
4049	subq	 $-16 * SIZE, Y1
4050
4051	subq	 $1, I
4052	BRANCH
4053	jg	.L313
4054	ALIGN_3
4055
4056.L314:
4057	movss	 %xmm6,  %xmm4
4058	shufps	 $0x39,  %xmm4, %xmm4
4059	pshufd	 $0xb1, %xmm4,  %xmm5
4060	mulps	 %xmm12, %xmm4
4061	addps	 %xmm4,  %xmm0
4062	movaps	 -17 * SIZE(A1), %xmm4
4063
4064	movss	 %xmm8,  %xmm6
4065	shufps	 $0x39,  %xmm6, %xmm6
4066	pshufd	 $0xb1, %xmm6,  %xmm7
4067	mulps	 %xmm12, %xmm6
4068	addps	 %xmm6,  %xmm1
4069
4070	movss	 %xmm10, %xmm8
4071	shufps	 $0x39, %xmm8, %xmm8
4072	pshufd	 $0xb1, %xmm8,  %xmm9
4073	mulps	 %xmm12, %xmm8
4074	addps	 %xmm8,  %xmm2
4075
4076	movss	 %xmm4, %xmm10
4077	shufps	 $0x39, %xmm10, %xmm10
4078	pshufd	 $0xb1, %xmm10, %xmm11
4079	mulps	 %xmm12, %xmm10
4080	addps	 %xmm10, %xmm3
4081
4082	mulps	 %xmm13, %xmm5
4083	SUBPS	 %xmm5,  %xmm0
4084	mulps	 %xmm13, %xmm7
4085	SUBPS	 %xmm7,  %xmm1
4086
4087	mulps	 %xmm13, %xmm9
4088	SUBPS	 %xmm9,  %xmm2
4089	mulps	 %xmm13, %xmm11
4090	SUBPS	 %xmm11, %xmm3
4091
4092	movaps	 %xmm0, -32 * SIZE(Y1)
4093	movaps	 %xmm1, -28 * SIZE(Y1)
4094	movaps	 %xmm2, -24 * SIZE(Y1)
4095	movaps	 %xmm3, -20 * SIZE(Y1)
4096
4097	movaps	 -16 * SIZE(Y1), %xmm0
4098	movaps	 -12 * SIZE(Y1), %xmm1
4099	movaps	  -8 * SIZE(Y1), %xmm2
4100	movaps	  -4 * SIZE(Y1), %xmm3
4101
4102	subq	 $-16 * SIZE, A1
4103	subq	 $-16 * SIZE, Y1
4104	ALIGN_3
4105
4106.L315:
4107	testq	$4, MM
4108	je	.L317
4109
4110	movaps	 -29 * SIZE(A1), %xmm6
4111	movaps	 -25 * SIZE(A1), %xmm8
4112
4113	movss	 %xmm6, %xmm4
4114	shufps	 $0x39, %xmm4, %xmm4
4115	pshufd	 $0xb1, %xmm4, %xmm5
4116	mulps	 %xmm12, %xmm4
4117	addps	 %xmm4,  %xmm0
4118
4119	movss	 %xmm8, %xmm6
4120	shufps	 $0x39, %xmm6, %xmm6
4121	pshufd	 $0xb1, %xmm6, %xmm7
4122	mulps	 %xmm12, %xmm6
4123	addps	 %xmm6,  %xmm1
4124
4125	mulps	 %xmm13, %xmm5
4126	SUBPS	 %xmm5,  %xmm0
4127	mulps	 %xmm13, %xmm7
4128	SUBPS	 %xmm7,  %xmm1
4129
4130	movaps	 %xmm0, -32 * SIZE(Y1)
4131	movaps	 %xmm1, -28 * SIZE(Y1)
4132
4133	movaps	 %xmm2, %xmm0
4134	movaps	 %xmm3, %xmm1
4135	movaps	 %xmm8, %xmm4
4136
4137	addq	 $8 * SIZE, A1
4138	addq	 $8 * SIZE, Y1
4139	ALIGN_3
4140
4141.L317:
4142	testq	$2, MM
4143	je	.L318
4144
4145	movaps	 -29 * SIZE(A1), %xmm6
4146
4147	movss	 %xmm6, %xmm4
4148	shufps	 $0x39, %xmm4, %xmm4
4149
4150	pshufd	 $0xb1, %xmm4, %xmm5
4151	mulps	 %xmm12, %xmm4
4152	addps	 %xmm4,  %xmm0
4153	mulps	 %xmm13, %xmm5
4154	SUBPS	 %xmm5,  %xmm0
4155
4156	movaps	 %xmm0, -32 * SIZE(Y1)
4157	movaps	 %xmm1, %xmm0
4158
4159	addq	 $4 * SIZE, A1
4160	addq	 $4 * SIZE, Y1
4161	ALIGN_3
4162
4163.L318:
4164	testq	$1, MM
4165	je	.L990
4166
4167	movsd	 -32 * SIZE(A1), %xmm4
4168
4169	pshufd	 $0xb1, %xmm4, %xmm5
4170
4171	mulps	 %xmm12, %xmm4
4172	addps	 %xmm4,  %xmm0
4173	mulps	 %xmm13, %xmm5
4174	SUBPS	 %xmm5,  %xmm0
4175
4176	movlps	 %xmm0, -32 * SIZE(Y1)
4177#endif
4178	ALIGN_3
4179
4180.L990:
4181	movq	Y,  Y1
4182
4183#ifdef ALIGNED_ACCESS
4184	cmpq	M, MM
4185	je	.L991
4186
4187	movsd	(Y), %xmm0
4188	addq	INCY, Y
4189
4190	movsd	(BUFFER), %xmm1
4191	addq	 $2 * SIZE, BUFFER
4192
4193	addps	 %xmm1, %xmm0
4194
4195	movlps	%xmm0, (Y1)
4196	addq	INCY, Y1
4197	ALIGN_3
4198
4199.L991:
4200#endif
4201	movq	MM, %rax
4202	sarq	$3, %rax
4203	jle	.L994
4204	ALIGN_3
4205
4206.L992:
4207	movsd	(Y), %xmm0
4208	addq	INCY, Y
4209	movhps	(Y), %xmm0
4210	addq	INCY, Y
4211
4212	movsd	(Y), %xmm1
4213	addq	INCY, Y
4214	movhps	(Y), %xmm1
4215	addq	INCY, Y
4216
4217	movsd	(Y), %xmm2
4218	addq	INCY, Y
4219	movhps	(Y), %xmm2
4220	addq	INCY, Y
4221
4222	movsd	(Y), %xmm3
4223	addq	INCY, Y
4224	movhps	(Y), %xmm3
4225	addq	INCY, Y
4226
4227	addps	 0 * SIZE(BUFFER), %xmm0
4228	addps	 4 * SIZE(BUFFER), %xmm1
4229	addps	 8 * SIZE(BUFFER), %xmm2
4230	addps	12 * SIZE(BUFFER), %xmm3
4231
4232	movlps	%xmm0, (Y1)
4233	addq	INCY, Y1
4234	movhps	%xmm0, (Y1)
4235	addq	INCY, Y1
4236
4237	movlps	%xmm1, (Y1)
4238	addq	INCY, Y1
4239	movhps	%xmm1, (Y1)
4240	addq	INCY, Y1
4241
4242	movlps	%xmm2, (Y1)
4243	addq	INCY, Y1
4244	movhps	%xmm2, (Y1)
4245	addq	INCY, Y1
4246
4247	movlps	%xmm3, (Y1)
4248	addq	INCY, Y1
4249	movhps	%xmm3, (Y1)
4250	addq	INCY, Y1
4251
4252	addq	$16 * SIZE, BUFFER
4253	decq	%rax
4254	jg	.L992
4255	ALIGN_3
4256
4257.L994:
4258	testq	$7, MM
4259	jle	.L999
4260
4261	testq	$4, MM
4262	jle	.L995
4263
4264	movsd	(Y), %xmm0
4265	addq	INCY, Y
4266	movhps	(Y), %xmm0
4267	addq	INCY, Y
4268
4269	movsd	(Y), %xmm1
4270	addq	INCY, Y
4271	movhps	(Y), %xmm1
4272	addq	INCY, Y
4273
4274	addps	 0 * SIZE(BUFFER), %xmm0
4275	addps	 4 * SIZE(BUFFER), %xmm1
4276
4277	movlps	%xmm0, (Y1)
4278	addq	INCY, Y1
4279	movhps	%xmm0, (Y1)
4280	addq	INCY, Y1
4281
4282	movlps	%xmm1, (Y1)
4283	addq	INCY, Y1
4284	movhps	%xmm1, (Y1)
4285	addq	INCY, Y1
4286
4287	addq	$8 * SIZE, BUFFER
4288	ALIGN_3
4289
4290.L995:
4291	testq	$2, MM
4292	jle	.L996
4293
4294	movsd	(Y), %xmm0
4295	addq	INCY, Y
4296	movhps	(Y), %xmm0
4297	addq	INCY, Y
4298
4299	addps	 0 * SIZE(BUFFER), %xmm0
4300
4301	movlps	%xmm0, (Y1)
4302	addq	INCY, Y1
4303	movhps	%xmm0, (Y1)
4304	addq	INCY, Y1
4305
4306	addq	$4 * SIZE, BUFFER
4307	ALIGN_3
4308
4309.L996:
4310	testq	$1, MM
4311	jle	.L999
4312
4313	movsd	(Y), %xmm0
4314
4315	addps	 0 * SIZE(BUFFER), %xmm0
4316
4317	movlps	%xmm0, (Y1)
4318	ALIGN_3
4319
4320.L999:
4321	movq	M, I
4322	salq	$ZBASE_SHIFT,I
4323	addq	I,AA
4324	jmp	.L0t
4325.L999x:
4326	movq	  0(%rsp), %rbx
4327	movq	  8(%rsp), %rbp
4328	movq	 16(%rsp), %r12
4329	movq	 24(%rsp), %r13
4330	movq	 32(%rsp), %r14
4331	movq	 40(%rsp), %r15
4332
4333#ifdef WINDOWS_ABI
4334	movq	 48(%rsp), %rdi
4335	movq	 56(%rsp), %rsi
4336	movups	 64(%rsp), %xmm6
4337	movups	 80(%rsp), %xmm7
4338	movups	 96(%rsp), %xmm8
4339	movups	112(%rsp), %xmm9
4340	movups	128(%rsp), %xmm10
4341	movups	144(%rsp), %xmm11
4342	movups	160(%rsp), %xmm12
4343	movups	176(%rsp), %xmm13
4344	movups	192(%rsp), %xmm14
4345	movups	208(%rsp), %xmm15
4346#endif
4347
4348	addq	$STACKSIZE, %rsp
4349	ret
4350
4351	EPILOGUE
4352