diff options
| author | David Chase <drchase@google.com> | 2025-10-06 15:01:03 -0400 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2025-10-09 08:23:39 -0700 |
| commit | b9f3accdcf973ca41069e22e6859b9436801aae5 (patch) | |
| tree | e86ca3e69577c77c2dc70e65202629e95e5435c9 /src/runtime/softfloat64_test.go | |
| parent | 78d75b37992be01326b9bd2666195aaba9bf2ae2 (diff) | |
| download | go-b9f3accdcf973ca41069e22e6859b9436801aae5.tar.xz | |
runtime: adjust softfloat corner cases to match amd64/arm64
This chooses saturating behavior for over/underflow.
Change-Id: I96a33ef73feacdafe8310f893de445060bc1a536
Reviewed-on: https://go-review.googlesource.com/c/go/+/709595
Reviewed-by: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/runtime/softfloat64_test.go')
| -rw-r--r-- | src/runtime/softfloat64_test.go | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/runtime/softfloat64_test.go b/src/runtime/softfloat64_test.go index 3f53e8bc55..233d5e01c0 100644 --- a/src/runtime/softfloat64_test.go +++ b/src/runtime/softfloat64_test.go @@ -28,6 +28,15 @@ func div(x, y float64) float64 { return x / y } func TestFloat64(t *testing.T) { base := []float64{ 0, + 1, + -9223372036854775808, + -9223372036854775808 + 4096, + 18446744073709551615, + 18446744073709551615 + 1, + 18446744073709551615 - 1, + 9223372036854775808 + 4096, + 0.5, + 0.75, math.Copysign(0, -1), -1, 1, @@ -35,6 +44,8 @@ func TestFloat64(t *testing.T) { math.Inf(+1), math.Inf(-1), 0.1, + 0.5, + 0.75, 1.5, 1.9999999999999998, // all 1s mantissa 1.3333333333333333, // 1.010101010101... @@ -70,7 +81,7 @@ func TestFloat64(t *testing.T) { 1e+307, 1e+308, } - all := make([]float64, 200) + all := make([]float64, 250) copy(all, base) for i := len(base); i < len(all); i++ { all[i] = rand.NormFloat64() @@ -82,6 +93,7 @@ func TestFloat64(t *testing.T) { test(t, "*", mul, fop(Fmul64), all) test(t, "/", div, fop(Fdiv64), all) } + } // 64 -hw-> 32 -hw-> 64 @@ -104,6 +116,11 @@ func hwint64(f float64) float64 { return float64(int64(f)) } +// float64 -hw-> uint64 -hw-> float64 +func hwuint64(f float64) float64 { + return float64(uint64(f)) +} + // float64 -hw-> int32 -hw-> float64 func hwint32(f float64) float64 { return float64(int32(f)) @@ -113,13 +130,23 @@ func hwint32(f float64) float64 { func toint64sw(f float64) float64 { i, ok := F64toint(math.Float64bits(f)) if !ok { - // There's no right answer for out of range. + // There's no right answer for NaN. // Match the hardware to pass the test. i = int64(f) } return float64(i) } +func touint64sw(f float64) float64 { + i := F64touint(math.Float64bits(f)) + if f != f { + // There's no right answer for NaN. + // Match the hardware to pass the test. + i = uint64(f) + } + return float64(i) +} + // float64 -hw-> int64 -sw-> float64 func fromint64sw(f float64) float64 { return math.Float64frombits(Fintto64(int64(f))) @@ -150,6 +177,7 @@ func test(t *testing.T, op string, hw, sw func(float64, float64) float64, all [] testu(t, "to32", trunc32, to32sw, h) testu(t, "to64", trunc32, to64sw, h) testu(t, "toint64", hwint64, toint64sw, h) + testu(t, "touint64", hwuint64, touint64sw, h) testu(t, "fromint64", hwint64, fromint64sw, h) testcmp(t, f, h) testcmp(t, h, f) @@ -163,6 +191,7 @@ func testu(t *testing.T, op string, hw, sw func(float64) float64, v float64) { h := hw(v) s := sw(v) if !same(h, s) { + s = sw(v) // debug me err(t, "%s %g = sw %g, hw %g\n", op, v, s, h) } } |
