Skip to content

Commit 899c3a6

Browse files
committed
Improve input argument checks of gemmt
* Fix return value for invalid info * Add missing checks for ldA, ldB * Use reference-LAPACK like checks (ie ld=0,nrows=0 is invalid)
1 parent df88536 commit 899c3a6

File tree

1 file changed

+52
-21
lines changed

1 file changed

+52
-21
lines changed

interface/gemmt.c

Lines changed: 52 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ void NAME(char *UPLO, char *TRANSA, char *TRANSB,
7777
blasint info;
7878

7979
char transA, transB, Uplo;
80+
blasint nrowa, nrowb;
8081
IFLOAT *buffer;
8182
IFLOAT *aa, *bb;
8283
FLOAT *cc;
@@ -155,22 +156,31 @@ void NAME(char *UPLO, char *TRANSA, char *TRANSB,
155156
if (Uplo == 'L')
156157
uplo = 1;
157158

159+
nrowa = m;
160+
if (transa) nrowa = k;
161+
nrowb = k;
162+
if (transb) nrowb = m;
163+
158164
info = 0;
159165

160-
if (uplo < 0)
161-
info = 14;
162-
if (ldc < m)
166+
if (ldc < MAX(1, m))
163167
info = 13;
168+
if (ldb < MAX(1, nrowa))
169+
info = 10;
170+
if (lda < MAX(1, nrowb))
171+
info = 8;
164172
if (k < 0)
165173
info = 5;
166174
if (m < 0)
167-
info = 3;
175+
info = 4;
168176
if (transb < 0)
169-
info = 2;
177+
info = 3;
170178
if (transa < 0)
179+
info = 2;
180+
if (uplo < 0)
171181
info = 1;
172182

173-
if (info) {
183+
if (info != 0) {
174184
BLASFUNC(xerbla) (ERROR_NAME, &info, sizeof(ERROR_NAME));
175185
return;
176186
}
@@ -205,11 +215,14 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo,
205215

206216
PRINT_DEBUG_CNAME;
207217

218+
uplo = -1;
208219
transa = -1;
209220
transb = -1;
210221
info = 0;
211222

212223
if (order == CblasColMajor) {
224+
if (Uplo == CblasUpper) uplo = 0;
225+
if (Uplo == CblasLower) uplo = 1;
213226

214227
if (TransA == CblasNoTrans)
215228
transa = 0;
@@ -249,15 +262,27 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo,
249262

250263
info = -1;
251264

252-
if (ldc < m)
265+
blasint nrowa, nrowb;
266+
nrowa = m;
267+
if (transa) nrowa = k;
268+
nrowb = k;
269+
if (transb) nrowb = m;
270+
271+
if (ldc < MAX(1, m))
253272
info = 13;
273+
if (ldb < MAX(1, nrowb))
274+
info = 10;
275+
if (lda < MAX(1, nrowa))
276+
info = 8;
254277
if (k < 0)
255278
info = 5;
256279
if (m < 0)
257-
info = 3;
280+
info = 4;
258281
if (transb < 0)
259-
info = 2;
282+
info = 3;
260283
if (transa < 0)
284+
info = 2;
285+
if (uplo < 0)
261286
info = 1;
262287
}
263288

@@ -269,6 +294,9 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo,
269294
lda = LDB;
270295
ldb = LDA;
271296

297+
if (Uplo == CblasUpper) uplo = 0;
298+
if (Uplo == CblasLower) uplo = 1;
299+
272300
if (TransB == CblasNoTrans)
273301
transa = 0;
274302
if (TransB == CblasTrans)
@@ -302,27 +330,30 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo,
302330

303331
info = -1;
304332

305-
if (ldc < m)
333+
blasint ncola, ncolb;
334+
ncola = k;
335+
if (transa) ncola = m;
336+
ncolb = m;
337+
if (transb) ncolb = k;
338+
339+
if (ldc < MAX(1,m))
306340
info = 13;
341+
if (ldb < MAX(1, ncolb))
342+
info = 10;
343+
if (lda < MAX(1, ncola))
344+
info = 8;
307345
if (k < 0)
308346
info = 5;
309347
if (m < 0)
310-
info = 3;
348+
info = 4;
311349
if (transb < 0)
312-
info = 2;
350+
info = 3;
313351
if (transa < 0)
352+
info = 2;
353+
if (uplo < 0)
314354
info = 1;
315-
316355
}
317356

318-
uplo = -1;
319-
if (Uplo == CblasUpper)
320-
uplo = 0;
321-
if (Uplo == CblasLower)
322-
uplo = 1;
323-
if (uplo < 0)
324-
info = 14;
325-
326357
if (info >= 0) {
327358
BLASFUNC(xerbla) (ERROR_NAME, &info, sizeof(ERROR_NAME));
328359
return;

0 commit comments

Comments
 (0)