diff --git a/cblas/blas.go b/cblas/blas.go index 2e3e1b63..04e1e0c6 100644 --- a/cblas/blas.go +++ b/cblas/blas.go @@ -10,7 +10,7 @@ package cblas /* #cgo CFLAGS: -g -O2 #cgo linux LDFLAGS: -L/usr/lib/ -lcblas -#cgo darwin LDFLAGS: -DYA_BLAS -DYA_LAPACK -DYA_BLASMULT -framework Accelerate +#cgo darwin LDFLAGS: -DYA_BLAS -DYA_LAPACK -DYA_BLASMULT -framework vecLib #include "cblas.h" */ import "C" @@ -273,6 +273,9 @@ func (Blas) Snrm2(n int, x []float32, incX int) float32 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -285,6 +288,9 @@ func (Blas) Sasum(n int, x []float32, incX int) float32 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -297,6 +303,9 @@ func (Blas) Dnrm2(n int, x []float64, incX int) float64 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -309,6 +318,9 @@ func (Blas) Dasum(n int, x []float64, incX int) float64 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -321,6 +333,9 @@ func (Blas) Scnrm2(n int, x []complex64, incX int) float32 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -333,6 +348,9 @@ func (Blas) Scasum(n int, x []complex64, incX int) float32 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -345,6 +363,9 @@ func (Blas) Dznrm2(n int, x []complex128, incX int) float64 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -357,6 +378,9 @@ func (Blas) Dzasum(n int, x []complex128, incX int) float64 { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return 0 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -369,6 +393,9 @@ func (Blas) Isamax(n int, x []float32, incX int) int { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return -1 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -381,6 +408,9 @@ func (Blas) Idamax(n int, x []float64, incX int) int { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return -1 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -393,6 +423,9 @@ func (Blas) Icamax(n int, x []complex64, incX int) int { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return -1 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -405,6 +438,9 @@ func (Blas) Izamax(n int, x []complex128, incX int) int { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return -1 + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -669,6 +705,9 @@ func (Blas) Sscal(n int, alpha float32, x []float32, incX int) { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -681,6 +720,9 @@ func (Blas) Dscal(n int, alpha float64, x []float64, incX int) { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -693,6 +735,9 @@ func (Blas) Cscal(n int, alpha complex64, x []complex64, incX int) { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -705,6 +750,9 @@ func (Blas) Zscal(n int, alpha complex128, x []complex128, incX int) { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } @@ -717,6 +765,9 @@ func (Blas) Csscal(n int, alpha float32, x []complex64, incX int) { if incX == 0 { panic("cblas: zero x index increment") } + if incX < 0 { + return + } if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic("cblas: x index out of range") } diff --git a/cblas/genBlas.pl b/cblas/genBlas.pl index 01a3a1e1..da83af6b 100755 --- a/cblas/genBlas.pl +++ b/cblas/genBlas.pl @@ -475,6 +475,15 @@ sub processParamToChecks { } elsif ($scalarArgs{'m'}) { push @processed, "if (incX > 0 && (m-1)*incX >= len(x)) || (incX < 0 && (1-m)*incX >= len(x)) { panic(\"cblas: x index out of range\") }" if $scalarArgs{'incX'}; push @processed, "if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) { panic(\"cblas: y index out of range\") }" if $scalarArgs{'incY'}; + } elsif ($func =~ m/cblas_[sdcz]s?scal/) { + push @processed, "if incX < 0 { return }"; + push @processed, "if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic(\"cblas: x index out of range\") }"; + } elsif ($func =~ m/cblas_i[sdcz]amax/) { + push @processed, "if incX < 0 { return -1 }"; + push @processed, "if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic(\"cblas: x index out of range\") }"; + } elsif ($func =~ m/cblas_(?:[ds][zc]?asum|[sdz][cz]?nrm2)/) { + push @processed, "if incX < 0 { return 0 }"; + push @processed, "if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic(\"cblas: x index out of range\") }"; } else { push @processed, "if (incX > 0 && (n-1)*incX >= len(x)) || (incX < 0 && (1-n)*incX >= len(x)) { panic(\"cblas: x index out of range\") }" if $scalarArgs{'incX'}; push @processed, "if (incY > 0 && (n-1)*incY >= len(y)) || (incY < 0 && (1-n)*incY >= len(y)) { panic(\"cblas: y index out of range\") }" if $scalarArgs{'incY'};