From 6c118b7977fbf0fd6454bb4ea2fdeefaa843aa9b Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 24 Jul 2022 17:42:31 +0200 Subject: [PATCH] Fix DNRM2 returning INF instead of zero due to intermediate overflow --- kernel/power/nrm2.S | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/kernel/power/nrm2.S b/kernel/power/nrm2.S index bf8433001..d9e1f4e9a 100644 --- a/kernel/power/nrm2.S +++ b/kernel/power/nrm2.S @@ -50,8 +50,8 @@ #define FZERO 144(SP) #define FONE 148(SP) #define FMAX 152(SP) - -#define STACKSIZE 160 +#define FINF 160(SP) +#define STACKSIZE 168 PROLOGUE PROFCODE @@ -87,6 +87,16 @@ stw r10, FZERO stw r11, FONE stw r12, FMAX + +#ifdef DOUBLE + lis r12, 0x7ff0 + ori r12, r12, 0x0 + sldi r12, r12, 32 + oris r12, r12,0x0 + ori r12, r12, 0x0 + std r12, FINF +#endif + stw r10, 4 + FMAX lfs f1, FZERO @@ -334,10 +344,17 @@ LL(100): lfs f0, FONE fcmpu cr0, f1, f31 +nop beq- cr0, LL(9999) - fdiv f30, f0, f31 +#ifdef DOUBLE + lfd f1, FINF + fcmpu cr0, f1, f30 + lfs f1, FZERO + beq- cr0, LL(9999) +#endif + fmr f0, f1 fmr f2, f1 fmr f3, f1 @@ -712,9 +729,16 @@ LL(1999): fcmpu cr0, f1, f31 beq- cr0, LL(9999) - + fdiv f30, f0, f31 +#ifdef DOUBLE + lfd f1, FINF + fcmpu cr0, f1, f30 + lfs f1, FZERO + beq- cr0, LL(9999) +#endif + fmr f0, f1 fmr f2, f1 fmr f3, f1 @@ -875,6 +899,7 @@ LL(2170): fadd f0, f0, f4 fsqrt f0, f0 + fmul f1, f31, f0 .align 4