Fixed #7. Modified axpy kernel codes to avoid unloop with incx==0 or incy==0 in x86...
authorXianyi <traits.zhang@gmail.com>
Wed, 23 Feb 2011 12:08:34 +0000 (20:08 +0800)
committerXianyi <traits.zhang@gmail.com>
Wed, 23 Feb 2011 12:08:34 +0000 (20:08 +0800)
kernel/x86/axpy_sse.S
kernel/x86/axpy_sse2.S
kernel/x86/zaxpy_sse.S
kernel/x86/zaxpy_sse2.S

index 291a219..e06d901 100644 (file)
 .L50:
        movl    M, %eax
        movl    Y, YY
+//If incx==0 || incy==0, avoid unloop.
+       cmpl    $0, INCX
+       je  .L56
+       cmpl    $0, INCY
+       je  .L56
+
        sarl    $3,   %eax
        jle     .L55
        ALIGN_3
index 5e31d3d..9b2d5d8 100644 (file)
 .L40:
        movl    Y, YY
        movl    M,  %eax
+//If incx==0 || incy==0, avoid unloop.
+       cmpl    $0, INCX
+       je  .L46
+       cmpl    $0, INCY
+       je  .L46
+
        sarl    $3, %eax
        jle     .L45
        ALIGN_3
index edd9929..9c94cec 100644 (file)
        unpcklps ALPHA_I, ALPHA_R
        unpcklps %xmm5, ALPHA_I
 #endif
+//If incx==0 || incy==0, avoid unloop and jump to end.
+       cmpl    $0, INCX
+       je  .L200
+       cmpl    $0, INCY
+       je      .L200
 
        movl    Y, YY
 
        addps   %xmm1, %xmm4
 
        movsd   %xmm4,   (Y)
+       jmp     .L999
+       ALIGN_3
+
+.L200:
+       movl    M, %eax
+       cmpl    $0, %eax
+       jle .L999
        ALIGN_3
 
+.L201:
+       movsd    (X), %xmm0
+
+#ifdef HAVE_SSE3
+       movshdup  %xmm0, %xmm1
+       movsldup  %xmm0, %xmm0
+#else
+       movaps    %xmm0, %xmm1
+       shufps    $0xa0, %xmm0, %xmm0
+       shufps    $0xf5, %xmm1, %xmm1
+#endif
+
+       mulps   ALPHA_R, %xmm0
+       mulps   ALPHA_I, %xmm1
+
+       movsd    (Y), %xmm4
+
+       addps   %xmm0, %xmm4
+       addps   %xmm1, %xmm4
+
+       movsd   %xmm4,   (Y)
+       
+       decl    %eax
+       jg  .L201
+
+       ALIGN_3
 .L999:
        popl    %ebp
        popl    %ebx
index 40afdc3..9c2caa7 100644 (file)
 
        movl    Y, YY
        movl    M,  %eax
+//If incx==0 || incy==0, avoid unloop and jump to end.
+       cmpl    $0, INCX
+       je  .L58
+       cmpl    $0, INCY
+       je      .L58
+
        sarl    $2, %eax
        jle     .L55
 
        andl    $1, %eax
        jle     .L999
 
+.L58:
        MOVDDUP( 0 * SIZE, X, %xmm0)
        MOVDDUP( 1 * SIZE, X, %xmm1)
 
 
        movlpd  %xmm4,   0 * SIZE(YY)
        movhpd  %xmm4,   1 * SIZE(YY)
+
+                       
+       decl %eax
+       jg      .L58
        ALIGN_3
 
 .L999: