mirror of
https://github.com/golang/go
synced 2024-11-14 17:30:29 -07:00
120 lines
2.2 KiB
Go
120 lines
2.2 KiB
Go
|
// run
|
||
|
|
||
|
// Copyright 2021 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 main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math"
|
||
|
)
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmplt(a, b float64, x uint64) uint64 {
|
||
|
if a < b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmple(a, b float64, x uint64) uint64 {
|
||
|
if a <= b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmpgt(a, b float64, x uint64) uint64 {
|
||
|
if a > b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmpge(a, b float64, x uint64) uint64 {
|
||
|
if a >= b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmpeq(a, b float64, x uint64) uint64 {
|
||
|
if a == b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
//go:noinline
|
||
|
func fcmpne(a, b float64, x uint64) uint64 {
|
||
|
if a != b {
|
||
|
x = 0
|
||
|
}
|
||
|
return x
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
type fn func(a, b float64, x uint64) uint64
|
||
|
|
||
|
type testCase struct {
|
||
|
f fn
|
||
|
a, b float64
|
||
|
x, want uint64
|
||
|
}
|
||
|
NaN := math.NaN()
|
||
|
for _, t := range []testCase{
|
||
|
{fcmplt, 1.0, 1.0, 123, 123},
|
||
|
{fcmple, 1.0, 1.0, 123, 0},
|
||
|
{fcmpgt, 1.0, 1.0, 123, 123},
|
||
|
{fcmpge, 1.0, 1.0, 123, 0},
|
||
|
{fcmpeq, 1.0, 1.0, 123, 0},
|
||
|
{fcmpne, 1.0, 1.0, 123, 123},
|
||
|
|
||
|
{fcmplt, 1.0, 2.0, 123, 0},
|
||
|
{fcmple, 1.0, 2.0, 123, 0},
|
||
|
{fcmpgt, 1.0, 2.0, 123, 123},
|
||
|
{fcmpge, 1.0, 2.0, 123, 123},
|
||
|
{fcmpeq, 1.0, 2.0, 123, 123},
|
||
|
{fcmpne, 1.0, 2.0, 123, 0},
|
||
|
|
||
|
{fcmplt, 2.0, 1.0, 123, 123},
|
||
|
{fcmple, 2.0, 1.0, 123, 123},
|
||
|
{fcmpgt, 2.0, 1.0, 123, 0},
|
||
|
{fcmpge, 2.0, 1.0, 123, 0},
|
||
|
{fcmpeq, 2.0, 1.0, 123, 123},
|
||
|
{fcmpne, 2.0, 1.0, 123, 0},
|
||
|
|
||
|
{fcmplt, 1.0, NaN, 123, 123},
|
||
|
{fcmple, 1.0, NaN, 123, 123},
|
||
|
{fcmpgt, 1.0, NaN, 123, 123},
|
||
|
{fcmpge, 1.0, NaN, 123, 123},
|
||
|
{fcmpeq, 1.0, NaN, 123, 123},
|
||
|
{fcmpne, 1.0, NaN, 123, 0},
|
||
|
|
||
|
{fcmplt, NaN, 1.0, 123, 123},
|
||
|
{fcmple, NaN, 1.0, 123, 123},
|
||
|
{fcmpgt, NaN, 1.0, 123, 123},
|
||
|
{fcmpge, NaN, 1.0, 123, 123},
|
||
|
{fcmpeq, NaN, 1.0, 123, 123},
|
||
|
{fcmpne, NaN, 1.0, 123, 0},
|
||
|
|
||
|
{fcmplt, NaN, NaN, 123, 123},
|
||
|
{fcmple, NaN, NaN, 123, 123},
|
||
|
{fcmpgt, NaN, NaN, 123, 123},
|
||
|
{fcmpge, NaN, NaN, 123, 123},
|
||
|
{fcmpeq, NaN, NaN, 123, 123},
|
||
|
{fcmpne, NaN, NaN, 123, 0},
|
||
|
} {
|
||
|
got := t.f(t.a, t.b, t.x)
|
||
|
if got != t.want {
|
||
|
panic(fmt.Sprintf("want %v, got %v", t.want, got))
|
||
|
}
|
||
|
}
|
||
|
}
|