mirror of
https://github.com/golang/go
synced 2024-11-21 21:14:47 -07:00
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
This commit is contained in:
parent
de7c28fe76
commit
f570d9d765
@ -1429,11 +1429,11 @@ gmove(Node *f, Node *t)
|
|||||||
split64(t, &tlo, &thi);
|
split64(t, &tlo, &thi);
|
||||||
gins(AXORL, ncon(0x80000000), &thi); // + 2^63
|
gins(AXORL, ncon(0x80000000), &thi); // + 2^63
|
||||||
patch(p3, pc);
|
patch(p3, pc);
|
||||||
patch(p1, pc);
|
|
||||||
splitclean();
|
splitclean();
|
||||||
|
|
||||||
// restore rounding mode
|
// restore rounding mode
|
||||||
gins(AFLDCW, &t1, N);
|
gins(AFLDCW, &t1, N);
|
||||||
|
|
||||||
|
patch(p1, pc);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
22
test/fixedbugs/bug341.go
Normal file
22
test/fixedbugs/bug341.go
Normal file
@ -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]
|
||||||
|
*/
|
Loading…
Reference in New Issue
Block a user