mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
The frontend rewriting lowers them to runtime calls on 386. It matches explicitly uint32, but missed uint. Fixes #16738. Change-Id: Iece7a45edf74615baca052a53273c208f057636d Reviewed-on: https://go-review.googlesource.com/27085 Run-TryBot: Cherry Zhang <cherryyz@google.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
135 lines
2.6 KiB
Go
135 lines
2.6 KiB
Go
// Copyright 2016 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 gc
|
|
|
|
import "testing"
|
|
|
|
// For GO386=387, make sure fucomi* opcodes are not used
|
|
// for comparison operations.
|
|
// Note that this test will fail only on a Pentium MMX
|
|
// processor (with GOARCH=386 GO386=387), as it just runs
|
|
// some code and looks for an unimplemented instruction fault.
|
|
|
|
//go:noinline
|
|
func compare1(a, b float64) bool {
|
|
return a < b
|
|
}
|
|
|
|
//go:noinline
|
|
func compare2(a, b float32) bool {
|
|
return a < b
|
|
}
|
|
|
|
func TestFloatCompare(t *testing.T) {
|
|
if !compare1(3, 5) {
|
|
t.Errorf("compare1 returned false")
|
|
}
|
|
if !compare2(3, 5) {
|
|
t.Errorf("compare2 returned false")
|
|
}
|
|
}
|
|
|
|
// For GO386=387, make sure fucomi* opcodes are not used
|
|
// for float->int conversions.
|
|
|
|
//go:noinline
|
|
func cvt1(a float64) uint64 {
|
|
return uint64(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt2(a float64) uint32 {
|
|
return uint32(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt3(a float32) uint64 {
|
|
return uint64(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt4(a float32) uint32 {
|
|
return uint32(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt5(a float64) int64 {
|
|
return int64(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt6(a float64) int32 {
|
|
return int32(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt7(a float32) int64 {
|
|
return int64(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt8(a float32) int32 {
|
|
return int32(a)
|
|
}
|
|
|
|
// make sure to cover int, uint cases (issue #16738)
|
|
//go:noinline
|
|
func cvt9(a float64) int {
|
|
return int(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt10(a float64) uint {
|
|
return uint(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt11(a float32) int {
|
|
return int(a)
|
|
}
|
|
|
|
//go:noinline
|
|
func cvt12(a float32) uint {
|
|
return uint(a)
|
|
}
|
|
|
|
func TestFloatConvert(t *testing.T) {
|
|
if got := cvt1(3.5); got != 3 {
|
|
t.Errorf("cvt1 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt2(3.5); got != 3 {
|
|
t.Errorf("cvt2 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt3(3.5); got != 3 {
|
|
t.Errorf("cvt3 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt4(3.5); got != 3 {
|
|
t.Errorf("cvt4 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt5(3.5); got != 3 {
|
|
t.Errorf("cvt5 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt6(3.5); got != 3 {
|
|
t.Errorf("cvt6 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt7(3.5); got != 3 {
|
|
t.Errorf("cvt7 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt8(3.5); got != 3 {
|
|
t.Errorf("cvt8 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt9(3.5); got != 3 {
|
|
t.Errorf("cvt9 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt10(3.5); got != 3 {
|
|
t.Errorf("cvt10 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt11(3.5); got != 3 {
|
|
t.Errorf("cvt11 got %d, wanted 3", got)
|
|
}
|
|
if got := cvt12(3.5); got != 3 {
|
|
t.Errorf("cvt12 got %d, wanted 3", got)
|
|
}
|
|
}
|