On Tue, Oct 10, 2017 at 12:08:06PM +0000, Visa Hankala wrote: > On Mon, Oct 09, 2017 at 10:39:47PM +0200, Juan Francisco Cantero Hurtado > wrote: > > Marc Feeley (Gambit Scheme) has been helping me with a bug on Gambit on > > Loongson. Apparently the bug is on our side. > > > > I've created this little test based on his code: > > > > #include <stdio.h> > > #include <math.h> > > > > int main() > > { > > double x = 0.5; > > double y = 1074.0; > > printf("x=%.20g y=%.20g pow(x,y)=%.20g\n",x,y,pow(x,y)); > > return 0; > > } > > > > On OpenBSD/amd64, Linux/amd64, Linux/aarch64 and Linux/mips64: > > x=0.5 y=1074 pow(x,y)=4.9406564584124654418e-324 > > > > On OpenBSD/loongson: > > x=0.5 y=1074 pow(x,y)=-4.9406564584124654418e-324 > > > > Is the negative result expected? > > No. On mips64, ldexp(3) seems to use a garbage value when figuring out > the sign of a denormal value. This applies to infinity values as well. > > The patch below should fix the bug. The t3 register contains the binary > representation of the floating-point `x' parameter. I can also make > a regression test for the patch. > > OK?
Works for me. Thanks for the quick fix. > > Index: arch/mips64/gen/ldexp.S > =================================================================== > RCS file: src/lib/libc/arch/mips64/gen/ldexp.S,v > retrieving revision 1.7 > diff -u -p -r1.7 ldexp.S > --- arch/mips64/gen/ldexp.S 27 Oct 2015 05:54:49 -0000 1.7 > +++ arch/mips64/gen/ldexp.S 10 Oct 2017 11:52:56 -0000 > @@ -143,20 +143,20 @@ LEAF(ldexp, 0) > xori t2, 1 > 1: > dmtc1 t2, $f0 # save denormalized result (LSW) > - bge v1, zero, 1f # should result be negative? > + bge t3, zero, 1f # should result be negative? > neg.d $f0, $f0 # negate result > 1: > j ra > 7: > dmtc1 zero, $f0 # result is zero > - beq t0, zero, 1f # is result positive? > + bge t3, zero, 1f # is result positive? > neg.d $f0, $f0 # negate result > 1: > j ra > 8: > dli t1, 0x7ff0000000000000 # result is infinity (MSW) > dmtc1 t1, $f0 > - bge v1, zero, 1f # should result be negative infinity? > + bge t3, zero, 1f # should result be negative infinity? > neg.d $f0, $f0 # result is negative infinity > 1: > add.d $f0, $f0 # cause overflow faults if enabled > -- Juan Francisco Cantero Hurtado http://juanfra.info