Fix another corner case of infinity handling in x86_64 ZSCALtags/v0.3.28^2
| @@ -61,7 +61,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r,FLOAT da_i, F | |||||
| { | { | ||||
| temp = - da_i * x[ip+1] ; | temp = - da_i * x[ip+1] ; | ||||
| if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | ||||
| x[ip+1] = da_i * x[ip] ; | |||||
| if (!isinf(x[ip+1])) | |||||
| x[ip+1] = da_i * x[ip] ; | |||||
| else x[ip+1] = NAN; | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -48,7 +48,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r,FLOAT da_i, F | |||||
| { | { | ||||
| temp = - da_i * x[ip+1] ; | temp = - da_i * x[ip+1] ; | ||||
| if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | ||||
| x[ip+1] = da_i * x[ip] ; | |||||
| if (!isinf(x[ip+1])) | |||||
| x[ip+1] = da_i * x[ip] ; | |||||
| else x[ip+1] = NAN; | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -56,12 +58,16 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r,FLOAT da_i, F | |||||
| if ( da_i == 0.0 ) | if ( da_i == 0.0 ) | ||||
| { | { | ||||
| temp = da_r * x[ip] ; | temp = da_r * x[ip] ; | ||||
| x[ip+1] = da_r * x[ip+1]; | |||||
| if (!isinf(x[ip+1])) | |||||
| x[ip+1] = da_r * x[ip+1]; | |||||
| else x[ip+1] = NAN; | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| temp = da_r * x[ip] - da_i * x[ip+1] ; | temp = da_r * x[ip] - da_i * x[ip+1] ; | ||||
| x[ip+1] = da_r * x[ip+1] + da_i * x[ip] ; | |||||
| if (!isinf(x[ip+1])) | |||||
| x[ip+1] = da_r * x[ip+1] + da_i * x[ip] ; | |||||
| else x[ip+1] = NAN; | |||||
| } | } | ||||
| } | } | ||||
| if ( da_r != da_r ) | if ( da_r != da_r ) | ||||
| @@ -61,7 +61,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r,FLOAT da_i, F | |||||
| { | { | ||||
| temp = - da_i * x[ip+1] ; | temp = - da_i * x[ip+1] ; | ||||
| if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | if (isnan(x[ip]) || isinf(x[ip])) temp = NAN; | ||||
| x[ip+1] = da_i * x[ip] ; | |||||
| if (!isinf(x[ip+1])) | |||||
| x[ip+1] = da_i * x[ip] ; | |||||
| else x[ip+1] = NAN; | |||||
| } | } | ||||
| } | } | ||||
| else | else | ||||
| @@ -258,13 +258,17 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, | |||||
| temp0 = NAN; | temp0 = NAN; | ||||
| else | else | ||||
| temp0 = -da_i * x[i+1]; | temp0 = -da_i * x[i+1]; | ||||
| x[i+1] = da_i * x[i]; | |||||
| if (!isinf(x[i+1])) | |||||
| x[i+1] = da_i * x[i]; | |||||
| else x[i+1] = NAN; | |||||
| x[i] = temp0; | x[i] = temp0; | ||||
| if (isnan(x[i+inc_x]) || isinf(x[i+inc_x])) | if (isnan(x[i+inc_x]) || isinf(x[i+inc_x])) | ||||
| temp1 = NAN; | temp1 = NAN; | ||||
| else | else | ||||
| temp1 = -da_i * x[i+1+inc_x]; | temp1 = -da_i * x[i+1+inc_x]; | ||||
| x[i+1+inc_x] = da_i * x[i+inc_x]; | |||||
| if (!isinf(x[i+1+inc_x])) | |||||
| x[i+1+inc_x] = da_i * x[i+inc_x]; | |||||
| else x[i+1+inc_x] = NAN; | |||||
| x[i+inc_x] = temp1; | x[i+inc_x] = temp1; | ||||
| i += 2*inc_x ; | i += 2*inc_x ; | ||||
| j+=2; | j+=2; | ||||
| @@ -278,7 +282,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, | |||||
| temp0 = NAN; | temp0 = NAN; | ||||
| else | else | ||||
| temp0 = -da_i * x[i+1]; | temp0 = -da_i * x[i+1]; | ||||
| x[i+1] = da_i * x[i]; | |||||
| if (!isinf(x[i+1])) | |||||
| x[i+1] = da_i * x[i]; | |||||
| else x[i+1] = NAN; | |||||
| x[i] = temp0; | x[i] = temp0; | ||||
| i += inc_x ; | i += inc_x ; | ||||
| j++; | j++; | ||||
| @@ -412,7 +418,9 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, | |||||
| temp0 = -da_i * x[i+1]; | temp0 = -da_i * x[i+1]; | ||||
| if (isinf(x[i])) | if (isinf(x[i])) | ||||
| temp0 = NAN; | temp0 = NAN; | ||||
| x[i+1] = da_i * x[i]; | |||||
| if (!isinf(x[i+1])) | |||||
| x[i+1] = da_i * x[i]; | |||||
| else x[i+1] = NAN; | |||||
| if ( x[i] == x[i]) //preserve NaN | if ( x[i] == x[i]) //preserve NaN | ||||
| x[i] = temp0; | x[i] = temp0; | ||||
| i += 2 ; | i += 2 ; | ||||
| @@ -117,4 +117,31 @@ CTEST(zscal, inf_i_inc_2) | |||||
| ASSERT_TRUE(isinf(i[17])); | ASSERT_TRUE(isinf(i[17])); | ||||
| } | } | ||||
| CTEST(zscal, i_0inf) | |||||
| { | |||||
| blasint N=9; | |||||
| blasint incX=1; | |||||
| double i[] = {0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1 }; | |||||
| double inf[] = {0,INFINITY, 0, INFINITY,0, INFINITY,0, INFINITY,0, INFINITY,0, INFINITY,0, INFINITY,0, INFINITY,0, INFINITY}; | |||||
| BLASFUNC(zscal)(&N, i, inf, &incX); | |||||
| ASSERT_TRUE(isinf(inf[0])); | |||||
| ASSERT_TRUE(isnan(inf[1])); | |||||
| ASSERT_TRUE(isinf(inf[16])); | |||||
| ASSERT_TRUE(isnan(inf[17])); | |||||
| } | |||||
| CTEST(zscal, i_0inf_inc_2) | |||||
| { | |||||
| blasint N=9; | |||||
| blasint incX=2; | |||||
| double i[] = {0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1, 0,1 }; | |||||
| double inf[] = {0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, | |||||
| 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY, 0,INFINITY}; | |||||
| BLASFUNC(zscal)(&N, i, inf, &incX); | |||||
| ASSERT_TRUE(isinf(inf[0])); | |||||
| ASSERT_TRUE(isnan(inf[1])); | |||||
| ASSERT_TRUE(isinf(inf[16])); | |||||
| ASSERT_TRUE(isnan(inf[17])); | |||||
| } | |||||
| #endif | #endif | ||||