mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: avoid more float32 <-> float64 conversions in compiler
Use the new custom truncate/extension code when storing or extracting float32 values from AuxInts to avoid the value being changed by the host platform's floating point conversion instructions (e.g. sNaN -> qNaN). Updates #27516. Change-Id: Id39650f1431ef74af088c895cf4738ea5fa87974 Reviewed-on: https://go-review.googlesource.com/134855 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
859cf7fc0f
commit
2db1a7f929
12 changed files with 212 additions and 204 deletions
|
|
@ -450,21 +450,26 @@ func extend32Fto64F(f float32) float64 {
|
|||
return math.Float64frombits(r)
|
||||
}
|
||||
|
||||
// i2f is used in rules for converting from an AuxInt to a float.
|
||||
func i2f(i int64) float64 {
|
||||
return math.Float64frombits(uint64(i))
|
||||
}
|
||||
|
||||
// i2f32 is used in rules for converting from an AuxInt to a float32.
|
||||
func i2f32(i int64) float32 {
|
||||
return float32(math.Float64frombits(uint64(i)))
|
||||
}
|
||||
|
||||
// f2i is used in the rules for storing a float in AuxInt.
|
||||
func f2i(f float64) int64 {
|
||||
// auxFrom64F encodes a float64 value so it can be stored in an AuxInt.
|
||||
func auxFrom64F(f float64) int64 {
|
||||
return int64(math.Float64bits(f))
|
||||
}
|
||||
|
||||
// auxFrom32F encodes a float32 value so it can be stored in an AuxInt.
|
||||
func auxFrom32F(f float32) int64 {
|
||||
return int64(math.Float64bits(extend32Fto64F(f)))
|
||||
}
|
||||
|
||||
// auxTo32F decodes a float32 from the AuxInt value provided.
|
||||
func auxTo32F(i int64) float32 {
|
||||
return truncate64Fto32F(math.Float64frombits(uint64(i)))
|
||||
}
|
||||
|
||||
// auxTo64F decodes a float64 from the AuxInt value provided.
|
||||
func auxTo64F(i int64) float64 {
|
||||
return math.Float64frombits(uint64(i))
|
||||
}
|
||||
|
||||
// uaddOvf returns true if unsigned a+b would overflow.
|
||||
func uaddOvf(a, b int64) bool {
|
||||
return uint64(a)+uint64(b) < uint64(a)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue