diff options
| author | Robert Griesemer <gri@golang.org> | 2015-10-20 14:45:36 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2015-10-20 22:11:11 +0000 |
| commit | 76285213b8a453ed0825d98e9a6bb3e044d20022 (patch) | |
| tree | d90d455bcb6811eb25c4eef257c867207d789290 /src | |
| parent | ff85f86877e3639f9a78b5dca27021c33b8cf85c (diff) | |
| download | go-76285213b8a453ed0825d98e9a6bb3e044d20022.tar.xz | |
cmd/compile/internal/gc: there are no -0 floating-point constants
Fixes #12577.
Change-Id: Id469cd92f5f9436b0ef948ee1a252ed1842bc7aa
Reviewed-on: https://go-review.googlesource.com/16133
Run-TryBot: Robert Griesemer <gri@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/gc/mparith3.go | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/cmd/compile/internal/gc/mparith3.go b/src/cmd/compile/internal/gc/mparith3.go index f91a64b42d..4aa283fe33 100644 --- a/src/cmd/compile/internal/gc/mparith3.go +++ b/src/cmd/compile/internal/gc/mparith3.go @@ -113,7 +113,7 @@ func mpgetflt(a *Mpflt) float64 { Yyerror("mpgetflt ovf") } - return x + return x + 0 // avoid -0 (should not be needed, but be conservative) } func mpgetflt32(a *Mpflt) float64 { @@ -125,7 +125,7 @@ func mpgetflt32(a *Mpflt) float64 { Yyerror("mpgetflt32 ovf") } - return x + return x + 0 // avoid -0 (should not be needed, but be conservative) } func Mpmovecflt(a *Mpflt, c float64) { @@ -133,6 +133,10 @@ func Mpmovecflt(a *Mpflt, c float64) { fmt.Printf("\nconst %g", c) } + // convert -0 to 0 + if c == 0 { + c = 0 + } a.Val.SetFloat64(c) if Mpdebug { @@ -141,7 +145,10 @@ func Mpmovecflt(a *Mpflt, c float64) { } func mpnegflt(a *Mpflt) { - a.Val.Neg(&a.Val) + // avoid -0 + if a.Val.Sign() != 0 { + a.Val.Neg(&a.Val) + } } // @@ -163,15 +170,20 @@ func mpatoflt(a *Mpflt, as string) { // - decimal point and binary point in constant // TODO(gri) use different conversion function or check separately Yyerror("malformed constant: %s", as) - a.Val.SetUint64(0) + a.Val.SetFloat64(0) return } if f.IsInf() { Yyerror("constant too large: %s", as) - a.Val.SetUint64(0) + a.Val.SetFloat64(0) return } + + // -0 becomes 0 + if f.Sign() == 0 && f.Signbit() { + a.Val.SetFloat64(0) + } } func (f *Mpflt) String() string { @@ -188,7 +200,7 @@ func Fconv(fvp *Mpflt, flag int) string { // determine sign f := &fvp.Val var sign string - if fvp.Val.Signbit() { + if f.Sign() < 0 { sign = "-" f = new(big.Float).Abs(f) } else if flag&obj.FmtSign != 0 { |
