// 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) } }