Skip to content

Commit d2855d3

Browse files
authored
Merge pull request #5285 from martin-frbg/zscal_zarch
kernel/zarch: Fix cscal and zscal
2 parents 1408be5 + fb8dc8f commit d2855d3

File tree

2 files changed

+111
-22
lines changed

2 files changed

+111
-22
lines changed

kernel/zarch/cscal.c

Lines changed: 59 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
210210
BLASLONG n1 = n & -2;
211211

212212
if (da_i == 0.0) {
213-
213+
if (dummy2 == 0) {
214214
while (j < n1) {
215215

216216
x[i] = 0.0;
@@ -230,11 +230,43 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
230230
j++;
231231

232232
}
233+
} else {
234+
while (j < n1) {
235+
if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) {
236+
x[i] = NAN;
237+
x[i+1] = NAN;
238+
}else{
239+
x[i] = 0.0;
240+
x[i + 1] = 0.0;
241+
}
242+
if (isnan(x[i+inc_x]) || isinf(x[i+inc_x]) || isnan(x[i+1+inc_x])) {
243+
x[i + inc_x] = NAN;
244+
x[i + 1 + inc_x] = NAN;
245+
} else {
246+
x[i + inc_x] = 0.0;
247+
x[i + 1 + inc_x] = 0.0;
248+
}
249+
i += 2 * inc_x;
250+
j += 2;
251+
252+
}
233253

254+
while (j < n) {
255+
if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) {
256+
x[i] = NAN;
257+
x[i+1] = NAN;
258+
}else{
259+
x[i] = 0.0;
260+
x[i + 1] = 0.0;
261+
}
262+
i += inc_x;
263+
j++;
264+
}
265+
}
234266
} else {
235267

236268
while (j < n1) {
237-
if (isnan(x[i]) || isinf(x[i]))
269+
if (isnan(x[i]) || isinf(x[i]))
238270
temp0 = NAN;
239271
else
240272
temp0 = -da_i * x[i + 1];
@@ -276,7 +308,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
276308

277309
} else {
278310

279-
if (da_i == 0.0) {
311+
if (da_i == 0.0 && dummy2) {
280312
BLASLONG n1 = n & -2;
281313

282314
while (j < n1) {
@@ -335,12 +367,16 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
335367
alpha[1] = da_i;
336368

337369
if (da_r == 0.0)
338-
if (da_i == 0)
370+
if (da_i == 0 && dummy2 == 0)
339371
cscal_kernel_16_zero(n1, x);
340-
else
372+
else {
373+
/* if (dummy2 == 0)
341374
cscal_kernel_16_zero_r(n1, alpha, x);
342-
else if (da_i == 0)
343-
cscal_kernel_16_zero_i(n1, alpha, x);
375+
else*/
376+
cscal_kernel_16(n1, da_r, da_i, x);
377+
}
378+
/* else if (da_i == 0 && !isnan(da_r))
379+
cscal_kernel_16/*_zero_i(n1, alpha, x);*/
344380
else
345381
cscal_kernel_16(n1, da_r, da_i, x);
346382

@@ -354,7 +390,8 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
354390
float res = 0.0;
355391
if (isnan(da_r)) res = da_r;
356392
while (j < n) {
357-
393+
if (dummy2)
394+
if (isnan(x[i])|| isnan(x[i+1])) res=NAN;
358395
x[i] = res;
359396
x[i + 1] = res;
360397
i += 2;
@@ -382,7 +419,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
382419
x[i + 1] = da_i * x[i];
383420
else
384421
x[i + 1] = NAN;
385-
if (x[i] == x[i])
422+
if (!isnan(x[i]))
386423
x[i] = temp0;
387424
i += 2;
388425
j++;
@@ -398,7 +435,18 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
398435
while (j < n) {
399436

400437
temp0 = da_r * x[i];
401-
x[i + 1] = da_r * x[i + 1];
438+
if (dummy2) {
439+
if (isnan(x[i])||isinf(x[i]))temp0 = NAN;
440+
if (isnan(x[i+1])||isinf(x[i+1]))
441+
x[i+1] = NAN;
442+
else
443+
x[i+1] = da_r * x[i + 1];
444+
} else {
445+
if (isnan(x[i]))
446+
x[i + 1] = NAN;
447+
else
448+
x[i + 1] = da_r * x[i + 1];
449+
}
402450
x[i] = temp0;
403451
i += 2;
404452
j++;
@@ -411,7 +459,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
411459

412460
temp0 = da_r * x[i] - da_i * x[i + 1];
413461
x[i + 1] = da_r * x[i + 1] + da_i * x[i];
414-
x[i] = temp0;
462+
if (!isnan(x[i])) x[i] = temp0;
415463
i += 2;
416464
j++;
417465

kernel/zarch/zscal.c

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
208208
BLASLONG n1 = n & -2;
209209

210210
if (da_i == 0.0) {
211-
211+
if (dummy2 == 0) {
212212
while (j < n1) {
213213

214214
x[i] = 0.0;
@@ -228,7 +228,38 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
228228
j++;
229229

230230
}
231-
231+
} else {
232+
while (j < n1) {
233+
if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) {
234+
x[i] = NAN;
235+
x[i+1] = NAN;
236+
} else {
237+
x[i] = 0.0;
238+
x[i+1] = 0.0;
239+
}
240+
if (isnan(x[i+inc_x]) || isinf(x[i+inc_x]) || isnan(x[i+inc_x+1])) {
241+
x[i + inc_x] = NAN;
242+
x[i + inc_x + 1] = NAN;
243+
} else {
244+
x[i + inc_x] = 0.;
245+
x[i + inc_x + 1] = 0.;
246+
}
247+
i += 2 * inc_x;
248+
j += 2;
249+
}
250+
251+
while (j < n) {
252+
if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) {
253+
x[i] = NAN;
254+
x[i+1] = NAN;
255+
} else {
256+
x[i] = 0.;
257+
x[i+1] = 0.;
258+
}
259+
i += inc_x;
260+
j++;
261+
}
262+
}
232263
} else {
233264

234265
while (j < n1) {
@@ -276,7 +307,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
276307

277308
} else {
278309

279-
if (da_i == 0.0) {
310+
if (da_i == 0.0 && dummy2) {
280311
BLASLONG n1 = n & -2;
281312

282313
while (j < n1) {
@@ -335,12 +366,10 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
335366
alpha[1] = da_i;
336367

337368
if (da_r == 0.0)
338-
if (da_i == 0)
369+
if (da_i == 0 && dummy2 == 0)
339370
zscal_kernel_8_zero(n1, x);
340371
else
341372
zscal_kernel_8(n1, da_r, da_i, x);
342-
else if (da_i == 0 && da_r == da_r)
343-
zscal_kernel_8_zero_i(n1, alpha, x);
344373
else
345374
zscal_kernel_8(n1, da_r, da_i, x);
346375

@@ -354,7 +383,8 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
354383
double res= 0.0;
355384
if (isnan(da_r)) res = da_r;
356385
while (j < n) {
357-
386+
if (dummy2)
387+
if (isnan(x[i]) || isnan(x[i+1])) res = NAN;
358388
x[i] = res;
359389
x[i + 1] = res;
360390
i += 2;
@@ -381,7 +411,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
381411
x[i + 1] = da_i * x[i];
382412
else
383413
x[i + 1] = NAN;
384-
if (x[i]==x[i])
414+
if (!isnan(x[i]))
385415
x[i] = temp0;
386416
i += 2;
387417
j++;
@@ -397,8 +427,19 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
397427
while (j < n) {
398428

399429
temp0 = da_r * x[i];
400-
x[i + 1] = da_r * x[i + 1];
401-
x[i] = temp0;
430+
if (dummy2) {
431+
if (isnan(x[i]) || isinf(x[i])) temp0 = NAN;
432+
if (isnan(x[i + 1]) || isinf(x[i + 1]))
433+
x[i + 1] = NAN;
434+
else
435+
x[i + 1] = da_r * x[i + 1];
436+
} else {
437+
if (isnan(x[i]))
438+
x[i + 1] = NAN;
439+
else
440+
x[i + 1] = da_r * x[i + 1];
441+
}
442+
x[i] = temp0;
402443
i += 2;
403444
j++;
404445

@@ -410,7 +451,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
410451

411452
temp0 = da_r * x[i] - da_i * x[i + 1];
412453
x[i + 1] = da_r * x[i + 1] + da_i * x[i];
413-
x[i] = temp0;
454+
if (!isnan(x[i])) x[i] = temp0;
414455
i += 2;
415456
j++;
416457

0 commit comments

Comments
 (0)