From a32e56500ac4cfad0e60a6a4f7671bfee54195e6 Mon Sep 17 00:00:00 2001 From: traz Date: Fri, 4 Nov 2011 19:32:21 +0000 Subject: [PATCH] Fix the compute error of gemv when incx and incy are negative numbers. --- kernel/mips64/gemv_n_loongson3a.c | 23 +++++++++++++---------- kernel/mips64/gemv_t_loongson3a.c | 8 ++++---- kernel/mips64/zgemv_n_loongson3a.c | 8 ++++---- kernel/mips64/zgemv_t_loongson3a.c | 8 ++++---- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/kernel/mips64/gemv_n_loongson3a.c b/kernel/mips64/gemv_n_loongson3a.c index bb27379f5..7db595449 100644 --- a/kernel/mips64/gemv_n_loongson3a.c +++ b/kernel/mips64/gemv_n_loongson3a.c @@ -16,13 +16,16 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLONG LDA, FLOAT *X, BLASLONG INCX, FLOAT *Y, BLASLONG INCY, FLOAT *BUFFER) { + BLASLONG kx=0, ky=0; if(!ALPHA) return 0; - if(INCX < 0) - INCX = -INCX; - if(INCY < 0) - INCY = -INCY; + //if(INCX < 0) + // kx = (1-N) * INCX; + // INCX = -INCX; + //if(INCY < 0) + // ky = (1-M) * INCY; + // INCY = -INCY; BLASLONG fahead = 30; BLASLONG spec_unroll = 4; @@ -31,7 +34,7 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO if(ALPHA == 1) { if(INCY == 1) { - for(; likely(j < N); j++, k += INCX) { + for(k=kx; likely(j < N); j++, k += INCX) { BLASLONG i = 0; for(; likely(i < tMQ);) { prefetch(A[LDA * j + i + fahead]); @@ -46,8 +49,8 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO } } } else { - for(; likely(j < N); j++, k += INCX) { - BLASLONG i = 0, h = 0; + for(k=kx; likely(j < N); j++, k += INCX) { + BLASLONG i = 0, h = ky; for(; likely(i < tMQ);) { prefetch(A[LDA * j + i + fahead]); prefetch(Y[h + fahead]); @@ -63,7 +66,7 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO } } else { if(INCY == 1) { - for(; likely(j < N); j++, k += INCX) { + for(k=kx; likely(j < N); j++, k += INCX) { BLASLONG i = 0; for(; likely(i < tMQ);) { prefetch(A[LDA * j + i + fahead]); @@ -78,8 +81,8 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO } } } else { - for(; likely(j < N); j++, k += INCX) { - BLASLONG i = 0, h = 0; + for(k=kx; likely(j < N); j++, k += INCX) { + BLASLONG i = 0, h = ky; for(; likely(i < tMQ);) { prefetch(A[LDA * j + i + fahead]); prefetch(Y[h + fahead]); diff --git a/kernel/mips64/gemv_t_loongson3a.c b/kernel/mips64/gemv_t_loongson3a.c index 5c6c8389e..51f035d8e 100644 --- a/kernel/mips64/gemv_t_loongson3a.c +++ b/kernel/mips64/gemv_t_loongson3a.c @@ -18,10 +18,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT ALPHA, FLOAT *A, BLASLO if(!ALPHA) return 0; - if(INCX < 0) - INCX = -INCX; - if(INCY < 0) - INCY = -INCY; +// if(INCX < 0) +// INCX = -INCX; +// if(INCY < 0) +// INCY = -INCY; BLASLONG fahead = 30; BLASLONG spec_unroll = 3; diff --git a/kernel/mips64/zgemv_n_loongson3a.c b/kernel/mips64/zgemv_n_loongson3a.c index f8275c371..7b094de80 100644 --- a/kernel/mips64/zgemv_n_loongson3a.c +++ b/kernel/mips64/zgemv_n_loongson3a.c @@ -19,10 +19,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, F if(!rALPHA && iALPHA) return 0; - if(INCX < 0) - INCX = -INCX; - if(INCY < 0) - INCY = -INCY; +// if(INCX < 0) +// INCX = -INCX; +// if(INCY < 0) +// INCY = -INCY; BLASLONG fahead = 60; BLASLONG spec_unroll = 2; diff --git a/kernel/mips64/zgemv_t_loongson3a.c b/kernel/mips64/zgemv_t_loongson3a.c index 4b2c2b6b5..3835879ad 100644 --- a/kernel/mips64/zgemv_t_loongson3a.c +++ b/kernel/mips64/zgemv_t_loongson3a.c @@ -18,10 +18,10 @@ int CNAME(BLASLONG M, BLASLONG N, BLASLONG UNUSED, FLOAT rALPHA, FLOAT iALPHA, F if(!rALPHA && iALPHA) return 0; - if(INCX < 0) - INCX = -INCX; - if(INCY < 0) - INCY = -INCY; +// if(INCX < 0) +// INCX = -INCX; +// if(INCY < 0) +// INCY = -INCY; BLASLONG fahead = 30; BLASLONG spec_unroll = 2;