Merge pull request #4727 from martin-frbg/issue4726

Fix another corner case of infinity handling in x86_64 ZSCAL
This commit is contained in:
Martin Kroeker 2024-05-31 19:44:33 +02:00 committed by GitHub
commit 6b564d53fd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 54 additions and 9 deletions

View File

@ -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

View File

@ -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 )

View File

@ -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

View File

@ -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 ;

View File

@ -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