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