Handle zero increment(s) in C910V ?AXPBY (#4483)

* Handle zero increment(s)
This commit is contained in:
Martin Kroeker 2024-02-04 22:07:51 +01:00 committed by GitHub
parent dbcf4f8b7d
commit 6d8a273cca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 135 additions and 0 deletions

View File

@ -69,6 +69,63 @@ int CNAME(BLASLONG n, FLOAT alpha, FLOAT *x, BLASLONG inc_x, FLOAT beta, FLOAT *
BLASLONG stride_x, stride_y, ix = 0, iy = 0; BLASLONG stride_x, stride_y, ix = 0, iy = 0;
if (inc_x == 0 || inc_y == 0) { /* use trivial non-vectorized loop if either increment is zero */
if ( beta == 0.0 )
{
if ( alpha == 0.0 )
{
while(i < n)
{
y[iy] = 0.0 ;
iy += inc_y ;
i++ ;
}
}
else
{
while(i < n)
{
y[iy] = alpha * x[ix] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
}
}
else
{
if ( alpha == 0.0 )
{
while(i < n)
{
y[iy] = beta * y[iy] ;
iy += inc_y ;
i++ ;
}
}
else
{
while(i < n)
{
y[iy] = alpha * x[ix] + beta * y[iy] ;
ix += inc_x ;
iy += inc_y ;
i++ ;
}
}
}
return(0);
} else { /* vectorized approach for non-zero increments */
if(beta == 0.0){ if(beta == 0.0){
if(alpha == 0.0){//alpha == 0 && beta == 0 if(alpha == 0.0){//alpha == 0 && beta == 0
if(inc_y == 1){ if(inc_y == 1){
@ -381,5 +438,6 @@ int CNAME(BLASLONG n, FLOAT alpha, FLOAT *x, BLASLONG inc_x, FLOAT beta, FLOAT *
} }
} }
return(0); return(0);
}
} }

View File

@ -62,6 +62,82 @@ int CNAME(BLASLONG n, FLOAT alpha_r, FLOAT alpha_i, FLOAT *x, BLASLONG inc_x, FL
stride_x = inc_x * 2 * sizeof(FLOAT); stride_x = inc_x * 2 * sizeof(FLOAT);
stride_y = inc_y * 2 * sizeof(FLOAT); stride_y = inc_y * 2 * sizeof(FLOAT);
if (inc_x == 0 || inc_y == 0) {
FLOAT temp;
BLASLONG inc_x2, inc_y2;
inc_x2 = 2 * inc_x;
inc_y2 = 2 * inc_y;
if ( beta_r == 0.0 && beta_i == 0.0)
{
if ( alpha_r == 0.0 && alpha_i == 0.0 )
{
while(i < n)
{
y[iy] = 0.0 ;
y[iy+1] = 0.0 ;
iy += inc_y2 ;
i++ ;
}
}
else
{
while(i < n)
{
y[iy] = ( alpha_r * x[ix] - alpha_i * x[ix+1] ) ;
y[iy+1] = ( alpha_r * x[ix+1] + alpha_i * x[ix] ) ;
ix += inc_x2 ;
iy += inc_y2 ;
i++ ;
}
}
}
else
{
if ( alpha_r == 0.0 && alpha_i == 0.0 )
{
while(i < n)
{
temp = ( beta_r * y[iy] - beta_i * y[iy+1] ) ;
y[iy+1] = ( beta_r * y[iy+1] + beta_i * y[iy] ) ;
y[iy] = temp;
iy += inc_y2 ;
i++ ;
}
}
else
{
while(i < n)
{
temp = ( alpha_r * x[ix] - alpha_i * x[ix+1] ) + ( beta_r * y[iy] - beta_i * y[iy+1] ) ;
y[iy+1] = ( alpha_r * x[ix+1] + alpha_i * x[ix] ) + ( beta_r * y[iy+1] + beta_i * y[iy] ) ;
y[iy] = temp;
ix += inc_x2 ;
iy += inc_y2 ;
i++ ;
}
}
}
return(0);
} else {
if(beta_r == 0.0 && beta_i == 0.0){ if(beta_r == 0.0 && beta_i == 0.0){
if(alpha_r == 0.0 && alpha_i == 0.0){ if(alpha_r == 0.0 && alpha_i == 0.0){
if(inc_y == 1){ if(inc_y == 1){
@ -191,5 +267,6 @@ int CNAME(BLASLONG n, FLOAT alpha_r, FLOAT alpha_i, FLOAT *x, BLASLONG inc_x, FL
} }
} }
return(0); return(0);
}
} }