]> Cypherpunks repositories - gostls13.git/commitdiff
8g: fix conversion from float to uint64
authorAnthony Martin <ality@pbrane.org>
Tue, 17 May 2011 02:14:56 +0000 (22:14 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 17 May 2011 02:14:56 +0000 (22:14 -0400)
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

src/cmd/8g/gsubr.c
test/fixedbugs/bug341.go [new file with mode: 0644]

index e3f239d60511852ea0c3461a75cb1de17b044368..5ad35fdce7289fceeef9f9a7f5fbab4b57c5f1c5 100644 (file)
@@ -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 (file)
index 0000000..8ee52e1
--- /dev/null
@@ -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]
+*/