From: Ken Thompson Date: Wed, 10 Dec 2008 22:17:24 +0000 (-0800) Subject: bug120 X-Git-Tag: weekly.2009-11-06~2536 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5f1a3be9dd1f6c0bda0993351effffaec0ce49ad;p=gostls13.git bug120 R=r OCL=20921 CL=20921 --- diff --git a/src/cmd/gc/mparith3.c b/src/cmd/gc/mparith3.c index 7098ba68b2..8e3da7a4b3 100644 --- a/src/cmd/gc/mparith3.c +++ b/src/cmd/gc/mparith3.c @@ -161,7 +161,7 @@ double mpgetflt(Mpflt *a) { int s, i; - uvlong v; + uvlong v, vm; double f; if(a->val.ovf) @@ -186,22 +186,31 @@ mpgetflt(Mpflt *a) // independently or in the 6g half of the compiler // pick up the mantissa in a uvlong - s = 63; + s = 53; v = 0; for(i=Mpnorm-1; s>=Mpscale; i--) { v = (v<val.a[i]; s -= Mpscale; } + vm = v; + if(s > 0) + vm = (vm<val.a[i]>>(Mpscale-s)); + + // continue with 64 more bits + s += 64; + for(; s>=Mpscale; i--) { + v = (v<val.a[i]; + s -= Mpscale; + } if(s > 0) v = (v<val.a[i]>>(Mpscale-s)); - // 63 bits of mantissa being rounded to 53 - // should do this in multi precision - if((v&0x3ffULL) != 0x200ULL || (v&0x400) != 0) - v += 0x200ULL; // round toward even +//print("vm=%.16llux v=%.16llux\n", vm, v); + // round toward even + if(v != (1ULL<<63) || (vm&1ULL) != 0) + vm += v>>63; - v >>= 10; - f = (double)(v); + f = (double)(vm); f = ldexp(f, Mpnorm*Mpscale + a->exp - 53); if(a->val.neg)