diff --git a/kernel/zarch/cscal.c b/kernel/zarch/cscal.c index e623f306b9..1c9f2cda73 100644 --- a/kernel/zarch/cscal.c +++ b/kernel/zarch/cscal.c @@ -210,7 +210,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, BLASLONG n1 = n & -2; if (da_i == 0.0) { - + if (dummy2 == 0) { while (j < n1) { x[i] = 0.0; @@ -230,11 +230,43 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, j++; } + } else { + while (j < n1) { + if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) { + x[i] = NAN; + x[i+1] = NAN; + }else{ + x[i] = 0.0; + x[i + 1] = 0.0; + } + if (isnan(x[i+inc_x]) || isinf(x[i+inc_x]) || isnan(x[i+1+inc_x])) { + x[i + inc_x] = NAN; + x[i + 1 + inc_x] = NAN; + } else { + x[i + inc_x] = 0.0; + x[i + 1 + inc_x] = 0.0; + } + i += 2 * inc_x; + j += 2; + + } + while (j < n) { + if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) { + x[i] = NAN; + x[i+1] = NAN; + }else{ + x[i] = 0.0; + x[i + 1] = 0.0; + } + i += inc_x; + j++; + } + } } else { while (j < n1) { - if (isnan(x[i]) || isinf(x[i])) + if (isnan(x[i]) || isinf(x[i])) temp0 = NAN; else temp0 = -da_i * x[i + 1]; @@ -276,7 +308,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, } else { - if (da_i == 0.0) { + if (da_i == 0.0 && dummy2) { BLASLONG n1 = n & -2; while (j < n1) { @@ -335,12 +367,16 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, alpha[1] = da_i; if (da_r == 0.0) - if (da_i == 0) + if (da_i == 0 && dummy2 == 0) cscal_kernel_16_zero(n1, x); - else + else { +/* if (dummy2 == 0) cscal_kernel_16_zero_r(n1, alpha, x); - else if (da_i == 0) - cscal_kernel_16_zero_i(n1, alpha, x); + else*/ + cscal_kernel_16(n1, da_r, da_i, x); + } +/* else if (da_i == 0 && !isnan(da_r)) + cscal_kernel_16/*_zero_i(n1, alpha, x);*/ else cscal_kernel_16(n1, da_r, da_i, x); @@ -354,7 +390,8 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, float res = 0.0; if (isnan(da_r)) res = da_r; while (j < n) { - + if (dummy2) + if (isnan(x[i])|| isnan(x[i+1])) res=NAN; x[i] = res; x[i + 1] = res; i += 2; @@ -382,7 +419,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, x[i + 1] = da_i * x[i]; else x[i + 1] = NAN; - if (x[i] == x[i]) + if (!isnan(x[i])) x[i] = temp0; i += 2; j++; @@ -398,7 +435,18 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, while (j < n) { temp0 = da_r * x[i]; - x[i + 1] = da_r * x[i + 1]; + if (dummy2) { + if (isnan(x[i])||isinf(x[i]))temp0 = NAN; + if (isnan(x[i+1])||isinf(x[i+1])) + x[i+1] = NAN; + else + x[i+1] = da_r * x[i + 1]; + } else { + if (isnan(x[i])) + x[i + 1] = NAN; + else + x[i + 1] = da_r * x[i + 1]; + } x[i] = temp0; i += 2; j++; @@ -411,7 +459,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, temp0 = da_r * x[i] - da_i * x[i + 1]; x[i + 1] = da_r * x[i + 1] + da_i * x[i]; - x[i] = temp0; + if (!isnan(x[i])) x[i] = temp0; i += 2; j++; diff --git a/kernel/zarch/zscal.c b/kernel/zarch/zscal.c index 36466a6e0a..5111bc4551 100644 --- a/kernel/zarch/zscal.c +++ b/kernel/zarch/zscal.c @@ -208,7 +208,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, BLASLONG n1 = n & -2; if (da_i == 0.0) { - + if (dummy2 == 0) { while (j < n1) { x[i] = 0.0; @@ -228,7 +228,38 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, j++; } - + } else { + while (j < n1) { + if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) { + x[i] = NAN; + x[i+1] = NAN; + } else { + x[i] = 0.0; + x[i+1] = 0.0; + } + if (isnan(x[i+inc_x]) || isinf(x[i+inc_x]) || isnan(x[i+inc_x+1])) { + x[i + inc_x] = NAN; + x[i + inc_x + 1] = NAN; + } else { + x[i + inc_x] = 0.; + x[i + inc_x + 1] = 0.; + } + i += 2 * inc_x; + j += 2; + } + + while (j < n) { + if (isnan(x[i]) || isinf(x[i]) || isnan(x[i+1])) { + x[i] = NAN; + x[i+1] = NAN; + } else { + x[i] = 0.; + x[i+1] = 0.; + } + i += inc_x; + j++; + } + } } else { while (j < n1) { @@ -276,7 +307,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, } else { - if (da_i == 0.0) { + if (da_i == 0.0 && dummy2) { BLASLONG n1 = n & -2; while (j < n1) { @@ -335,12 +366,10 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, alpha[1] = da_i; if (da_r == 0.0) - if (da_i == 0) + if (da_i == 0 && dummy2 == 0) zscal_kernel_8_zero(n1, x); else zscal_kernel_8(n1, da_r, da_i, x); - else if (da_i == 0 && da_r == da_r) - zscal_kernel_8_zero_i(n1, alpha, x); else zscal_kernel_8(n1, da_r, da_i, x); @@ -354,7 +383,8 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, double res= 0.0; if (isnan(da_r)) res = da_r; while (j < n) { - + if (dummy2) + if (isnan(x[i]) || isnan(x[i+1])) res = NAN; x[i] = res; x[i + 1] = res; i += 2; @@ -381,7 +411,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, x[i + 1] = da_i * x[i]; else x[i + 1] = NAN; - if (x[i]==x[i]) + if (!isnan(x[i])) x[i] = temp0; i += 2; j++; @@ -397,8 +427,19 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, while (j < n) { temp0 = da_r * x[i]; - x[i + 1] = da_r * x[i + 1]; - x[i] = temp0; + if (dummy2) { + if (isnan(x[i]) || isinf(x[i])) temp0 = NAN; + if (isnan(x[i + 1]) || isinf(x[i + 1])) + x[i + 1] = NAN; + else + x[i + 1] = da_r * x[i + 1]; + } else { + if (isnan(x[i])) + x[i + 1] = NAN; + else + x[i + 1] = da_r * x[i + 1]; + } + x[i] = temp0; i += 2; j++; @@ -410,7 +451,7 @@ int CNAME(BLASLONG n, BLASLONG dummy0, BLASLONG dummy1, FLOAT da_r, FLOAT da_i, temp0 = da_r * x[i] - da_i * x[i + 1]; x[i + 1] = da_r * x[i + 1] + da_i * x[i]; - x[i] = temp0; + if (!isnan(x[i])) x[i] = temp0; i += 2; j++;