@@ -229,10 +229,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
229229
230230 if ( da_i == 0.0 )
231231 {
232-
232+ if (! dummy2 ) {
233233 while (j < n1 )
234234 {
235-
236235 x [i ]= 0.0 ;
237236 x [i + 1 ]= 0.0 ;
238237 x [i + inc_x ]= 0.0 ;
@@ -244,21 +243,48 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
244243
245244 while (j < n )
246245 {
247-
248246 x [i ]= 0.0 ;
249247 x [i + 1 ]= 0.0 ;
250248 i += inc_x ;
251249 j ++ ;
252-
253250 }
251+ } else {
252+ float temp ;
253+ while (j < n1 )
254+ {
255+ if (isnan (x [i ])|| isnan (x [i + 1 ]))
256+ temp = NAN ;
257+ else
258+ temp = 0.0 ;
259+ x [i ]= temp ;
260+ x [i + 1 ]= temp ;
261+ if (isnan (x [i + inc_x ])|| isnan (x [i + inc_x + 1 ]))
262+ temp = NAN ;
263+ else
264+ temp = 0.0 ;
265+ x [i + inc_x ]= temp ;
266+ x [i + inc_x + 1 ]= temp ;
267+ i += 2 * inc_x ;
268+ j += 2 ;
254269
270+ }
271+ while (j < n )
272+ {
273+ if (isnan (x [i ])|| isnan (x [i + 1 ]))
274+ temp = NAN ;
275+ else
276+ temp = 0.0 ;
277+ x [i ]= temp ;
278+ x [i + 1 ]= temp ;
279+ i += inc_x ;
280+ j ++ ;
281+ }
282+ }
255283 }
256284 else
257285 {
258-
259286 while (j < n1 )
260287 {
261-
262288 if (isnan (x [i ]) || isinf (x [i ]))
263289 temp0 = NAN ;
264290 else
@@ -278,7 +304,6 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
278304 x [i + inc_x ] = temp1 ;
279305 i += 2 * inc_x ;
280306 j += 2 ;
281-
282307 }
283308
284309 while (j < n )
@@ -305,14 +330,12 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
305330 else
306331 {
307332
308-
309- if ( da_i == 0.0 )
333+ if ( da_i == 0.0 && dummy2 )
310334 {
311335 BLASLONG n1 = n & -2 ;
312336
313337 while (j < n1 )
314338 {
315-
316339 temp0 = da_r * x [i ];
317340 x [i + 1 ] = da_r * x [i + 1 ];
318341 x [i ] = temp0 ;
@@ -367,22 +390,19 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
367390 return (0 );
368391 }
369392
370-
371393 BLASLONG n1 = n & -16 ;
372394 if ( n1 > 0 )
373395 {
374396
375397 alpha [0 ] = da_r ;
376398 alpha [1 ] = da_i ;
377-
378399 if ( da_r == 0.0 )
379- if ( da_i == 0 )
400+ if ( da_i == 0 && ! dummy2 )
380401 cscal_kernel_16_zero (n1 , alpha , x );
381402 else
382- cscal_kernel_16_zero_r (n1 , alpha , x );
403+ cscal_kernel_16 /*_zero_r*/ (n1 , alpha , x );
383404 else
384405 cscal_kernel_16 (n1 , alpha , x );
385-
386406 i = n1 << 1 ;
387407 j = n1 ;
388408 }
@@ -393,6 +413,8 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
393413 {
394414 FLOAT res = 0.0 ;
395415 if (isnan (da_r )) res = da_r ;
416+ if (dummy2 )
417+ if (isnan (x [i ])|| isnan (x [i + 1 ])) res = NAN ;
396418 while (j < n )
397419 {
398420 x [i ]= res ;
@@ -415,7 +437,6 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
415437
416438 } else
417439 {
418-
419440 while (j < n )
420441 {
421442 temp0 = - da_i * x [i + 1 ];
@@ -424,11 +445,10 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
424445 if (!isinf (x [i + 1 ]))
425446 x [i + 1 ] = da_i * x [i ];
426447 else x [i + 1 ] = NAN ;
427- if ( x [i ] == x [ i ] ) //preserve NaN
448+ if ( ! isnan ( x [i ]) ) //preserve NaN
428449 x [i ] = temp0 ;
429450 i += 2 ;
430451 j ++ ;
431-
432452 }
433453
434454 }
@@ -439,12 +459,22 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
439459
440460 if ( da_i == 0.0 )
441461 {
442-
443462 while (j < n )
444463 {
445-
464+
446465 temp0 = da_r * x [i ];
447- x [i + 1 ] = da_r * x [i + 1 ];
466+ if (dummy2 ) {
467+ if (isnan (x [i ])|| isinf (x [i ])) temp0 = NAN ;
468+ if (isnan (x [i + 1 ])|| isinf (x [i + 1 ]))
469+ x [i + 1 ]= NAN ;
470+ else
471+ x [i + 1 ] = da_r * x [i + 1 ];
472+ } else {
473+ if (isnan (x [i ]))
474+ x [i + 1 ] = NAN ;
475+ else
476+ x [i + 1 ] = da_r * x [i + 1 ];
477+ }
448478 x [i ] = temp0 ;
449479 i += 2 ;
450480 j ++ ;
@@ -476,7 +506,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i,
476506
477507 temp0 = da_r * x [i ] - da_i * x [i + 1 ];
478508 x [i + 1 ] = da_r * x [i + 1 ] + da_i * x [i ];
479- x [i ] = temp0 ;
509+ if (! isnan ( x [ i ])) x [i ] = temp0 ;
480510 i += 2 ;
481511 j ++ ;
482512
0 commit comments