aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Martin <ality@pbrane.org>2011-05-16 22:14:56 -0400
committerRuss Cox <rsc@golang.org>2011-05-16 22:14:56 -0400
commitf570d9d7657edcccb52b2ec9a55cb90a28602d57 (patch)
tree694571bbfa4f67fc2a829f8267c86d58622b1eeb
parentde7c28fe7689fccbf7b415eb5f5defb8b43ba390 (diff)
downloadgo-f570d9d7657edcccb52b2ec9a55cb90a28602d57.tar.gz
go-f570d9d7657edcccb52b2ec9a55cb90a28602d57.zip
8g: fix conversion from float to uint64
The code for converting negative floats was incorrectly loading an FP control word from the stack without ever having stored it there. Thanks to Lars Pensjö for reporting this bug. R=golang-dev, rsc CC=golang-dev https://golang.org/cl/4515091
-rw-r--r--src/cmd/8g/gsubr.c4
-rw-r--r--test/fixedbugs/bug341.go22
2 files changed, 24 insertions, 2 deletions
diff --git a/src/cmd/8g/gsubr.c b/src/cmd/8g/gsubr.c
index e3f239d605..5ad35fdce7 100644
--- a/src/cmd/8g/gsubr.c
+++ b/src/cmd/8g/gsubr.c
@@ -1429,11 +1429,11 @@ gmove(Node *f, Node *t)
split64(t, &tlo, &thi);
gins(AXORL, ncon(0x80000000), &thi); // + 2^63
patch(p3, pc);
- patch(p1, pc);
splitclean();
-
// restore rounding mode
gins(AFLDCW, &t1, N);
+
+ patch(p1, pc);
return;
/*
diff --git a/test/fixedbugs/bug341.go b/test/fixedbugs/bug341.go
new file mode 100644
index 0000000000..8ee52e1ef0
--- /dev/null
+++ b/test/fixedbugs/bug341.go
@@ -0,0 +1,22 @@
+// $G $D/$F.go && $L $F.$A && ./$A.out || echo BUG: bug341
+
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Used to panic because 8g was generating incorrect
+// code for converting a negative float to a uint64.
+
+package main
+
+func main() {
+ var x float32 = -2.5
+
+ _ = uint64(x)
+ _ = float32(0)
+}
+/*
+panic: runtime error: floating point error
+
+[signal 0x8 code=0x6 addr=0x8048c64 pc=0x8048c64]
+*/