129 lines
3.0 KiB
Go
129 lines
3.0 KiB
Go
// Copyright 2020 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.
|
|
|
|
package runtime_test
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
var res int64
|
|
var ures uint64
|
|
|
|
func TestFloatTruncation(t *testing.T) {
|
|
testdata := []struct {
|
|
input float64
|
|
convInt64 int64
|
|
convUInt64 uint64
|
|
overflow bool
|
|
}{
|
|
// max +- 1
|
|
{
|
|
input: 0x7fffffffffffffff,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
// For out-of-bounds conversion, the result is implementation-dependent.
|
|
// This test verifies the implementation of wasm architecture.
|
|
{
|
|
input: 0x8000000000000000,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: 0x7ffffffffffffffe,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
// neg max +- 1
|
|
{
|
|
input: -0x8000000000000000,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: -0x8000000000000001,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: -0x7fffffffffffffff,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
// trunc point +- 1
|
|
{
|
|
input: 0x7ffffffffffffdff,
|
|
convInt64: 0x7ffffffffffffc00,
|
|
convUInt64: 0x7ffffffffffffc00,
|
|
},
|
|
{
|
|
input: 0x7ffffffffffffe00,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: 0x7ffffffffffffdfe,
|
|
convInt64: 0x7ffffffffffffc00,
|
|
convUInt64: 0x7ffffffffffffc00,
|
|
},
|
|
// neg trunc point +- 1
|
|
{
|
|
input: -0x7ffffffffffffdff,
|
|
convInt64: -0x7ffffffffffffc00,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: -0x7ffffffffffffe00,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: -0x7ffffffffffffdfe,
|
|
convInt64: -0x7ffffffffffffc00,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
// umax +- 1
|
|
{
|
|
input: 0xffffffffffffffff,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: 0x10000000000000000,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: 0xfffffffffffffffe,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
// umax trunc +- 1
|
|
{
|
|
input: 0xfffffffffffffbff,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0xfffffffffffff800,
|
|
},
|
|
{
|
|
input: 0xfffffffffffffc00,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0x8000000000000000,
|
|
},
|
|
{
|
|
input: 0xfffffffffffffbfe,
|
|
convInt64: -0x8000000000000000,
|
|
convUInt64: 0xfffffffffffff800,
|
|
},
|
|
}
|
|
for _, item := range testdata {
|
|
if got, want := int64(item.input), item.convInt64; got != want {
|
|
t.Errorf("int64(%f): got %x, want %x", item.input, got, want)
|
|
}
|
|
if got, want := uint64(item.input), item.convUInt64; got != want {
|
|
t.Errorf("uint64(%f): got %x, want %x", item.input, got, want)
|
|
}
|
|
}
|
|
}
|