aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2015-10-20 14:45:36 -0700
committerRobert Griesemer <gri@golang.org>2015-10-20 22:11:11 +0000
commit76285213b8a453ed0825d98e9a6bb3e044d20022 (patch)
treed90d455bcb6811eb25c4eef257c867207d789290 /src
parentff85f86877e3639f9a78b5dca27021c33b8cf85c (diff)
downloadgo-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.go24
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 {