diff --git a/kernel/riscv64/KERNEL.RISCV64_ZVL256B b/kernel/riscv64/KERNEL.RISCV64_ZVL256B index c96fac6fa3..6fc31a5fb8 100644 --- a/kernel/riscv64/KERNEL.RISCV64_ZVL256B +++ b/kernel/riscv64/KERNEL.RISCV64_ZVL256B @@ -56,8 +56,8 @@ CDOTKERNEL = zdot_vector.c ZDOTKERNEL = zdot_vector.c DSDOTKERNEL = ../generic/dot.c -SNRM2KERNEL = nrm2_vector.c -DNRM2KERNEL = nrm2_vector.c +SNRM2KERNEL = nrm2_rvv.c +DNRM2KERNEL = nrm2_rvv.c CNRM2KERNEL = znrm2_vector.c ZNRM2KERNEL = znrm2_vector.c diff --git a/kernel/riscv64/nrm2_rvv.c b/kernel/riscv64/nrm2_rvv.c index 472b1148eb..7009630da2 100644 --- a/kernel/riscv64/nrm2_rvv.c +++ b/kernel/riscv64/nrm2_rvv.c @@ -244,7 +244,15 @@ FLOAT CNAME(BLASLONG n, FLOAT *x, BLASLONG inc_x) i += inc_x; } } - return(scale * sqrt(ssq)); + FLOAT norm = scale * sqrt(ssq); + if (inc_x > 0 && isnan(norm)) { + // An infinite element makes the scaled update compute inf/inf = NaN. The norm is +Inf + // then, unless the input itself contains a NaN. + for (i = 0; i < n; i++) + if (isnan(x[i * inc_x])) return x[i * inc_x]; + return INFINITY; + } + return norm; }